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();
}

代码逻辑流程

  1. 从URL的hash部分获取参数
  2. 如果有hash值,调用displayReason函数
  3. displayReason函数:
    • 将reason存入window.location.hash
    • 发起AJAX请求获取./reasons/${reason}.txt文件
    • 请求完成后调用reasonLoaded函数
  4. reasonLoaded函数:
    • 获取id为"reason"的元素
    • 将响应文本unescape后设置为该元素的innerHTML

漏洞分析

初始测试

直接尝试在URL的hash部分插入XSS payload:

https://example.com/#<script>alert(1)</script>

发现404页面会对特殊字符进行编码处理,并将%替换为_,无法直接利用。

突破点发现

尝试访问.htaccess等受保护文件时,发现403响应中的XSS语句完整保留,未经过滤。

关键发现:

  • 403错误页面不会对响应内容进行处理
  • 可以构造特殊请求使服务器返回403错误

利用限制

  1. AJAX请求默认访问reasons文件夹下内容,要访问.htaccess需要跳转上级目录
  2. 需要二次编码.htaccess参数才能获取正确的response

绕过CSP限制

CSP规则为:

default-src 'self';

限制:

  • 所有资源必须来自同源
  • 无法直接执行内联脚本

解决方案

利用404页面返回的内容作为JS代码执行:

  1. 通过404页面返回的内容构造JS语句
  2. 使用script标签的src属性引入
  3. 需要注意单引号的闭合

最终利用链

关键步骤

  1. 构造payload使服务器返回403错误
  2. 从403响应中获取未过滤的内容
  3. 利用这些内容构造JS执行环境

绕过innerHTML限制

由于innerHTML插入的<script>标签不会执行,需要使用iframesrcdoc属性:

<iframe srcdoc='<script src="x%27-alert(document.domain)-%27"></script>'>

完整Payload

  1. 构造iframe payload:
<iframe srcdoc='<script src="x%27-alert(document.domain)-%27"></script>'>
  1. 对payload进行二次URL编码

  2. 放入location.hash中触发

总结

这个挑战展示了如何:

  1. 利用服务器对不同错误页面的不同处理方式
  2. 绕过CSP限制执行JS代码
  3. 解决innerHTML对script标签的限制
  4. 通过编码技巧绕过过滤机制

关键突破点在于发现403错误页面不会过滤响应内容,从而可以利用它来存储和传递XSS payload。

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