2012-08-13 96 views
3

我的JSP中的以下代码片段导致了输入标记上的跨站点脚本攻击漏洞。XSS跨站点脚本 - Jsp <Input>标记

<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的一些在线参考资料,但我还没有100%确定可能是什么问题。

任何帮助将不胜感激。

感谢, 蒂娜

回答

4

我已经使用了以下解决方案,

的价值属性的scriplet的问题,我用JSTL标记替换它,我读的地方,JSTL标签已经inbuild逃逸机制来避免XSS问题。

<input class="tbl1" type="text" id="acctId" name="acctId" size="20" maxlength="10" value="<c:out value=${rptBean.acctId}"/>"/> 

这适用于我的问题。

感谢

2

看来渗透测试人员能够操纵自己的会话,从而rptBean.getAcctId()将返回一个任意字符串。如果他们可以注入引号和右括号,他们可以“强制关闭”input标签并插入他们自己的script标签。

它看起来像渗透测试人员得到的方法返回字符串1"><script>alert(12345)</script>

这表示在写入页面时需要转义数据。我建议看看escaping HTML in jsp上的答案。

另外,请记住,代码不必“完美”地格式化,以使浏览器“正确”呈现它。下面是关于如何攻击者可能会试图逃避XSS过滤器的一些链接:

始终将用户数据为“危险”,并呈现在页面上时要小心。

0

如果getAcctId()返回的数据来自数据库,你可以发送给客户端之前进行过滤。例如检查数据是否应该是一个数字。