我的JSP中的以下代码导致输入标记上的跨站点脚本漏洞。
<form name="acctFrm" method="post" action="<%=contextPath%>/form/acctSummary?rpt_nm=FIMM_ACCT_SUMM_RPT">
<table>
<tr>
<td>Account Id:</td>
<td>
<input class="tbl1" type="text" id="acctId" name="acctId" size="20" maxlength="10" value="<%=rptBean.getAcctId()%>"/>
<a href="javascript:doAcctSubmit()"><img class="tbl1" src="<%=contextPath%>/img/Submit.gif" border="0" /></a>
</td>
</tr>
</table>
</form>
在渗透测试期间,他们能够通过在标记的value属性中注入警报脚本来向用户发出一些随机消息,如下所示
<input class="tbl1" type="text" id="acctId" name="acctId" size="20" maxlength="10" value="1"><script>alert(12345)</script>" />
这里有什么问题,解决方法是什么。
我正在阅读有关XSS的一些在线参考资料,但我仍然不能确定可能出现的问题。
非常感谢任何帮助。
谢谢, 蒂娜
答案 0 :(得分:4)
我使用了以下解决方案,
值属性中的scriplet是问题,我用jstl标签替换它,我在某处读到jstl标签具有内置转义机制以避免xss问题。
<input class="tbl1" type="text" id="acctId" name="acctId" size="20" maxlength="10" value="<c:out value=${rptBean.acctId}"/>"/>
这对我的问题很有用。
由于
答案 1 :(得分:2)
渗透测试人员似乎能够操纵他们的会话,以便rptBean.getAcctId()返回任意字符串。如果他们可以注入引号和右括号,他们可以“强行关闭”input
标记并插入自己的script
标记。
看起来渗透测试人员获得了返回字符串1"><script>alert(12345)</script>
的方法。
这表示您在写入页面时需要转义数据。我建议你看看escaping HTML in jsp上的答案。
此外,请记住,代码不必“完美”格式化,以便浏览器“正确”呈现它。以下是一些关于攻击者如何尝试逃避XSS过滤器的链接:
始终将用户数据视为“危险”,并在页面上呈现时要小心。
答案 2 :(得分:1)
似乎在value属性中使用jstl
标记<c:out value="">
会导致jstl
<form options>
标记出错,
答案 3 :(得分:0)
如果getAcctId()
返回的数据来自数据库,您可以在发送到客户端之前进行过滤。例如,检查数据应该是一个数字。