【发布时间】:2021-12-18 13:28:14
【问题描述】:
下面的代码是不是真的给某个JSP页面添加了XSS漏洞?
<!-- <%=paramName%>=<%=request.getParameter(paramName)%><BR> -->
它看起来像一个“遗留调试”,绝对应该从代码中删除,但它有多危险?
【问题讨论】:
下面的代码是不是真的给某个JSP页面添加了XSS漏洞?
<!-- <%=paramName%>=<%=request.getParameter(paramName)%><BR> -->
它看起来像一个“遗留调试”,绝对应该从代码中删除,但它有多危险?
【问题讨论】:
是的,您看到的是反射型 XSS 攻击。这是危险的,因为它允许攻击者劫持经过身份验证的会话。如果您的系统上运行此代码,攻击者将能够访问其他人的帐户,而无需知道他们的用户名/密码。
XSS 漏洞也可以用来绕过CSRF protection。这是因为 XSS 允许攻击者使用 XmlHTTPRequest 读取 CSRF 令牌的值。 XSS 也可以用来欺骗referer 检查。
这是手动测试xss的简单方法,这里我打破HTML注释来执行javascript。
http://localhost/xss_vuln.jsp?paramName='--><script>alert(document.cookie)</script><!--'
这是一个免费的xss scanner,您应该测试您编写的所有应用程序。
【讨论】:
JSP 解析器将 HTML cmets 处理为 模板文本。它不会忽略它的内容。 HTML cmets 仅被 HTML 解析器/解释器(网络浏览器!)忽略。您应该改用 JSP cmets 来防止 JSP 解析器处理特定的代码。
<%-- <%=paramName%>=<%=request.getParameter(paramName)%><BR> --%>
注意<%-- --%> 样式与<!-- --> HTML 注释样式相对。 JSP 解析器不会解析它们,但会从输出中删除它们。因此,您不会在生成的 HTML 输出中看到它们。
这里存在 XSS 风险,因为您没有在此处转义 用户控制 输入。请求参数完全可以由 enders 控制。例如,最终用户可以将--><script>alert('xss')</script><!-- 作为参数值传递,它将被执行。这为XSS 和CSRF 攻击敞开了大门。例如,恶意脚本可能会通过 ajax 请求将所有 cookie 发送到恶意服务器。然后,攻击者只需复制 cookie 值即可以自己的身份登录。
您应该使用JSTL c:out 标签或fn:escapeXml 函数来转义用户控制的输入。我之前已经多次详细回答过这个问题,在每个here 下。关于 CSRF 的更多解释可以在我的回答 here 中找到。
【讨论】:
<c:out> 或${fn:escapeXml()} 重新显示用户控制的输入。完全停止使用<% ... %>。