这是我的页面test.html:
<script type="text/javascript">
document.write(location.href);
</script>
当我使用网址http://example.com/test.html?test=<script>alert('xss')</script>
访问test.html时,我得到了这个输出:
http://example.com/test.html?test=%3Cscript%3Ealert(%27xss%27)%3C/script%3E
很明显,location.href不会像提到here那样返回一个URL字符串:
返回值:一个字符串,表示页面的整个URL,包括协议(如http://)
它返回URL的编码版本的字符串。
所以我的问题是:document.write(location.href);
安全吗?恶意用户是否可以在其中放置XSS有效负载?
我们假设这不会打印到<script>
,<a>
或任何HTML标记中,因此您必须像我一样将标记传递到location.href。
编辑:我想我应该提到我是一名安全分析师。我试图利用它,所以我可以向我的客户证明这不是一个好的做法,但我找不到办法这样做。所以,不需要教我。
答案 0 :(得分:0)
http://example.com/test.html?test=<script>alert('xss')</script>
是无效的网址。浏览器的位置字段不仅限于有效的URL - 在解析输入URL时,它们几乎可以接受任何内容,包括路径中的无效字符,查询字符串和片段。发送到服务器的请求是已解析URL的序列化版本,并且 始终是有效URL,通过百分比编码在URL的相应部分中不合法存在的字符获得。
URL是一个抽象概念:location.href
返回一个字符串,该字符串在语义上等同于用于将浏览器导航到该资源的字符串 - 它不一定是相同的字符串。直到最近,根据规范,唯一的要求是返回的字符串是URL的表示,不要求 可能的表示(并且有很多!)。
所有人都说,有些方案的解析方式不同。观察data:text/html,<script>alert(location.href);</script>
生成的内容 - 至少在Firefox 38和Chrome 42中提供该确切字符串的提醒。我找不到任何可导航的HTTP / HTTPS网址,导致<
输出{ {1}},但假设没有这样的网址是天真的。