案例分享:Location 302跳转 + CRLF 场景下如何构造XSS

1. 译文声明

本文是翻译文章,原作者 quentin
原文地址:https://www.gremwell.com/firefox-xss-302
译文仅作参考,具体内容表达请见原文

2. 初步发现

最近日站时遇到了一个URL跳转,服务器直接将目标GET参数原样输出在Location:响应头中没做任何安全检查。如下:

随后我发现该输出点还解析换行符和回车符,也就是存在CRLF:

然后我插入了多个换行符之后再插入一下HTML+JS语法,想借此构造反射XSS:

但是问题来了,由于响应码是302,常用的浏览器如Chrome、IE、Firefox 不会解析HTTP响应正文,得想个办法绕过。

3. 查询资料

搜了下大佬们的文章,有了一个发现,其中Fortinet师傅描述了如何通过将Location响应头设置为以mailto://开头的URI来绕过302跳转以执行XSS。Bugcrowd论坛也有一些类似的讨论。大致思路都是通过给Location响应头插入一些特殊的协议来实现绕过。

4. Fuzz大法好

基于此,我决定写个fuzz工具,我基于IANA(互联网号码分配机构)提供的协议列表,根据以下格式来测试是否能绕过302跳转:

http://acme.corp/?redir=[URI_SCHEME]://gremwell.com%0A%0A[XSS_PAYLOAD]

最后发现只有如下两个协议能够绕过并且仅在Firefox浏览器上有效:

  • ws:// (WebSocket)
  • wss:// (Secure WebSocket)

大致如下:

打开最新版本的Firefox(投稿时在最新版为v 82.0.2 测试成功)中的链接,可以看到在正确的域下执行了XSS,而没有被重定向:

5. 延伸

经过公开的讨论,后续发现如下:

  • Location: 空的Location响应头可以在Chrome上成功执行内容中的XSS代码。(投稿时在最新版 Chrome v86.0.4240.111测试成功)
  • Location: resource://URL 使用resource协议也可以在Firefox 81 上执行payload。(投稿时在最新版 Firefox v82.0.2测试成功)
点击收藏 | 2 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖