在公告处 写入XSS 前台直接弹窗(鸡肋 谁会在自己的公告上写XSS)
/ssm/blog/controller/admin/BackNoticeController.java
这个更新 里面并没有对XSS防御
查看updateNotice
方法
直接到Mapper中了 直接更新到数据库里了
看看前台显示的数据有什么处理
/ssm/blog/controller/home/NoticeController.java
发现这里从getNoticeById
获取公告 跟进一下
依旧是直接从数据库中取出来。
用户在前端评论
这里在后台查看这个评论
如果保存的话
会直接弹窗
我们查看一下源码
/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 而且在编辑这个友链请求的时候 也有一个弹窗
这里去源码处简单分析一下
/ssm/blog/controller/admin/BackLinkController.java
可以看到确实对XSS没有任何的防范,查看linkService.listLink
没有处理
发现linkList()方法只是返回一个ModelAndView
类型的对象
并没有审计的到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