细品某语义waf的xss防护(3)
问题背景
- 经过前期调研,标签中下面的危险属性可以用来做xss攻击:
- href属性
- src属性
- on事件属性
- srcdoc属性
- xlink:href
- action
- formaction
- data (object标签)
假设攻击场景如下
1 | 漏洞输出位置是 <标签 危险属性="用户输出可控位置">,比如: |
经过前期调研,在属性值中有下面这些利用方式:
- javascript:js代码
- js代码 (on事件属性)
- data:text/html
- script脚本地址 (script标签的src属性)
在这个场景下,不考虑其他的利用手段,验证厂商语义waf的安全防护策略
分析思路:
- 针对在属性中每一种利用方式测试,根据拦截情况推测安全防护策略
分析过程
javascript:js代码
攻击场景是
1 | <a/href="用户输出可控点"></a> |
测试过程
1 | a=javascript:console.xxx() 拦截 |
小结:
- 解析js && 是否存在”函数()”形式的函数调用 && 获取调用函数名 && 函数名在黑名单中(前缀匹配) 则拦截
- 解析js && 是否存在”对象.函数()”形式的函数调用 && 获取函数名、对象名 && 将危险对象名扩充到黑名单中 && (函数名在黑名单中 || 对象名在对象黑名单中) 则拦截
- 解析js && (危险对象赋值 || 危险函数赋值) && 调用函数 则拦截
js代码
攻击场景是
1 | <svg/onload="用户输出点"> |
测试过程
1 | a=alert() 拦截 |
小结:
- 解析js && 存在”对象.函数()”形式或者”函数()”函数形式的函数调用 && 函数名是否在黑名单中 则拦截
data:text/html
攻击场景是
1 | <iframe src="用户输出可控点"> |
测试过程
1 | data:text/html;base64;PGltZy9vbmxvYWQ9eHg 不拦截 |
小结:不拦截
script脚本地址 (script标签)
攻击场景是
1 | <script src="用户输出点"> |
测试过程
1 | http://xxx.com/a.js 应该拦截,但是没有拦截. 说明不拦截这种攻击场景 |
小结:不拦截
总结
拦截策略,可能是:
- 解析js && 是否存在”函数()”形式的函数调用 && 获取调用函数名 && 函数名在黑名单中(前缀匹配) 则拦截
- 解析js && 是否存在”对象.函数()”形式的函数调用 && 获取函数名、对象名 && 将危险对象名扩充到黑名单中 && (函数名在黑名单中 || 对象名在对象黑名单中) 则拦截
- 解析js && (危险对象赋值 || 危险函数赋值) && 调用函数 则拦截
- 解析js && 存在”对象.函数()”形式或者”函数()”函数形式的函数调用 && 函数名是否在黑名单中 则拦截