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里面是可以直接执行命令的
核心思想应该就是把赋值过的东西在赋值覆盖一下 这道题拖了好长时间了 今天终于完完全全的调试下来了
标签:WHOYOUARE,__,Object,proto,construstor,2022,prototype,强网,构造函数 From: https://www.cnblogs.com/kkkkl/p/17121278.html