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