Apache Tomcat 9.0.96版本JSTL c:out标签转义失效存安全隐患
Apache Tomcat 9.0.96版本JSTL
<c:out>标签转义异常问题 2024年10月8日发布的Apache Tomcat 9.0.96版本中,JSTL的<c:out>标签出现行为异常,疑似存在代码注入等安全隐患。该标签在特定场景下不再对value属性的内容进行转义,而9.0.95及更早版本无此问题。
复现步骤
- 在ROOT webapp目录下创建
index.jsp文件 - 在应用的
lib目录中放入taglibs-standard-impl-1.2.5.jar和taglibs-standard-spec-1.2.5.jar index.jsp代码如下:
<%@ page session="false" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <% String test = "{ \"key\" : \"value\" }"; java.util.Map<String, String> map = new java.util.HashMap<>(); map.put("test", test); request.setAttribute("test", test); request.setAttribute("map", map); %> <!DOCTYPE html> <html lang="en"> <body> <input type="text" name="test" id="test" value="<c:out value="${test}" />" /> <br/> <input type="text" name="test" id="test" value="<c:out value="<%=test %>" />" /> <br/> <c:forEach items="${map}" var="entry"> <input id="${entry.key}" name="${entry.key}" type="text" value="<c:out value="${entry.value}" />"> <br/> </c:forEach> <br/> <br/> Tomcat Version : <%= application.getServerInfo() %> <br/> Servlet Specification Version : <%= application.getMajorVersion() %>.<%= application.getMinorVersion() %> <br/> JSP version : <%=JspFactory.getDefaultFactory().getEngineInfo().getSpecificationVersion() %> </body> </html>
渲染结果对比
Tomcat 9.0.95版本(关键部分)
<input type="text" name="test" id="test" value="{ "key" : "value" }" /> <input type="text" name="test" id="test" value="{ "key" : "value" }" /> <input id="test" name="test" type="text" value="{ "key" : "value" }">
Tomcat 9.0.96版本首次编译后渲染结果
<input type="text" name="test" id="test" value="{ "key" : "value" }" /> <input type="text" name="test" id="test" value="{ "key" : "value" }" /> <input id="test" name="test" type="text" value="{ "key" : "value" }">
Tomcat 9.0.96版本刷新页面后渲染结果
(仅首次编译后出现上述结果,刷新后所有<c:out>输出均未转义)
<input type="text" name="test" id="test" value="{ "key" : "value" }" /> <input type="text" name="test" id="test" value="{ "key" : "value" }" /> <input id="test" name="test" type="text" value="{ "key" : "value" }">
内容的提问来源于stack exchange,提问作者stefanu
相关产品推荐
相关产品推荐

