我们创建的每个函数都有一个 prototype(原型)属性,这个属性是一个指针,指向一个对象,设计原型的初衷无非是对于每个实例对象,其拥有的共同属性没必要对每个对象实例再分配一片内存来存放这个属性。而可以上升到所有对象共享这个属性,而这个属性的实体在内存中也仅仅只有一份。
而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法
打个不太恰当的比喻,对于每个对象,都有其原型对象作为共享仓库,共享仓库中有属性和方法供生产每个对象实例时使用1> 原型链和继承
原型链是在原型上实现继承的一种形式举个例子:
在上面的例子中
拿一张业内很经典的图来看看
user --(__proto__)--> Function.prototype --(__proto__)--> Object.prototype那么就可以通过这个进行多级污染,payload为如下形式:
lodash版本 < 4.17.12看下官方样例PoC的调试过程:
CVE-2019-10744:在低版本中的lodash.defaultDeep函数中,Object对象可以被原型链污染,从而可以配合其他漏洞。
Question: 注意到PoC中的lodash.defaultsDeep({}, JSON.parse(payload));是要求先传入一个object实例的(此处为{})
所以还是具体分析一下合并的过程(来看下assigner的一些底层实现)
注意:通常而言,合并需要考虑深浅拷贝的问题
官方修复,直接上waf:检测JSON中的payload中的key值[img=720,285.9734167318217]https://icfh-imgs-1313391192.cos.ap-nanjing.myqcloud.com/images/image-20230501210253505.png[/img]
此处对比一下lodash4.17.12之前的版本,key值过滤得更为严格
总结一下,CVE-2019-10744可用的payload
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |