如何解决 HTML/aspx 站点中的反射跨站点脚本 (XSS) 漏洞

How to solve Reflected Cross-Site Scripting (XSS) Vulnerabilities in HTML/aspx site

我有这样的东西:

<td>
     <a href="pagina3.aspx?u=<%=request.querystring.get("u")%>&t=2&p=<%=Request.QueryString.Get("p")%>">
         <img src="image.png" />
     </a>
 </td>

但是通过这种方式我检测到一个 XSS 漏洞。有使用查询字符串并避免漏洞的正确方法,还是我必须更改传递参数的方式? 我试过这样的事情:

    <td>
        <form method="post" action="pagina3.aspx">
            <input type="hidden" value="<%=request.querystring.get("u")%>" name="u" />
    <input type="hidden" value="2" name="t" />
    <input type="hidden" value="<%=request.querystring.get("p")%>" name="p" />
<input type="image" value="submit" src="image.png" alt="submit Button" />
        </form>
     </td>

但它不起作用,因为所有页面都在已经有表单的母版页中。 有什么建议吗?

可能是这样的:

 <td>
     <a href="pagina3.aspx?u=<%=Server.UrlEncode(Request.querystring.get("u"))%>&t=2&p=<%=Server.UrlEncode(Request.QueryString.Get("p"))%>">
         <img src="image.png" />
     </a>
 </td>

有几件事情你要考虑,主要的是处理XSS。

是的,您当前的实施很容易受到 XSS 攻击。

上下文编码

您至少应该对不受信任的数据(在本例中为查询字符串)进行上下文编码。

重要的一点是确保您获得正确的编码上下文,根据您的示例,您要为 HtmlAttribute 进行编码。

根据您使用的 .Net 框架版本,您有两个选择:

.NET Framework 4.6 和 4.5 - 使用 System.Web.Security.AntiXss.AntiXssEncoder class.

对于较旧的框架,请下载 Microsoft Anti-Cross Site Scripting Library V4.2

那么您的代码将如下所示:

<input type="hidden" 
       value="<%= AntiXssEncoder.HtmlAttributeEncode(request.querystring.get("u")) %>" 
       name="u" />

有关 XSS 的更多信息,请阅读:

隐藏字段

在您的示例中,您将信息放入隐藏字段。确保您没有盲目地相信这些数据,这对用户来说很容易找到和修改值(它使用 Chrome 中的开发人员工具,没有插件)。

参考文献:

一般 Web 应用程序安全参考资料