https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-view-jsp

背景描述

昨天在测试CodeQL扫公司项目XSS的准确型,遇到下面一个情况,没有对输入做任何处理,但是在浏览器中测试时发现却做了HTML编码;Service、Filter等所有能找的地方都找遍了也没有发i发现进行编码的地方。
image.png
后来才知道原来Spring的标签在渲染时默认会对属性值进行HTML实体编码。
image.png

input标签

标签为例

在JSP文件中,使用如下标签时

  1. <form:input path="house"/>

在HTML中会渲染成下面的代码

  1. <input type="text" name="house" value="house的值">

htmlEscape属性,所有标签都支持,会对属性值进行HTML实体编码,默认值是true

DEMO

Controller

image.png

JSP

需要在JSP文件中需要先引入标签库

  1. <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

image.png
如上第一个标签会生成一个input标签,type属性的值是text,name属性的值author,value属性的值learn.author的值;
第二个标签将htmlEscape属性置为false,关闭了转义;
第三个标签使用了传统的方式来输出变量。

HTML

http://127.0.0.1:8080/learn?author=authorsink"&title=titlesink"&url=urlsink

image.png
可以看到第一个input标签,会对属性值进行HTML实体编码,第二个第三个input标签没有对属性值进行HTML实体编码。

总结

Spring的标签库在渲染时默认会对属性值进行HTML实体编码,这样的话如何编写CodeQL的Sanitizer呐?
解决办法是:TODO
1、CodeQL有办法识别,那么应该怎么识别呐?
2、CodeQL没有办法识别,只是通过二次验证?