Skip to content

RestApiControllerautoLink接口中是否疑似存在权限不足漏洞 #40

@goldthree-shit

Description

@goldthree-shit

问题描述

RestLinkController的add方法中,通过@RequiresPermissions("link:add")进行权限校验,同时存在linkService.insert(link);方法调用,表示插入链接。然而在RestApiControllerautoLink方法中,通过sysLinkService.autoLink(link);方法,也调用了linkService.insert(link);的方法。但是RestApiControllerautoLink并不存在任何类似的权限检查。攻击者是否可能通过RestApiControllerautoLink接口,绕过RestLinkController的add的权限检查,插入链接呢。

相关代码片段

  • RestLinkController的add
    @RequiresPermissions("link:add") // 存在权限保护
    @PostMapping(value = "/add")
    @BussinessLog("添加友情链接")
    public ResponseVO add(Link link) {
        link.setSource(LinkSourceEnum.ADMIN);
        if (!RegexUtils.isUrl(link.getUrl())) {
            throw new ZhydLinkException("链接地址无效!");
        }
        linkService.insert(link); // 调用了insert插入链接
        mailService.send(link, TemplateKeyEnum.TM_LINKS);
        return ResultUtil.success("成功");
    }
  • RestApiControllerautoLink
    @PostMapping("/autoLink")
    @BussinessLog(value = "自助申请友链", platform = PlatformEnum.WEB)
    public ResponseVO autoLink(@Validated Link link, BindingResult bindingResult) {
        log.info("申请友情链接......");
        log.info(JSON.toJSONString(link));
        if (bindingResult.hasErrors()) {
            return ResultUtil.error(bindingResult.getFieldError().getDefaultMessage());
        }
        try {
            sysLinkService.autoLink(link); // 通过这里也调用了insert方法插入链接
        } catch (ZhydLinkException e) {
            log.error("客户端自助申请友链发生异常", e);
            return ResultUtil.error(e.getMessage());
        }
        return ResultUtil.success("已成功添加友链,祝您生活愉快!");
    }


    @Override
    @RedisCache(flush = true)
    public boolean autoLink(Link link) throws ZhydLinkException {
        String url = link.getUrl();
        if(StringUtils.isEmpty(url)) {
            throw new ZhydLinkException("链接地址为空!");
        }
        if(!RegexUtils.isUrl(url)) {
            throw new ZhydLinkException("链接地址无效!");
        }
        Link bo = getOneByUrl(url);
        if (bo != null) {
            throw new ZhydLinkException("本站已经添加过贵站的链接!");
        }
        Map config = configService.getConfigs();
        String domain = (String) config.get(ConfigKeyEnum.DOMAIN.getKey());
        if (!(LinksUtil.hasLinkByHtml(url, domain))
                && !LinksUtil.hasLinkByChinaz(url, domain)) {
            throw new ZhydLinkException("贵站暂未添加本站友情链接!请先添加本站友链后重新提交申请!");
        }

        link.setSource(LinkSourceEnum.AUTOMATIC);
        link.setStatus(true);
        if (!StringUtils.isEmpty(link.getEmail())) {
            link.setEmail(HtmlUtil.html2Text(link.getEmail()));
        }
        if (!StringUtils.isEmpty(link.getFavicon())) {
            link.setFavicon(HtmlUtil.html2Text(link.getFavicon()));
        }
        if (!StringUtils.isEmpty(link.getName())) {
            link.setName(HtmlUtil.html2Text(link.getName()));
        }
        if (!StringUtils.isEmpty(link.getUrl())) {
            link.setUrl(HtmlUtil.html2Text(link.getUrl()));
        }
        if (!StringUtils.isEmpty(link.getDescription())) {
            link.setDescription(HtmlUtil.html2Text(link.getDescription()));
        }
        this.insert(link);
        log.info("友联自动申请成功,开始发送邮件通知...");
        mailService.send(link, TemplateKeyEnum.TM_LINKS);
        return true;
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions