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

渗透实战:使用隐式转换覆盖toString的反射型xss

进入页面后到留言板查看源代码发现 back blog 选项下的代码有些东西

<a href="javascript:fetch('/analytics', {method:'post',body:'/post%3fpostId%3d4'}).finally(_ => window.location = '/')">Back to Blog</a>

<a href="javascript:...">Back to Blog</a>
这是一个超链接,href属性使用了javascript:协议,表示点击时会执行后续的JavaScript代码而非跳转URL。

fetch 向服务器端的/analytics路径发送请求,body参数是一个编码后的字符串(/post%3fpostId%3d1,解码后为/post?postId=1),可能是要记录的文章ID或用户行为数据。

无论fetch请求成功或失败,最终都会执行finally中的回调函数,将页面重定向到根路径/

漏洞点也确实在这里,我们一起看下 lab 给出的解题方法,分析下他的思路

https://YOUR-LAB-ID.web-security-academy.net/post?postId=5&%27},x=x=%3E{throw/**/onerror=alert,1337},toString=x,window%2b%27%27,{x:%27

在 hackbar 解码看一下

当我们输入这段 url 后,代码中的<a>标签内获取到我们输入的内容后完整代码如下:

<a href="javascript:fetch('/analytics', {method:'post',body:'/post?postId=5&'},x=x=>{throw/**/onerror=alert,1337},toString=x,window+'',{x:''}).finally(_ => window.location = '/')">Back to Blog</a>

其中fetch()函数是这样的

fetch('/analytics', {method: 'post',body: '/post?postId=5&'},  // 关键闭合点,&分隔参数,后面内容才会当作javascript执行x = x => { throw/**/ onerror = alert, 1337 },  // 定义恶意函数弹窗显示lab指定数字toString = x,              // 覆盖 toString 方法window + '',               // 触发 toString(){ 1: ''                    // 修复语法,为闭合最后的'}构造的
}).finally(_ => window.location = '/')

去掉&符号会导致参数错误,需要&作为参数分隔符

当点击 back to blog 按钮时,触发恶意函数执行。

lab 给出提示使用 alert 弹出字符 1337 完成 lab。

为了方便理解,我们可以写一段 html 代码去模拟复现

<html><h1>利用toString()触发的反射型xss</h1><script>throw 1337; //抛出一个错误</script>
</html>

经过测试, throw 后面的事件可以是任何事件,不一定非得是 onerror

throw a, b, c 的逻辑是依次执行后面的参数,但是只返回最后的参数值作为错误信息

例如我们 throw 后面传入三个触发 alert 的事件,最后传入 1339, 如下所示

依次弹窗 1,2,3 后抛出错误 1339

可以理解为 throw 会计算和执行后面的内容,只返回最后一个参数执行结果

依次弹窗 1,2 后返回最后的参数执行计算的结果 2

后面的逻辑就是将 x 赋值给 toString(),利用 window+''触发隐式转换

当对象与字符串相加时,JavaScript 会尝试调用对象的 toString() 方法进行隐式转换

由于toString()被恶意函数覆盖,导致执行了恶意函数。

http://www.lqws.cn/news/529795.html

相关文章:

  • Day43 复习日 图像数据集——CNN
  • 【PX4-AutoPilot教程-TIPS】PX4系统命令行控制台ConsolesShells常用命令(持续更新)
  • ES文件管理器v4.4.3(ES文件浏览器)
  • 鸿蒙 FoldSplitContainer 解析:折叠屏布局适配与状态管理
  • MySQL之存储函数与触发器详解
  • 多相机人脸扫描设备如何助力高效打造数字教育孪生体?
  • ethers.js express vue2 定时任务每天凌晨2点监听合约地址数据同步到Mysql整理
  • ASIO 避坑指南:高效、安全与稳健的异步网络编程
  • 微服务架构下面临的安全、合规审计挑战
  • Python打卡:Day37
  • 使用 Python 自动化文件获取:从 FTP 到 API 的全面指南
  • 【Bluedroid】蓝牙启动之 btm_acl_device_down 流程源码解析
  • 稳定币技术全解:从货币锚定机制到区块链金融基础设施
  • Java底层原理:深入理解线程与并发机制
  • GEO生成式引擎优化发展迅猛:热点数智化传播是GEO最佳路径
  • 人大金仓Kingbase数据库KSQL 常用命令指南
  • 【论文】云原生事件驱动架构在智能风控系统中的实践与思考
  • 小孙学变频学习笔记(八)变频器的输入电流(下)
  • RPC(Remote Procedure Call)技术解析
  • 计算机网络 网络层:控制平面(二)
  • WPF中Converter基础用法
  • 正则表达式,`[]`(字符类)和`|`(或操作符)
  • MFC制作动态波形图( ChartCtrl)
  • 【AI News | 20250626】每日AI进展
  • ​​Deepoc大模型在光电研发中的核心技术突破与应用​
  • 使用CSS泄露标签属性值 url路径遍历攻击 -- GPN CTF 2025 PAINting Dice
  • CSS 背景属性用于定义HTML元素的背景
  • 构思的股票交易模拟 3D 虚拟主题游戏《股海逐梦 3D》
  • c++17标准std::filesystem常用函数
  • HDFS(Hadoop分布式文件系统)总结