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()>为例,我们可以将其分解为以下部分:

  1. 起始标签<svg (head)
  2. 事件处理onload (event)
  3. 事件和等于号之间
  4. 触发后执行函数alert() (func)
  5. 等于号和执行函数之间
  6. 结束标签> (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

绕过点

  1. 绕过匹配onxxx=的规则
  2. 绕过匹配=alert的规则
  3. 绕过匹配alert()的规则

5. 测试环境

测试靶场:http://brutelogic.com.br/xss.php?a=1

6. 防御建议

对于防御方,建议:

  1. 全面考虑所有可能的填充符变体
  2. 实现多层过滤机制
  3. 对HTML标签结构进行完整解析而非简单模式匹配
  4. 考虑使用内容安全策略(CSP)等高级防御措施

7. 总结

填充符在WAF和过滤器绕过中扮演着关键角色,通过:

  • 破坏语法结构
  • 利用多种空白字符和分隔符
  • 组合使用不同位置的填充符

安全研究人员需要构建系统的fuzz思路,针对具体场景分析可能的绕过方式。正如文中所说:"只要思路好,waf绕到老"。

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).* 示例 : 3.2 事件处理和等于号之间的填充符 可用填充符 : %20 - 空格 %09 - 水平制表符 %0a - 换行符 %0d - 回车符 %0c - 换页符 特点 : 可以重复使用 正则表达式描述: (filler).* 示例 : 3.3 等于号和执行函数之间的填充符 与3.2节相同,使用相同的填充符集合。 3.4 函数名和括号之间的填充符 特殊填充符 : %0b - 垂直制表符 原理 : 在引号外使用时, %0b 可以将函数名和括号连在一起,不会造成分隔 浏览器会认为 alert%0b() 仍然是事件的一部分 可以重复使用(如 %0b%0b ) 正则表达式描述: (%0B).* 示例 : 3.5 结束标签的填充符 可用填充符 : %20 - 空格 // - 双斜杠 > - 直接结束 %0a - 换行符 %0d - 回车符 %09 - 水平制表符 %0c - 换页符 特点 : 可以重复使用(如 %0a%0a ) 正则表达式描述: (filler).* 示例 : 4. 组合绕过技术 通过组合使用不同类型的填充符,可以绕过多种WAF和过滤规则: 示例payload : 绕过点 : 绕过匹配 onxxx= 的规则 绕过匹配 =alert 的规则 绕过匹配 alert() 的规则 5. 测试环境 测试靶场:http://brutelogic.com.br/xss.php?a=1 6. 防御建议 对于防御方,建议: 全面考虑所有可能的填充符变体 实现多层过滤机制 对HTML标签结构进行完整解析而非简单模式匹配 考虑使用内容安全策略(CSP)等高级防御措施 7. 总结 填充符在WAF和过滤器绕过中扮演着关键角色,通过: 破坏语法结构 利用多种空白字符和分隔符 组合使用不同位置的填充符 安全研究人员需要构建系统的fuzz思路,针对具体场景分析可能的绕过方式。正如文中所说:"只要思路好,waf绕到老"。