绕过ASP.NET中的查询字符串验证(XSS预防)

时间:2013-12-23 23:19:08

标签: javascript asp.net security xss

我正在对我分配到的一个非常古老的项目执行安全评估,该项目使用ASP.NET WebForms。基本上,网站周围放置了大量“后退”按钮,这会将用户重定向回上一页(基于Return Url值)。

我发现的问题是按钮功能是用JavaScript编码的,周围有标签,这意味着您可以简单地使用“;”('INSECURE!');“在返回URL的末尾,它会在单击按钮后立即执行脚本。

为了消毒,添加了验证 - 只要请求包含单引号('),双引号(“)或<>符号,就会抛出无效请求URL异常。我很公平安全场景的新手,对我来说这听起来像是一种很棒的方法。

不幸的是,正如我所说的那样,在XSS预防方面,我是初学者。有没有人做过类似的事情并知道这种方法中的漏洞? (是的,我做了我的研究。花了几个小时研究不同的材料和技术,找不到任何类似的东西,虽然不过时)。

提前致谢!

2 个答案:

答案 0 :(得分:1)

从您的说明中可以看出,您的网址格式为www.example.com/page.aspx?ReturnUrl=foo.aspx

我使用以下JavaScript代码

对此进行了测试
<a href="javascript:document.location = decodeURIComponent(document.location.search.substring(document.location.search.indexOf('ReturnUrl=') + 10));">Back</a>

虽然这适用于普通网址并且不允许附加代码(例如;alert('INSECURE!')),但您仍然可以通过将ReturnUrl设置为JavaScript协议网址来执行XSS,例如javascript:alert('foo')。由于前者在您的项目中工作,听起来您的项目中的代码正在对查询字符串值执行某种eval,这本身是不安全的,因为eval不应该用在外部输入上,因为攻击者可以在这个输入中轻松注入他们想要的任何代码。

要阻止您网站上的XSS,您应该对ReturnUrl参数执行某种验证。我会推荐以下内容。

  • 应使用与上述类似的代码,其中location设置为值,而不是查询字符串上发生的任何类型的代码评估。
  • 验证参数以确保仅允许相对URL。这也有助于防范您的网站Unvalidated Redirects and Forwards。一种简单的方法是验证URL不包含“:”字符,这将停止正在切换的协议或域。例如。这样可以防止协议从http: / https:更改为javascript:或其他任何内容。在URL的路径部分中Technically this character is valid,但是非常罕见,如果您知道自己没有在网站上的任何页面名称中使用它,那么这是一种非常好的验证技术。
  • 如果需要,请删除单引号('),双引号(")和尖括号(<>)验证检查,因为您现在要验证URL是相对的,并且您的代码不再是eval uating。

在上述检查中,如果验证失败,您仍然可以抛出Invalid Request URL exception

答案 1 :(得分:-1)

您可以将验证与文本框过滤器结合使用,以确保输入的数据符合您的要求。

Walkthrough: Validating User Input in a Web Forms Page

FilteredTextBox Demonstration

此外,您可以在表单中添加验证码。