在测试XSS漏洞的时,不少同鞋会从大量Payload中随便挑选几个顺眼来尝试,没有弹窗就放弃了,这种方法并不是很科学,一些稍微隐秘点的XSS基本都能逃过这样的检查。下面我将从XSS的本质讲起,给各位分享一下我的XSS测试方法。
XSS属于注入类漏洞,其本质是:在前端代码中用户可以控制内容的地方(简称可控点),拼接上一段可被浏览器执行的新语句。这里可被浏览器执行是关键,不管你正在测试的点是否有漏洞,首先拼接上去的脚本同上下文看来,需要一定程度的符合前端代码的语法结构。
举例,标签的文本内容为可控点时
<div id="div1">可控点</div>
需要使用 <> 来另起一个标签,不然浏览器只会认为这里面是纯文本内容,如:
<div id="div1"><img src=a οnerrοr=alert(0)></div>
<div id="div1"><script>alert(0)</script></div>
……
再举例,标签的属性值为可控点时
<div id="可控点">div1</div>
需要使用 " 来闭合本来就有的引号,如:
<div id="" οnclick="alert(0)">div1</div>
<div id=""><a href="javascript:alert(0)">div1</div>
(👆这条语法有问题,<a>标签没有,但是正如我上面说了,我们插入的脚本一定程度的符合语法结构即可,大多数浏览器会很“智能”补上去)
……
有时属性值这里使用 ' 也能闭合,因为这里开发写不写单双引号,浏览器都会改成双引号
再再举例,标签事件调用方法所传参数为可控点时
<a οnclick="tiaozhuan('可控点')">
这里既可以使用 " 闭合,又可以使用 ' 闭合
<a οnclick="tiaozhuan('"href="javascript:alert(0)"a="')">
👆这个和上个例子其实是一样的,只是破坏了这个onclick方法
<a οnclick="tiaozhuan('',alert(0),'')">
👆这个,js不像java那么严谨,定义好的方法,入参可以自己随便加
……
再再再举例,js代码中的可控点
<script>
var a = '可控点1';
var b = document.getElementById('可控点2').value;
……
</script>
这里情况太多,只举两个简单的,希望你能懂我意思,可控点1这里得用 '; 来闭合
var a = '';alert(0);var xxx='';
可控点2这里要闭合的东西有点多
var b = document.getElementById('xxx').value;
alert(0);
var hhh=document.getElementById('xxx').value;
js代码里面的闭合一定要严谨,哪怕只多了这么一个小东西,都会导致一大段js无法执行
上面的例子并不是全部情况,在合适的地方用合适的方法,总之,不要只拿着死的Payload来测试,要懂得灵活闭合和绕过,绕过下节讲。