首先我们先看一个案例
location.hash是一个锚点获取URL的注释后面的东西
打断点:
可以看到传值如下:
循环利用removeAttribute去除掉
但是结果,本改被移除的onerror属性逃逸出来了,把一个正常的属性删掉了??为什么会造成这样的问题
看看代码分析吧
其实真正的含义:跟指针有点像,删了一个后面一个给前面跑,指针指到后面直接变为空了也就停止了
那很简单刚才的源码传入上面加上多余属性,src和alert输出了
案例升级
属性全被拿到空数组里面,在空数组里面去进行循环删除
但是,两个<svg>就可以????循环删除???
很明显svg删掉了,为什么删了还能看到???
执行顺序???
当我们使用 innerHTML
直接将HTML字符串插入到DOM中时,浏览器会解析这个HTML并创建相应的DOM元素。如果HTML中包含了JavaScript事件处理器(例如svg、 onload
、onclick
等),这些处理器在所有属性被删除之前就已经被识别并准备执行了。因此,我们的代码虽然删除了 onload
属性,但是恶意的JavaScript代码已经设置好并准备执行了。
那dom破坏怎么破坏呢??(这里替换掉)
首先先尝试name和id都是不可以的,那我们加个form标签呢??
很明显ok了,这里报错了,说form不是一个可迭代对象
为什么会报这个错??说明一个事情,它不能被for循环,很简单再加一个input
这确实破坏了,但是有什么用???我们需要思考form被留下了,form可不可以触发我们的xss漏洞 ,我们的焦点就可以实现
http://127.0.0.1/appcms-master/demo2.html#<form tabindex=1 onfocus="alert(1);" this.removeAttribute('onfocus');" autofocus="true"><input name=attributes><input name=attributes></form>
好了了解了基础知识
开始闯关
多了一个过滤框架
源码,所有的代码都会通过这个框架去进行过滤
白名单
通过分析代码,我们找到漏洞点
这里的attributes是不是和我们上面举的例子一样
那这里的东西能不能替代,如果可以替代,length是空的,控制是undefined,空值的话直接跳出循环不循环了,它就不会走下面了,那我的恶意属性就不会被删除了
好了知道思路了我们去尝试
<form id=x tabindex=0 onfocus=alert(document.cookie)><input id=attributes>
之后我们一直试着tab(出现了)