我正在对我分配到的一个非常古老的项目执行安全评估,该项目使用ASP.NET WebForms。基本上,网站周围放置了大量“后退”按钮,这会将用户重定向回上一页(基于Return Url值)。
我发现的问题是按钮功能是用JavaScript编码的,周围有标签,这意味着您可以简单地使用“;”('INSECURE!');“在返回URL的末尾,它会在单击按钮后立即执行脚本。
为了消毒,添加了验证 - 只要请求包含单引号('),双引号(“)或<>符号,就会抛出无效请求URL异常。我很公平安全场景的新手,对我来说这听起来像是一种很棒的方法。
不幸的是,正如我所说的那样,在XSS预防方面,我是初学者。有没有人做过类似的事情并知道这种方法中的漏洞? (是的,我做了我的研究。花了几个小时研究不同的材料和技术,找不到任何类似的东西,虽然不过时)。
提前致谢!
答案 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
设置为值,而不是查询字符串上发生的任何类型的代码评估。:
”字符,这将停止正在切换的协议或域。例如。这样可以防止协议从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
此外,您可以在表单中添加验证码。