细品某语义waf的xss防护(1)

问题背景

假设攻击场景如下

1
2
3
4
5
6
7
xss漏洞输出位置如下:

<div>用户输出可控位置</div>

攻击者准备利用on事件来执行js,比如

<div><svg onload="alert('xss');"></div> 利用onload属性

验证在这个场景下厂商的安全防护策略

分析思路:

  1. 改变payload,根据拦截情况推测安全防护策略

分析过程

1
2
a=<xxx/onmouseover="xxx.xxx=aaaa">  不拦截
a=<img/onmouseover="xxx.xxx=aaaa"> 拦截

说明区分了认识的标签和不认识的标签

1
2
'a=<div/oxx="xxx.xxx=aaaa">'    不拦截
'a=<div/onxx="xxx.xxx=aaaa">' 拦截

拦截on事件,只要以on开头就拦截

1
2
3
a=<xxx/onmouseover="xxx.xxx=aaaa('';">   on属性值中少一个右括号就不拦截,说明判断js语法是否正确
a=<xxx/onmouseover="xxx.xxx=aaaa('');"> 拦截
a=<xxx/onmouseover="xxx.xxx=aaaa;"> 不拦截

未知标签 && on事件 && 解析on属性中js && on属性中调用了函数 则拦截

1
2
a=<xxx/onxxx=a();>     不拦截
a=<xxx/onxxx=xxxxx;a();> 拦截

on属性值需要大于一定长度

1
2
3
a=<img/onxxxx="aaa">  不拦截

a=<img/onxxxx="aaaaaaa"> 拦截

已知标签on属性值大于一定长度则拦截

总结

存在HTML解析和JS解析

安全防护策略可能是:

  • HTML解析 && 未知标签 && on事件 && on属性值大于一定长度 && 对on属性值做JS解析 && on属性中调用了函数 则拦截
  • HTML解析 && 已知标签 && on事件 && on属性值大于一定长度 则拦截