审计XSS的思路大多数都是先锁定评论区,有些情况下会被页面进行过滤或者转义,但仍可以通过文件包含达到触发XSS的目的。
输入XSS语句,并未直接触发弹框。
抓取请求包,访问的接口为”POST /comment_submit”
在代码中全局搜索字符串”/comment_submit”
该接口的实现代码是控制器类CommentController中的方法submit。而submit方法未对评论内容text进行参数校验以及过滤,就将Comment对象属性text的值赋值为变量text的值。第205行的CommentService.save接口的实现类对象的save方法调用Comment对象。
对接口CommentService的实现类CommentServiceImpl的save方法进行审计
该方法调用了“CommentDao接口的实现类的对象”的save方法,发现直接将Comment对象存进了数据库,为XSS漏洞的触发埋下了隐患。
可以看到数据库中确实存入了XSS,且没有被转义或过滤。
但事实也如开头介绍,前端并未进行弹框。
查看“pom.xml”,可知采用了模板引擎“Freemarker”
在jspxcms官网的相关文档中查看到Freemarker的转义相关的说明文档。
在D:\Code\JavaCode\jspxcms-9.0.0-release-src\src\main\webapp\template\1\default\info_news.html中发现了转义的写法。
通过分析可知info页面做了转义输出,阻止了XSS漏洞的触发。
但在D:\Code\JavaCode\jspxcms-9.0.0-release-src\src\main\webapp\template\1\default\sys_member_space_comment.html未发现转义的防护。
在源码中搜索sys_member_space_comment.html,发现sys_member_space.html包含了sys_member_space_comment.html。
在sys_member_space.html中找到关键代码,dang HTTP请求参数type的值等于comment时,就会动态引用sys_member_comment.html文件
继续寻找sys_member_space.html,发现其控制器类常量值SPACE_TEMPLATE就是sys_member_space.html
接着在源码中搜索常量SPACE_TEMPLATE
可知接口“GET /space/{id}”使用了模板,且参数id可控
输入http://localhost:8080/space/1?type=comment 成功触发XSS漏洞。