http://mdsec.net/error/92/
http://mdsec.net/error/95/
http://mdsec.net/error/107/
http://mdsec.net/error/109/
http://mdsec.net/error/118/
某些情况下,服务器端应用程序可能会实施旨在阻止基于DOM的XSS攻击的过滤。即使客户端出现易受攻击的操作,服务器并不在响应中返回用户提交的数据,但是URL仍然被提交给了服务器;因此,当应用程序检测到恶意有效载荷时,它会对数据进行确认,且不会返回易受攻击的客户端脚本。
如果遇到这种防御,渗透测试员应该尝试使用前面在查找反射型XSS漏洞时描述的每一种可能避开过滤的攻击方法,测试服务器数据确认机制的可靠性。除这些攻击外,还有几种专门针对基于DOM的XSS漏洞的技巧可用于帮助攻击有效载荷避开服务器端确认。
当客户端脚本从URL中提取参数值时,它们很少将查询字符串正确解析成名/值对。相反,它们通常会在URL中搜索后面紧跟着等号(=)的参数名称,然后提取出等号以后直到URL结束位置的内容。这种行为能够以两种方式加以利用:
如果服务器根据每个参数而不是整个URL应用确认机制,那么可以将有效载荷插入到附加在易受攻击的参数后面的一个虚构的参数中。例如:
这时,虚构的参数被服务器忽略,因此不会受到任何过滤。但是,因为客户端脚本在查询字符串中搜索message=,并提取其后的全部内容,所以它处理的字符串中正好包含该有效载荷。
如果服务器对整个URL而不仅仅是消息参数应用确认机制,仍然可以将有效载荷插入到HTML片断字符#的右边,从而避开过滤。例如:
这时,片断字符串仍然属于URL的一部分,因此被保存在DOM中,并由易受攻击的客户端脚本处理。但是,由于浏览器并不将URL中的片断部分提交给服务器,因此攻击字符串不会传送到服务器中,因而不会被任何服务器端过滤所阻止。因为客户端脚本提取message=后面的全部内容,所以有效载荷仍然被复制到HTML页面源代码中。