一、输入与输出的防护机制
- 字符实体化
- 关键字变形
- 关键字去除
- 尖括号去除
二、xss防护规则的绕过
1.大小写,双写绕过
为了避免XSS漏洞的存在,通常应用会对用户输入进行一定的安全处理后再输出的HTML中,
防护的方法有:
- 过滤:发现关键字返回错误
- 编码:对关键字进行编码
- 插入:插入改变关键字的符号
- 删除:删除关键字
绕过防护的思路:
- 判断关键字
- 判断防护规则
- 尝试不同的payload
- 大小写,双写
关键的符号有:' " ()<>{}=&--;
关键字有:alert script javascript onclick 等
常见的事件属性:
onerror(当加载文档或者图片时(没找到)发生的错误时触发)
onmouseover(鼠标移入某个元素时触发)
onclick(点击某个对象时触发)
onload (元素加载完触发)
oninput(元素获取用户输入时触发)
oncut(用户剪切元素的内容时触发)
onscroll(文档滚动时触发)
2.编码绕过
2.1url编码
2.2 http实体编码
如果对JavaScript,alert过滤,可以进行url编码
payload:<a href="javascript:%61lert(1)">click me</a>
如果url编码不行,可以对其再进行一次http实体编码
payload:<a href="javascript:%61lert (1)">click me</a>
注意事项:
1.HTML十进制和十六进制编码的分号是可以去掉的。
2.实体编码的数字前可以加上很多的0进行绕过WAF,如 
2.3JavaScript编码
•1、三个八进制数字,如果不够个数,前面补0,例如"<"编码为:\074;
•2、两个十六进制数字,如果不够个数,前面补0,例如"<"编码为:\x3c;
•3、四个十六进制数字,如果不够个数,前面补0,例如"<"编码为:\u003c;(unicode编码)
•4、对于一些控制字符,使用特殊的C类型的转义风格(例如\n和\r)
浏览器是不会在html标签里解析js中的那些编码的! 但是onerror较特殊,onerror里的内容是当js解析的,因此可以用JSunicode编码,但是不能全部编码只能编码函数名。如果全部编码是会出错的