对某blog系统的审计
2023-1-15 13:24:9 Author: xz.aliyun.com(查看原文) 阅读量:10 收藏

XSS

公告处XSS

在公告处 写入XSS 前台直接弹窗(鸡肋 谁会在自己的公告上写XSS)
/ssm/blog/controller/admin/BackNoticeController.java

这个更新 里面并没有对XSS防御
查看updateNotice方法

直接到Mapper中了 直接更新到数据库里了
看看前台显示的数据有什么处理
/ssm/blog/controller/home/NoticeController.java

发现这里从getNoticeById获取公告 跟进一下

依旧是直接从数据库中取出来。

评论处XSS

用户在前端评论

这里在后台查看这个评论

如果保存的话

会直接弹窗
我们查看一下源码
/ssm/blog/controller/home/CommentController.java

@Controller
@RestController
public class CommentController {
    @Autowired
    private CommentService commentService;

    @Autowired
    private ArticleService articleService;

    @RequestMapping(value = "/comment", method = {RequestMethod.POST})
    public JsonResult insertComment(HttpServletRequest request, Comment comment, HttpSession session) {
        User user = (User) session.getAttribute("user");
        if (user == null) {
            return new JsonResult().fail("请先登录");
        }
        Article article = articleService.getArticleByStatusAndId(ArticleStatus.PUBLISH.getValue(), comment.getCommentArticleId());
        if (article == null) {
            return new JsonResult().fail("文章不存在");
        }
        comment.setCommentUserId(user.getUserId());
        comment.setCommentCreateTime(new Date());
        comment.setCommentIp(MyUtils.getIpAddr(request));
        if (Objects.equals(user.getUserId(), article.getArticleUserId())) {
            comment.setCommentRole(Role.OWNER.getValue());
        } else {
            comment.setCommentRole(Role.VISITOR.getValue());
        }
        comment.setCommentAuthorAvatar(user.getUserAvatar());

        //过滤字符,防止XSS攻击
        comment.setCommentContent(HtmlUtil.escape(comment.getCommentContent()));

        comment.setCommentAuthorName(user.getUserNickname());
        comment.setCommentAuthorEmail(user.getUserEmail());
        comment.setCommentAuthorUrl(user.getUserUrl());
        try {
            commentService.insertComment(comment);
            //更新文章的评论数
            articleService.updateCommentCount(article.getArticleId());
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResult().fail();
        }
        return new JsonResult().ok();
    }


}

可以看到对于XSS这里只有使用HtmlUtil.escape用来防范XSS攻击
这里直接写payload直接绕过即可

添加友链处XSS

在前台友链申请 后台会出现XSS

查看一下 这里是两个弹窗 编辑一下 看看 哪个地方导致的XSS

发现名称和联系方式 均可导致XSS 而且在编辑这个友链请求的时候 也有一个弹窗
这里去源码处简单分析一下
/ssm/blog/controller/admin/BackLinkController.java

可以看到确实对XSS没有任何的防范,查看linkService.listLink

没有处理

发现linkList()方法只是返回一个ModelAndView类型的对象

SQL注入

并没有审计的到sql注入的成果
在Mapper的XML文件中 并没有发现有拼接参数的痕迹 全部都是#{}的预编译

文件上传

这里文件上传 只允许上传.bmp.jpg.jpeg.png.gif.pdf.doc.zip.rar.gz这些个后缀
看看代码
/ssm/blog/controller/admin/UploadFileController.java
下面主要放对后缀及逆行判断的地方

public class UploadFileController {

    /**
     * 文件保存目录,物理路径
     */
//    public final String rootPath = "/Users/liuyanzhao/Documents/uploads";
    public final String rootPath = "D:\\uploads";

    public final String allowSuffix = ".bmp.jpg.jpeg.png.gif.pdf.doc.zip.rar.gz";

    /**
     * 上传文件
     *
     * @param file
     * @return
     * @throws IOException
     */
    @RequestMapping(value = "/img", method = RequestMethod.POST)
    public JsonResult uploadFile(@RequestParam("file") MultipartFile file) {

        //文件后缀过滤,只允许部分后缀
        String filename = file.getOriginalFilename();
        //文件名,如spring
        String name = filename.substring(0, filename.indexOf("."));
        //文件后缀,如.jpeg
        String suffix = filename.substring(filename.lastIndexOf("."));

        if (allowSuffix.indexOf(suffix) == -1) {
            return new JsonResult().fail("不允许上传该后缀的文件!");
        }

我挖洞挖的少,思路放不开来
这里传shell 感觉有点玄乎,但是K1115h0t师傅说可以上传个PDF整个存储XSS水个洞,尝试一下

这里前端直接传会有限制 ,改后缀抓包再改回来

上传成功 去访问头像
可能是我环境有问题吧

以上问题均已提交issue


文章来源: https://xz.aliyun.com/t/12043
如有侵权请联系:admin#unsafe.sh