【问题标题】:How to solve Reflected Cross-Site Scripting (XSS) Vulnerabilities in HTML/aspx site如何解决 HTML/aspx 站点中的反射跨站点脚本 (XSS) 漏洞
【发布时间】:2016-02-23 12:49:09
【问题描述】:

我有这样的事情:

<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>

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

【问题讨论】:

标签: html asp.net security query-string xss


【解决方案1】:

有几件事情你要考虑,最主要的是要处理 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 应用安全参考

【讨论】:

  • 问题中带有隐藏字段的示例不起作用,因为所有页面都在具有表单的母版页中。所以我正在尝试第一个 url 解决方案。是一个带有 .NET Framework 2.0 的旧站点,所以如果我下载该库,我可以执行以下操作:&t=2&p=">
  • 在做href值时,虽然它是一个HTML属性,但你想使用更具体的URL编码器,UrlEncode
【解决方案2】:

可能是这样的:

 <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>

【讨论】:

  • 虽然这是一个 URL 并且您正在执行上下文编码,但您希望使用专用于 AntiXss 的库。 Server.HtmlEncode 和 Server.UrlEncode 旨在不破坏 HTML,这与旨在防止 XSS 的设计不同