2011-08-12 28 views
2

我的公司向我提供了解决特定应用程序的所有安全问题的任务。安全流程报告了一个跨站点脚本错误。错误主要表现在以下输入字段:使用隐藏输入的跨站点脚本

<input type="hidden" name="eventId" value="${param.eventId}"/> 

从安全问题的报告是不是很详细,但说他们可以做一个POST请求具有上述标签包含以下恶意代码的网页:

eventId=%22%3e%3csCrIpT%3ealert(83676)%3c%2fsCrIpT%3e 

而且,当页面重新加载,它将具备以下条件:

<input type="hidden" name="eventId" value=""><sCrIpt>alert(83676)</sCrIpt></value> 

我试图要“黑客”,并显示该漏洞。但我无法弄清楚他们如何设法在那里获得该脚本。我猜测他们将它作为一个URL参数包含在表单的GET请求中,但是当我尝试自己做这件事时,我得到一个403错误。有谁知道如何显示漏洞?

我知道网站上有很多XSS的问题,但没有一篇似乎打这个话题。

+0

如何您是否将其添加到网址?哪里有其他参数? – Erlend

回答

3

所以,我不知道为什么,但我最初的预感是正确的。脚本可以作为URL参数放置。不过出于某种原因,这不适用于我们的分期网站。只能在本地运行应用程序。我不知道为什么,但这个工作(只在本地):

http://localhost:8080/myUrl/MyAction.do?eventId=%22%3e%3csCrIpT%3ealert(83676)%3c%2fsCrIpT%3e 

这样做,你会看到一个警告框弹出。我打算使用JSTL函数来修复它。

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 
... 
<input type="hidden" name="eventId" value="${fn:escapeXml(param.eventId)}"/> 
0

想要解决问题的方法是在将值放入值属性之前对HTMLAttributeEncode进行编码。有关执行HTML属性编码的方法,请参阅OWASP ESAPI或MS AntiXSS。 看到攻击字符串是如何进行URL编码的,我想你猜想把它作为一个GET参数看起来是合理的。

1

在firefox浏览器中安装[TamperData][1]附加组件,让您在提交前编辑数据。如果它处于POST或GET,则无关紧要。使用此hidden fields可以是edited

0

我使用了OWASP ESAPI API,因为传统的jsp没有JSTL可用。这是我用什么:

<input type="hidden" name="dataValue" value="<%=ESAPI.encoder().encodeForHTMLAttribute(dataValue)%>"> 

您也可以使用API​​来过滤request.Parameter(),我也需要,如:

String userURL = request.getParameter("userURL") 
boolean isValidURL = ESAPI.validator().isValidInput("URLContext", userURL, "URL", 255, false); 
if (isValidURL) { 
    <a href="<%=encoder.encodeForHTMLAttribute(userURL)%>">link</a> 
} 

和:

String name = (String) request.getParameter("name"); 
name = ESAPI.validator().getValidInput("name ", name , "SafeString", 35, true);