我的公司给了我解决特定应用程序的所有安全问题的任务。安全tream报告了跨站点脚本错误。错误在于以下输入字段:
<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 :(得分: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)}"/>
答案 1 :(得分:1)
在firefox浏览器中安装[TamperData][1]
插件,可让您在提交前编辑数据。如果它在POST或GET中无关紧要。
使用此hidden fields
可以是edited
。
答案 2 :(得分:0)
要解决问题的方法是在将值放入value-attribute之前对HTMLAttributeEncode值。有关执行HTML属性编码的方法,请参阅OWASP ESAPI或MS AntiXSS。 看看攻击字符串是如何进行URL编码的,我认为您猜测将其包含为GET参数似乎是合理的。
答案 3 :(得分: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);