我在旧版网站中遇到了XSS。
易受此攻击的参数为:ldapSearch.jsp?f=
添加 XSS 有效负载以检查它是否易受攻击后:"><img src=x onerror=prompt(0);>
网址将如下所示:
http://idenservices.hostname.com/axrac/ldapSearch.jsp?f=%22%3E%3Cimg%20src=x%20onerror=prompt%280%29;%3E
XSS弹出窗口出现并证明该站点容易受到XSS攻击。
来自 JSP 的代码片段
<tr>
<td class="required">*</td>
<td class="label"><h3>Enter User's Core ID</h3></td>
<td class="field"><input type="text" name="userid" size="25" maxlength="20" onkeypress="return isAlphaNumberKey(event)" onblur="return LowerCaseAlphanumeric(document.getElementById('userid'));"><a href="javascript: userlookup('userid','frmEditUser');" class="link">Lookup User</a></td>
</tr>
来自 JS 的代码片段
function userlookup(fieldName, formName)
{
var uri = "/axrac/ldapSearch.jsp?f=" + formName + "&f1=" + fieldName;
msgWindow=open(uri,'lookup','width=600,height=400,resizable=yes,toolbar=no,menubar=no,location=no,directories=no,status=no');
msgWindow.focus();
}
添加 ldapsearch.jsp
<%
String backFieldName = request.getParameter("f1");
String backFormName = request.getParameter("f");
%>
<table width="100%" cellpadding="0" cellspacing="0" border="0" class="PageSubHeader1">
<tr class="bg">
<td class="flag"> </td>
<td class="banner" width="100%"><h2>LDAP Search</h2></td>
</tr>
</table>
<table cellpadding="0" cellspacing="0" border="0" class="PageIntroduction">
<tr>
<td class="copy">
<br/>When searching for a person by their name, please provide 2 or more letters for their first and last name.
If less than 2 letters are entered for both fields or if one field is empty, the search may not return any results.
</td>
</tr>
</table>
<p class="HorizontalRule"></p>
<form action='ldapSearchResults.jsp' method='post'>
<input type="HIDDEN" name="backFieldName" value="<%=backFieldName%>">
<input type="HIDDEN" name="backFormName" value="<%=backFormName%>">
<table width="100%" cellspacing="0" border="0" class="Forms">
<tr>
<td class="required">*</td>
<td class="instruction" colspan="2"><h2>Indicates required field</h3></td>
</tr>
<tr>
<td class="required">*</td>
<td class="label"><h3>First Name</h3></td>
<td class="field"><input type=text name='firstName' size="20"></td>
</tr>
<tr>
<td class="required">*</td>
<td class="label"><h3>Last Name</h3></td>
<td class="field"><input type=text name='lastName' size="20"></td>
</tr>
<tr>
<td> </td>
<td class="label" colspan="2"><h3>- Or -</h3></td>
</tr>
<tr>
<td class="required">*</td>
<td class="label"><h3>Core ID</h3></td>
<td class="field"><input type=text name='coreID' size="20"></td>
</tr>
</table>
<p class="HorizontalRule"></p>
<table width="100%" cellpadding="0" cellspacing="0" border="0" class="Buttons">
<tr>
<td><input type="submit" class="systemButton1" value="Submit Form" id="Submit"> <input type="reset" class="systemButton2" value="Reset Form" id="Reset"></td>
</tr>
</table>
</form>
</body>
</html>
我没有看到JavaScript的任何问题,但它仍然容易受到XSS攻击。需要帮助来了解为什么它容易受到攻击以及我应该怎么做才能解决这个问题。
需要帮助了解为什么它容易受到攻击
您在此处获取用户输入:
String backFieldName = request.getParameter("f1");
然后你输出它,不加修改,在这里:
<input type="HIDDEN" name="backFieldName" value="<%=backFieldName%>">
(您也对其他数据执行相同的操作,但我们将在示例中使用它)。
这允许任何人制作一个包含">
的链接,后跟他们想要的任何 HTML(包括<script>
元素或需要付款的表单),将其发送给某人,然后在该用户点击链接时让他们的 HTML 出现在您的网站上。
以及我应该怎么做才能解决这个问题。
将 HTML 中具有特殊含义的任何字符转换为各自的实体,或通过白名单运行数据以过滤掉潜在的错误输入。
延伸阅读: OWASP XSS 预防备忘单