案例分享: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 测试过程

  1. 尝试在Location头中插入CRLF字符
  2. 在CRLF后添加HTML+JS代码尝试构造XSS
  3. 发现常规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 其他发现

  1. 空Location头:在Chrome上可执行响应正文中的XSS代码
  2. 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头。

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协议列表进行测试,使用格式: 4.3 有效协议 测试发现以下协议在Firefox上有效: ws:// (WebSocket) wss:// (Secure WebSocket) 4.4 其他发现 空Location头 :在Chrome上可执行响应正文中的XSS代码 resource协议 : Location: resource://URL 在Firefox上可执行payload 5. 攻击构造示例 5.1 WebSocket协议示例 5.2 空Location头示例 5.3 resource协议示例 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头。