在做XSS DOM型的时候,总是很不理解为什么网上的一些笔记博客要先闭合和标签,找了很久之后终于找到了一篇博客,说的还挺好的。 这里给一下博客地址:XSS DOM
DVWA靶场中,low级别很容易,直接插入就好了。
medium级别的时候,无论怎么插入都是不会成功的。
这是因为后端代码把script这个标签进行了处理,stripos这个函数是用来检测default输入里面有没有<script这个标签,如果有的话就直接跳转到default=English这个页面,所以就必须换成其他的标签,。img/body这样的标签。由于此时的插入的语句实在option标签和select标签当中。**
由于select标签内只允许内嵌option标签,而option标签中能内嵌script标签但不能内嵌img等标签,因此需要在注入时先闭合option和select标签从而使注入的标签逃逸出来执行XSS:
</option></select><img src=1 onerror=alert(1)>
所以medium级别的payload就是:
</option></select><img src=1 onerror=alert(1)>
high级别的时候由于此时限制了白名单,所以考虑用#进行利用,URL栏的#号之后的内容并不会发送至服务器端,JS应用该符号实现在页面创建加载过程中定向到指定的页面内容上。
所以high级别的payload可以为:
English#</option></select><img src=1 onerror=alert(1)>
#前面写个English是因为要进行白名单绕过,可以查看后端代码。
impossible级别说是服务器端不需要做任何防御措施,防御的关键在于客户端上。我的理解是:因为我们的插入什么的提交之后都是提交到服务端,然而这里服务端没有任何防御措施,但是客户段发出请求的时候把该做的都做了,所以数据信息到服务端时便什么也没了。