Intigriti Easter XSS challenge
字数 1096 2025-08-20 18:17:53
Intigriti Easter XSS Challenge 详细解析
挑战概述
这是一个由Intigriti发布的XSS挑战,成功在限定时间内完成可以获得一年的Burp Suite正版证书。挑战要求利用跨站脚本漏洞绕过各种安全限制。
代码分析
主要功能逻辑位于script.js文件中:
var hash = document.location.hash.substr(1);
if (hash){
displayReason(hash);
}
document.getElementById("reasons").onchange = function(e){
if(e.target.value != "")
displayReason(e.target.value);
}
function reasonLoaded() {
var reason = document.getElementById("reason");
reason.innerHTML = unescape(this.responseText);
}
function displayReason(reason){
window.location.hash = reason;
var xhr = new XMLHttpRequest();
xhr.addEventListener("load", reasonLoaded);
xhr.open("GET", `./reasons/${reason}.txt`);
xhr.send();
}
代码逻辑流程
- 从URL的hash部分获取参数
- 如果有hash值,调用
displayReason函数 displayReason函数:- 将reason存入window.location.hash
- 发起AJAX请求获取
./reasons/${reason}.txt文件 - 请求完成后调用
reasonLoaded函数
reasonLoaded函数:- 获取id为"reason"的元素
- 将响应文本unescape后设置为该元素的innerHTML
漏洞分析
初始测试
直接尝试在URL的hash部分插入XSS payload:
https://example.com/#<script>alert(1)</script>
发现404页面会对特殊字符进行编码处理,并将%替换为_,无法直接利用。
突破点发现
尝试访问.htaccess等受保护文件时,发现403响应中的XSS语句完整保留,未经过滤。
关键发现:
- 403错误页面不会对响应内容进行处理
- 可以构造特殊请求使服务器返回403错误
利用限制
- AJAX请求默认访问
reasons文件夹下内容,要访问.htaccess需要跳转上级目录 - 需要二次编码
.htaccess参数才能获取正确的response
绕过CSP限制
CSP规则为:
default-src 'self';
限制:
- 所有资源必须来自同源
- 无法直接执行内联脚本
解决方案
利用404页面返回的内容作为JS代码执行:
- 通过404页面返回的内容构造JS语句
- 使用script标签的src属性引入
- 需要注意单引号的闭合
最终利用链
关键步骤
- 构造payload使服务器返回403错误
- 从403响应中获取未过滤的内容
- 利用这些内容构造JS执行环境
绕过innerHTML限制
由于innerHTML插入的<script>标签不会执行,需要使用iframe的srcdoc属性:
<iframe srcdoc='<script src="x%27-alert(document.domain)-%27"></script>'>
完整Payload
- 构造iframe payload:
<iframe srcdoc='<script src="x%27-alert(document.domain)-%27"></script>'>
-
对payload进行二次URL编码
-
放入location.hash中触发
总结
这个挑战展示了如何:
- 利用服务器对不同错误页面的不同处理方式
- 绕过CSP限制执行JS代码
- 解决innerHTML对script标签的限制
- 通过编码技巧绕过过滤机制
关键突破点在于发现403错误页面不会过滤响应内容,从而可以利用它来存储和传递XSS payload。