Request.PathInfo 问题和 XSS 攻击

Request.PathInfo issues and XSS attacks

由于 API 限制,我在 .NET 3.5 上有几个网站 运行。今年我们最终会将这些站点迁移到最新的 .NET 版本。其中一项渗透测试表明可能存在 XSS 漏洞。有问题的 URL 是:

Location: http://www.foobar.com/basket.aspx/scripts/searchresults.aspx

Method: GET

Vulnerable Parameter: name of an arbitrarily supplied URL parameter

基本上,basket.aspx 之后的任何内容,如 scripts/searchresults.aspx 都会导致问题。据我所知,Request.PathInfo 将尝试找到路径并最终到达 searchresults.aspx(如果 .aspx 页面存在)但由于以下原因无法找到我所有的 CSS 和脚本相对路径。该页面基本上中断了。目前尚不清楚这如何导致 XSS 漏洞。然而,它确实破坏了页面。

我的问题:是否需要 Request.PathInfo?在我的初步测试中,如果我检查 Request.PathInfo,我可以确定它可能是一个错误的 URL 请求:

FooBar.Global pageObj = obj;

if (obj.Request.PathInfo.Length > 0)
{
   Response.Redirect("~/sitemap.aspx", true); // bad url send to site map
}

在我看来,渗透测试人员注意到,如果他们提供了 URL,例如:

http://www.foobar.com/basket.aspx/scripts/searchresults.aspx?foo=bar

生成的页面中某处会有 foo=bar。除非使用适当的转义,否则这将容易受到 XSS 攻击,因为有人可以提交 JavaScript 作为该值的一部分。

Is Request.PathInfo needed?

ASP.NET WebForms 不需要 PathInfo。 It can be helpful for search engine optimization, but if you don't use it, go ahead and disable it. You can add your code snippet, or you can install UrlScan 并将 AllowDotInPath 选项设置为 0。

How could this cause an XSS vulnerability?

如果满足所有这些条件,您的页面可能容易受到 Relative Path Overwrite (RPO) 攻击:

  1. 攻击者可以将内容(例如,博客评论)注入页面的某处。
  2. 您的页面通过相对路径引用了 CSS 样式表。
  3. 路径信息已启用。

通过将 PathInfo 附加到 URL,攻击者可以使您的页面加载 本身 作为样式表,因为 ASP.NET 解析页面。aspx/Master.css 只是 Page.aspx,而不是 Master.css。由于 CSS 的松散(设计)解析规则,攻击者的内容可能被解释为有效 CSS,这 尤其是 对旧版本的互联网不利允许 JavaScript 在 CSS 中的资源管理器。即使在现代浏览器中,恶意样式表也可以注入误导其他用户的内容。

I want to use PathInfo. How can I mitigate this vulnerability?

使用绝对路径引用所有 CSS 样式表。例如,您可以使用 app-relative 路径(以 ~/ 开头的虚拟路径)调用 ResolveUrl 方法:

<link href='<%= this.ResolveUrl("~/App_Themes/MySite/Master.css") %>' rel="stylesheet" type="text/css" />

警告:不要使用 ResolveClientUrl 方法,因为它 returns 是相对路径。