案例分享:Location 302跳转 + CRLF 场景下如何构造XSS
字数 1250 2025-08-19 12:41:36
Location 302跳转 + CRLF 场景下的XSS构造技术
1. 漏洞背景
本案例研究了一种特殊的XSS攻击场景,结合了302跳转和CRLF注入漏洞。这种攻击在特定浏览器环境下可以绕过常规的安全限制,实现跨站脚本攻击。
2. 基本概念
2.1 302跳转
HTTP 302状态码表示临时重定向,服务器会通过Location响应头指定重定向目标。浏览器通常会忽略302响应的正文内容。
2.2 CRLF注入
CRLF(Carriage Return Line Feed)指回车换行符(\r\n)。当应用程序未正确处理用户输入中的这些字符时,攻击者可以注入额外的HTTP头或修改现有头。
3. 漏洞发现
3.1 初始发现
- 目标系统存在URL跳转功能
- GET参数直接输出在Location响应头中,无任何过滤
- 系统解析换行符和回车符(CRLF)
3.2 测试过程
- 尝试在Location头中插入CRLF字符
- 在CRLF后添加HTML+JS代码尝试构造XSS
- 发现常规302响应下浏览器不解析响应正文
4. 绕过技术研究
4.1 已有研究
Fortinet研究人员发现可以通过将Location头设置为mailto://开头的URI来绕过302跳转限制。
4.2 Fuzz测试
基于IANA协议列表进行测试,使用格式:
http://acme.corp/?redir=[URI_SCHEME]://gremwell.com%0A%0A[XSS_PAYLOAD]
4.3 有效协议
测试发现以下协议在Firefox上有效:
ws://(WebSocket)wss://(Secure WebSocket)
4.4 其他发现
- 空Location头:在Chrome上可执行响应正文中的XSS代码
- resource协议:
Location: resource://URL在Firefox上可执行payload
5. 攻击构造示例
5.1 WebSocket协议示例
http://vulnerable.site/redirect?url=ws://example.com%0A%0A<script>alert(document.domain)</script>
5.2 空Location头示例
http://vulnerable.site/redirect?url=%0A%0A<script>alert(document.domain)</script>
5.3 resource协议示例
http://vulnerable.site/redirect?url=resource://example.com%0A%0A<script>alert(document.domain)</script>
6. 浏览器兼容性
| 技术 | Firefox | Chrome | IE |
|---|---|---|---|
| ws:// | ✓ | ✗ | ✗ |
| 空Location | ✗ | ✓ | ✗ |
| resource:// | ✓ | ✗ | ✗ |
7. 防御措施
7.1 输入验证
- 严格过滤用户输入中的CRLF字符(
\r,\n,%0A,%0D) - 使用白名单机制验证重定向URL
7.2 输出编码
- 对输出到HTTP头中的内容进行编码
- 使用专门的库函数设置HTTP头
7.3 其他措施
- 避免直接将用户输入放入Location头
- 使用中间跳转页代替直接302重定向
- 设置Content-Security-Policy头限制脚本执行
8. 总结
本案例展示了如何利用CRLF注入和特殊协议绕过302跳转限制实现XSS攻击。这种攻击需要特定浏览器环境,但危害性仍然很高。防御此类攻击需要严格过滤用户输入,并正确设置HTTP头。