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

换个思路玩XSS:用开发者工具和浏览器控制台动态调试haozi.me靶场

换个思路玩XSS:用开发者工具和浏览器控制台动态调试haozi.me靶场

在传统XSS漏洞学习中,我们往往习惯于直接提交payload并观察弹窗效果,这种方式虽然直观,却容易忽略浏览器解析机制、DOM树构建过程以及不同渲染引擎的细微差异。本文将带你用开发者工具的显微镜视角,重新解构haozi.me靶场的每个关卡,通过动态调试发现那些藏在标签闭合、字符编码和事件处理背后的秘密。

1. 为什么需要动态调试XSS?

当我们面对一个过滤了<script>标签的输入框时,静态思考通常会尝试各种编码变形。但如果你打开Chrome的Elements面板实时观察,可能会发现:

<div id="output"> &lt;img src=x onerror=alert(1)&gt; </div>

这里的关键在于服务器端实体编码(&lt;)与客户端解码的时机差异。通过控制台执行document.getElementById('output').innerHTML,你能立即看到浏览器实际解析的HTML结构:

> document.getElementById('output').innerHTML "<img src=x onerror=alert(1)>"

典型调试流程

  1. 在Network面板查看原始HTTP响应
  2. 在Elements面板定位注入点DOM位置
  3. 使用Console测试各种编码解码组合
  4. 通过右键"Edit as HTML"实时修改DOM验证思路

2. 开发者工具实战:突破常规过滤

2.1 闭合标签的多种姿势

以0x01关卡为例,当输入被插入到<textarea>中时,传统解法是直接闭合标签。但在Firefox中尝试以下操作:

// 获取textarea的outerHTML观察原始结构 document.querySelector('textarea').outerHTML // 尝试用十六进制编码闭合标签 testPayload = '</textarea\x3e<img src=x onerror=alert(1)>' document.querySelector('textarea').insertAdjacentHTML('afterend', testPayload)

浏览器差异注意点

浏览器\x3e的解释自动补全机制
Chrome立即解码可能补全缺失标签
Firefox保持原样较少自动修正
Safari视上下文而定严格遵循标准

2.2 事件处理的黑魔法

0x06关卡演示了如何利用type="image"特性绕过过滤。在控制台可以通过原型链检查发现:

const input = document.createElement('input') input.type = 'image' console.dir(input) // 查看onerror等隐藏属性

提示:在Elements面板右键任何节点选择"Store as global variable",即可在Console通过temp1引用该节点进行实验

3. 高级技巧:编码与解析的博弈

3.1 HTML实体编码的层叠效应

0x04关卡需要处理双重编码问题。通过以下步骤验证:

// 测试实体编码解码顺序 encodedPayload = '&lt;img src=x onerror=alert&amp;#40;1&amp;#41;&gt;' testDiv = document.createElement('div') testDiv.innerHTML = encodedPayload console.log(testDiv.firstChild.outerHTML)

关键发现

  • 第一次解码由浏览器HTML解析器完成
  • onerror属性内的编码由JavaScript引擎二次解码
  • 不同浏览器对&amp;#40;的处理存在毫秒级时序差异

3.2 Unicode同形字攻击的视觉欺骗

0x0E关卡涉及字符变形,在Console中可以这样检测:

// 检测视觉相似字符 function checkHomoglyph(char) { return { original: char, codePoint: char.codePointAt(0).toString(16), normalized: char.normalize('NFKD') } } checkHomoglyph('Å¿') // 返回真实Unicode信息

4. 浏览器工作流深度剖析

4.1 从输入到DOM的完整路径

  1. 原始输入阶段

    # 使用curl查看原始响应(模拟Network面板) curl -s https://xss.haozi.me/0x00 | grep -C10 "input"
  2. HTML解析阶段

    • 在Chrome的Performance面板录制页面加载过程
    • 观察"Parse HTML"事件中的详细调用栈
  3. 脚本执行阶段

    // 监控动态创建的脚本 const oldCreateElement = document.createElement document.createElement = function(tag) { console.log(`Creating <${tag}>`) return oldCreateElement.apply(this, arguments) }

4.2 安全机制绕过实践

以0x0A关卡的URL解析为例,在Console测试不同变体:

function testURL(url) { const a = document.createElement('a') a.href = url console.log({ origin: a.origin, hostname: a.hostname, pathname: a.pathname }) } testURL('https://www.segmentfault.com@xss.haozi.me/j.js')

跨浏览器测试结果

  • Chrome 103+:强制显示@符号警告
  • Firefox 98:静默处理但阻止脚本加载
  • Safari 15:完全执行原始逻辑

5. 打造个性化调试环境

5.1 自定义代码片段

在Sources面板的Snippets标签页创建以下工具函数:

// 快速测试payload function testXSS(payload) { const iframe = document.createElement('iframe') iframe.srcdoc = `<html><body>${payload}</body></html>` document.body.appendChild(iframe) setTimeout(() => iframe.remove(), 1000) } // 编码转换工具 const encoder = { html: s => s.replace(/[<>"&]/g, c => ({'<':'&lt;','>':'&gt;','"':'&quot;','&':'&amp;'}[c])), js: s => [...s].map(c => `\\x${c.charCodeAt(0).toString(16)}`).join('') }

5.2 自动化测试工作流

结合Puppeteer实现半自动化验证:

// 在DevTools的Console中可直接运行的代码 (async () => { const targets = [ '0x00', '0x01', '0x02' // 添加所有关卡路径 ] for (const target of targets) { const url = `https://xss.haozi.me/${target}` const iframe = document.createElement('iframe') iframe.src = url document.body.appendChild(iframe) await new Promise(resolve => { iframe.onload = () => { console.log(`Testing ${target}:`) // 在这里添加针对每个关卡的测试代码 iframe.remove() resolve() } }) } })()

在Edge浏览器中,还可以使用内置的WebView2工具直接调试iframe内容,无需手动移除安全限制。

http://www.rkmt.cn/news/1468673.html

相关文章:

  • 别再手动配集群了!用TongWeb集中管理+THS,30分钟搞定高可用Java应用部署
  • 2026年河北电采暖与京津冀/西北采暖方案深度横评指南 - 企业名录精选推荐
  • 山东链条导轨厂家实测排行:5家合规供应商客观对比 - 奔跑123
  • SAP ABAP开发:手把手教你用SMW0给程序加个Excel模板导入下载功能(附完整代码)
  • 基于BERT微调的多标签文本分类实战项目(含数据预处理、训练、预测全流程代码)
  • 从零搭建数字IC验证环境:我的VCS+Linux环境配置踩坑实录(附避坑指南)
  • 终极指南:3大秘籍教你用SMUDebugTool释放AMD Ryzen处理器隐藏性能
  • 2026年河北电采暖与京津冀/西北采暖方案深度测评指南 - 企业名录精选推荐
  • GitHub Desktop保姆级教程:从安装到第一次提交,避开新手所有坑
  • 嵌入式Linux文件系统挂载失败:从内核恐慌到系统启动的完整调试指南
  • 从“眼在手上”到“眼在手外”:两种机械臂视觉方案的手眼标定实战与选型指南
  • 暗黑破坏神2存档编辑器终极指南:3分钟轻松打造完美角色
  • SAP ABAP开发:手把手教你用SMW0和WWWDATA_IMPORT实现Excel模板上传下载(附完整代码)
  • 别再死磕三菱SLMP了!用Python+ModbusTCP搞定台达PLC数据读写(附完整代码)
  • Arduino-ESP32架构深度解析:从硬件抽象到物联网开发实战演进
  • 6月5号
  • 别再手动传文件了!用ABAP函数ZALSM_EXCEL_TO_INTERNAL_TABLE批量处理Excel数据上传
  • 2026上海黄金回收TOP1夺冠|S级标杆收的顶高价领跑全城回收市场 - 奢侈品回收评测
  • 2026执业医师笔试冲刺培训机构横向测评与选班参考 - 医考机构品牌测评专家
  • 实时客户预警系统设计:体验家 XMPlus 规则引擎从 0 到 1 的架构思考
  • FPGA数据流处理:乒乓操作与串并转换的设计与实现
  • 别再乱删快照了!VMware虚拟机硬盘空间告急,试试这3个无损瘦身技巧
  • 2026年6月台州婚纱照推荐 | 旺季选店不焦虑,4家高口碑品牌闭眼入 - 生活测评君
  • 台达PLC ModbusTCP通讯避坑指南:从报文抓包到实战调试(Wireshark实战分析)
  • pandas字符串运算列在字母前后添加字符
  • 2026年广西壮族自治区PMP培训机构哪家好?官方授权R.E.P.报考指南 - 众智商学院课程中心
  • Smart-SSO实战踩坑记:我的Vue项目接入单点登录,从403到成功的完整配置
  • 青岛高性价比钻石钻戒回收指南:禹竞名奢汇报价领先同行10%以上 - 奢侈品交易观察员
  • 手把手教你:从STM32F103切换到极海APM32的保姆级实战指南(附代码对比)
  • 期刊论文AI写作工具哪个好?精选4款写论文的AI,知网、维普AIGC检测轻松通过!