我在旧网站上遇到了XSS。
易受此攻击的参数是:ldapSearch.jsp?f=
添加XSS有效负载以检查它是否容易受到攻击:"><img src=x onerror=prompt(0);>
网址如下:
XSS弹出窗口出现并证明该站点容易受到XSS攻击。
来自JSP的Snippet
<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攻击。需要帮助理解它为什么容易受到攻击,以及我该怎么做才能解决这个问题。
答案 0 :(得分:2)
需要帮助了解它为何易受攻击
您可以在此处输入用户输入:
String backFieldName = request.getParameter("f1");
然后你输出它,没有修改,在这里:
<input type="HIDDEN" name="backFieldName" value="<%=backFieldName%>">
(您也会对其他数据执行相同操作,但我们将使用此示例)。
这允许任何人制作包含">
后跟任何HTML(包括<script>
元素或所需付款表单)的链接,将其发送给某人,然后让他们的HTML显示当该人关注链接时,在您的网站上。
我应该怎么做才能解决这个问题。
将HTML中具有特殊含义的任何字符转换为各自的实体,或通过白名单运行数据以过滤掉可能不良的输入。