【问题标题】:Cross-site scripting - ASP.NET form action being modified by URL跨站点脚本 - 由 URL 修改的 ASP.NET 表单操作
【发布时间】:2026-02-07 11:00:01
【问题描述】:

在对我们的 Web 应用程序 (WebInspect) 运行安全扫描后,它报告了一些带有一些 aspx 页面的 XSS 漏洞。

请求 URL 似乎可以更改表单操作。

例子,

/Website/somepage.aspx/'+alert(1234)+'

表单动作改为

action="'+alert(1234)+'"

为了排除我们的应用程序代码,我用默认的新 Visual Studio webform 项目尝试了这个,它也允许这样做。

如何防止这种情况发生?

我一直被告知,未经验证的输入反映到页面中是个坏消息。

【问题讨论】:

  • 参数化变量并清理输入
  • 这一定与你设置的重写规则有关。 /Website/somepage.aspx/'+alert(1234)+' 必须给出错误页面,而不是将其转换为 +alert(1234)+。至少对我来说给出了一个找不到错误页面,因为这部分 /'+alert(1234)+' 是 url 上的一个新文件。
  • 我没有要参数化或验证的变量。该 url 已添加到 aspx 页面 url 的末尾,它会导致页面呈现修改了表单操作。我没有将输入视为要验证的查询字符串的一部分。这完全发生在我的代码之外。我已经确认该行为发生在 Visual Studio 2012 中未更改的开箱即用 WebForm 项目类型中。
  • 我没有任何重写规则。这不是一个 MVC 应用程序,只是一个老式的 WebForm Web 应用程序。
  • 如果您执行 /Website/somepage.aspx/foobar 之类的操作,则将“foobar”放入表单的操作中。

标签: asp.net webforms xss


【解决方案1】:

在动作中加入一些东西,像这样:

<form id="id_form" runat="server" action="Default.aspx">

当未指定操作表单时,asp 会填充您在 URL 中最后一个斜杠旁边写入的属性。如果你在那里写东西,asp不会重写这个。

【讨论】:

  • 请解释为什么您的代码会回答提问者的问题。
【解决方案2】:

请检查您的global.asax - Application_Start 以查看是否已定义任何路线。

【讨论】:

  • 不在我们的代码中,但我开始怀疑第三方库可能会这样做。有没有一种简单的方法可以查看定义的路线?也许从测试页面中列出它们?
  • 嗯.. 不能确定.. 也许枚举路由集合? Dim routeCollection AS System.Web.Routing.RouteCollection = System.Web.Routing.RouteTable.Routes