Intigriti的2020年5月XSS挑战
字数 1274 2025-08-20 18:18:23
Intigriti 2020年5月XSS挑战解析与利用
挑战概述
Intigriti的2020年5月XSS挑战是一个专门针对Firefox浏览器的跨站脚本攻击挑战。挑战要求参赛者在特定页面上执行XSS攻击,利用了Firefox浏览器在处理URL路径时的特殊行为。
关键发现
1. 路径覆盖漏洞
访问https://challenge.intigriti.io/a/时,浏览器会将a/视为目录,并尝试从该目录加载相对子资源:
- 原本应加载
/style.css和/widgets.js - 现在尝试加载
/a/style.css和/a/widgets.js
2. 开放重定向漏洞
https://challenge.intigriti.io//<location>是一个开放重定向端点:
- 例如:
https://challenge.intigriti.io//physuru.github.io会重定向到https://physuru.github.io - 访问
https://challenge.intigriti.io//(双斜杠后无内容)则加载默认页面
3. Firefox特有的路径遍历行为
Firefox在处理路径遍历时有两个特殊行为:
- 当点(.)位于路径末尾时,不会删除两个点(..)和先前的路径组件
- 这些点中至少有一个必须是百分比编码的
例如:https://challenge.intigriti.io/abc/.%2E在Firefox中会保留尾随点和前一路径组件
漏洞利用技术
组合利用方案
结合上述发现,可以构造以下攻击URL:
https://challenge.intigriti.io//physuru.github.io%252fintigriti_may_2020_solution/.%2E
技术原理
-
双重编码:使用
%252f(双重编码的斜杠/),因为URL会被解码两次- 第一次解码:
%252f→%2f - 第二次解码:
%2f→/
- 第一次解码:
-
路径解析:
- 服务器端:将
a/.%2E解析为..,相当于忽略这部分路径,返回默认页面 - 浏览器端:仍从
//a目录加载相对子资源,请求https://a/widgets.js并被重定向
- 服务器端:将
-
恶意JS加载:
- 攻击者控制
https://physuru.github.io/intigriti_may_2020_solution/目录 - 在该目录下放置恶意
widgets.js文件 - 通过上述URL构造使页面加载恶意JS文件
- 攻击者控制
关键注意事项
- HTTPS要求:重定向URL必须使用HTTPS,HTTP测试不会成功
- GitHub限制:不能直接使用GitHub Gists作为重定向目标
- Firefox专属:此漏洞利用依赖于Firefox的特定路径处理行为
防御建议
-
服务器端:
- 严格验证和清理URL路径
- 避免开放重定向
- 实施内容安全策略(CSP)
-
客户端:
- 保持浏览器更新
- 注意异常URL结构
- 使用现代XSS防护机制
总结
这个挑战展示了如何组合多个看似无害的漏洞(路径覆盖、开放重定向)和浏览器特定行为来实施XSS攻击。它强调了全面安全评估的重要性,包括考虑不同浏览器的解析差异和URL编码的复杂性。