以下代码是否在某些JSP页面中添加了XSS漏洞?
<!-- <%=paramName%>=<%=request.getParameter(paramName)%><BR> -->
它看起来像一个“剩余的调试”,绝对应该从代码中删除,但它有多危险?
答案 0 :(得分:5)
是的,你正在看的是反射XSS攻击。这很危险,因为它允许攻击者劫持经过身份验证的会话。如果您的系统上运行此代码,攻击者将无需知道其用户名/密码即可访问其他人的帐户。
XSS漏洞也可用于绕过CSRF protection。这是因为XSS允许攻击者使用XmlHTTPRequest读取CSRF令牌的值。 XSS也可以用来欺骗引用者检查。
这是手动测试xss的简单方法,这里我打破HTML注释来执行javascript。
http://localhost/xss_vuln.jsp?paramName='--><script>alert(document.cookie)</script><!--'
这是免费的xss scanner,您应该测试您编写的所有应用程序。
答案 1 :(得分:1)
JSP解析器将HTML注释处理为模板文本。它不会忽略它的内容。只有HTML解析器/解释器(webbrowsers!)才会忽略HTML注释。您应该使用JSP注释来阻止JSP解析器处理特定的代码段。
<%-- <%=paramName%>=<%=request.getParameter(paramName)%><BR> --%>
注意<%-- --%>
样式而不是<!-- -->
HTML注释样式。 JSP解析器不会解析它们,但从输出中删除它们。因此,您不会在生成的HTML输出中看到它们。
此处存在XSS风险,因为您没有在此处转发用户控制的输入。请求参数可由内核完全控制。例如,最终用户可以传递--><script>alert('xss')</script><!--
作为参数值,并且它将被执行。这为XSS和CSRF攻击敞开了大门。恶意脚本可以例如通过ajax请求将所有cookie发送到恶意服务器。然后,攻击者可以复制cookie值,以便能够以自己的身份登录。
您应该使用JSTL c:out
标记或fn:escapeXml
函数来逃避用户控制的输入。在here之下,我已经多次详细解答了这个问题。有关CSRF的更多说明可以在我的回答here中找到。