Skip to content

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

Description

@kingkingkingson

问题描述

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;
    }

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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