2022强网拟态 WHOYOUARE
2022强网拟态 WHOYOUARE
先说一下这个思路 由于禁用了__proto__
所以我们可以通过constructor.prototype
来绕过
之前一直不明白为什么是这样绕过的后来仔细研究了一下 本人菜鸡 如果是有分析错误的地方 欢迎大佬来斧正
说一下这样绕过的原理
我们对象的__proto__
指向的是该对象的原型 构造函数 的prototype
也是指向生成对象的原型
所以就有 对象的__proto__
===构造函数 的prototype
然后还有一个东西叫做 constructor
这个东西呢是 原型才有的
我们可以看到这个constructor
属性呢指向的是构造函数 这个例子中Object
是构造函数
然后我们又可以通过构造函数来寻找到原型 这里利用construstor.prototype
然后看一这个对象.construstor.prototype
就指向的是对象的原型
因为 这里我们在对象中是找不到construstor
的 那他就会在上层 ,对象的__proto__
属性中去找construstor
而对象的__proto__
属性也就是是 函数的prototype
他这个里面是由指向构造函数的constrstor
然后又通过prototype
找到对象的原型
这样解释感觉有点乱 但是理解了prototype,__proto__,construstor
和继承关系之后 自己去想一想还是很好想通的
通过 这篇文章来理解他们三个之间的关系
现在我们理解了 为什那么可以通过construstor.prototype
来绕过__proto__
之后我们继续看往下怎么污染 污染什么
这里我们污染大Object
污染1为cat /flag
这个必须要污染的值的属性名是1 因为我们要覆盖 数组下标为1的id 所以必须是1 一下是随意污染的值的属性名的情况 (vscode的调试真的超级好用!!!!!)
一定要污染到大Object
因为这个数组command的下标为什么能赋值覆盖的 是因为这里的command数组进行了继承
由于我们污染了大Object 然后数组的往上找 的原型是Array
再往上才是Object
所以正确的payload就是
{"user":"{\"command\":[\"-c\"],\"constructor\":{\"prototype\": {\"1\": \"cat /flag\"}}}"}
{"user":"{\"command\":[\"-c\"]}"}
这里是在本机Windows里面调得 linux里面是可以直接执行命令的
核心思想应该就是把赋值过的东西在赋值覆盖一下 这道题拖了好长时间了 今天终于完完全全的调试下来了
最新文章
- DOG检测
- NoSQL-Redis【2】-HDEL给我的一个惊喜
- SevenZip.pas BUG修改版 - 20160613
- VLAN
- 理解netty对protocol buffers的编码解码
- GCD编程 之 略微提高篇
- C语言qsort函数用法
- stm32 usb数据接收与数据发送程序流程分析
- Android 相对布局常用属性
- Android手机设置隐藏命令大全
- Win8.1应用开发之异步编程
- redhat Redis的安装和部署
- 拓扑排序下的有无环判定 STL方法
- Mego开发文档 - 加载关系数据
- vue部署的路径问题
- 计算机网络ip地址
- spring InitializingBean和DisposableBean init-method 和destroy-method @PostConstruct @PreDestroy
- r里面如何实现两列数据合并为一列
- week3-构造一个简单的linux系统
- 11慕课网《进击Node.js基础(一)》Buffer和Stream
热门文章
- 学习ASP.NET Core Blazor编程系列二十六——登录(5)
- JavaScript的闭包和作用域
- Linux练习题--打印文本第10行
- 学习Vue过程中遇到的问题---code: 'MODULE_NOT_FOUND'
- 【KAWAKO】audiotsm-使用python对音频进行变速不变调处理
- JZOJ 5351. 【NOIP2017提高A组模拟9.7】简单无向图
- JSP 与 Servlet 之间的联系,及其语法
- ubuntu 启动脚本变化
- ISE_14.7_Windows10安装
- Create 1select+jdbc+jsp