本文是翻译文章,原作者 quentin
原文地址:https://www.gremwell.com/firefox-xss-302
译文仅作参考,具体内容表达请见原文
最近日站时遇到了一个URL跳转,服务器直接将目标GET参数原样输出在Location:
响应头中没做任何安全检查。如下:
随后我发现该输出点还解析换行符和回车符,也就是存在CRLF:
然后我插入了多个换行符之后再插入一下HTML+JS语法,想借此构造反射XSS:
但是问题来了,由于响应码是302
,常用的浏览器如Chrome、IE、Firefox 不会解析HTTP响应正文,得想个办法绕过。
搜了下大佬们的文章,有了一个发现,其中Fortinet
师傅描述了如何通过将Location
响应头设置为以mailto://
开头的URI来绕过302跳转以执行XSS。Bugcrowd论坛也有一些类似的讨论。大致思路都是通过给Location响应头插入一些特殊的协议来实现绕过。
基于此,我决定写个fuzz工具,我基于IANA(互联网号码分配机构)提供的协议列表,根据以下格式来测试是否能绕过302跳转:
http://acme.corp/?redir=[URI_SCHEME]://gremwell.com%0A%0A[XSS_PAYLOAD]
最后发现只有如下两个协议能够绕过并且仅在Firefox浏览器上有效:
大致如下:
打开最新版本的Firefox(投稿时在最新版为v 82.0.2 测试成功)中的链接,可以看到在正确的域下执行了XSS,而没有被重定向:
经过公开的讨论,后续发现如下:
Location:
空的Location响应头可以在Chrome上成功执行内容中的XSS代码。(投稿时在最新版 Chrome v86.0.4240.111测试成功)Location: resource://URL
使用resource协议也可以在Firefox 81 上执行payload。(投稿时在最新版 Firefox v82.0.2测试成功)