浅谈json参数解析对waf绕过的影响
字数 1558 2025-08-29 08:31:42

JSON参数解析对WAF绕过的影响 - 深度技术分析

0x00 背景介绍

在Web应用安全领域,WAF(Web应用防火墙)是保护网站免受攻击的重要防线。然而,由于HTTP协议支持多种数据传输格式,特别是JSON格式的广泛使用,使得攻击者可以利用JSON解析特性绕过WAF防护。

本文详细分析JSON格式数据在PHP+MySQL环境中解析时的特殊字符处理机制,以及如何利用这些特性绕过WAF防护。

0x01 基础概念

1.1 传统SQL注入示例

考虑以下PHP代码:

<?php
$id = $_GET['id'];
$sql = "select * from article where id=$id";
mysql_query($sql,$conn);
?>

攻击者可通过构造URL进行注入:

article.php?id=1 and 1=1

1.2 WAF防护原理

WAF通过检测HTTP请求中的恶意关键字(如"and 1=1")进行阻断。攻击者常用变形手法绕过:

  • and/**/1=1
  • and%0a1=1
  • and+1=1

0x02 JSON解析特性

2.1 JSON转义字符

JSON格式数据在解析时会进行特殊字符转义:

  • \""
  • \\\
  • \n → 换行符
  • \uXXXX → Unicode字符

2.2 测试环境

  • PHP 5.4.39
  • MySQL 5.1.73
  • 测试代码:
<?php
include_once 'global.php';
$id = json_decode($_GET['id'])->id;
for($i = 0; $i < strlen($id); $i++) {
    printf("%x",ord($id[$i]));
    echo ",";
}
$arc = getArticleInfo($id);
?>

0x03 编码探测与分析

3.1 URL编码探测

测试URL格式:

http://127.0.0.1/phpaacms/show.php?id={"id":"31 and%(00-FF)1=1"}

测试结果

  • %20(空格)和%2B(+)能被正确解析并作为SQL分隔符
  • 其他常见分隔符(%0A, %0B等)无法被json_decode解析

3.2 转义字符探测

测试URL格式:

http://127.0.0.1/phpaacms/show.php?id={"id":"31 and\%(00-FF)1=1"}

有效转义字符

  • \f (%66)
  • \n (%6E)
  • \r (%72)
  • \t (%74)

这些字符被解析后可作为MySQL单词分隔符。

3.3 Unicode编码探测

测试URL格式:

http://127.0.0.1/phpaacms/show.php?id={"id":"31 and\u00(00-FF)1=1"}

有效Unicode编码

  • \u0009 (制表符)
  • \u000A (换行)
  • \u000B (垂直制表符)
  • \u000C (换页)
  • \u000D (回车)
  • \u0020 (空格)
  • \u002B (+)

3.4 单词内插入测试

测试URL格式:

http://127.0.0.1/phpaacms/show.php?id={"id":"31 an\%(00-FF)d 1=1"}

测试结果

  • 所有转义字符都会破坏SQL语法
  • 无法在单词内部插入转义字符实现绕过

3.5 十六进制编码测试

  1. \00-\FF格式:
http://127.0.0.1/phpaacms/show.php?id={"id":"31 and(00-FF) 1=1"}
  1. \x00-\xFF格式:
http://127.0.0.1/phpaacms/show.php?id={"id":"31 and\x(00-FF)1=1"}

测试结果

  • 两种格式均无法被json_decode正确解析

0x04 有效绕过字符总结

在JSON环境下,以下字符可作为MySQL分隔符绕过WAF:

类型 有效字符
URL编码 %20 (空格), %2B (+)
转义字符 \f, \n, \r, \t
Unicode编码 \u0009, \u000A, \u000B, \u000C, \u000D, \u0020, \u002B

0x05 实战绕过案例

5.1 针对某云WAF的绕过

  1. URL编码绕过

    • %20被拦截
    • %2B未被拦截
  2. 转义字符绕过

    • 使用\r, \f, \n, \t均未被拦截
  3. 注释符变形
    传统/**/可能被拦截,但JSON格式下可使用:

    {\"id\":\"1 and\/**\/1=1\"}
    

    \/会被解析为/,形成有效分隔符

0x06 防御建议

  1. WAF改进方向

    • 加强对JSON格式数据的深度解析
    • 考虑JSON解码后的实际执行效果
    • 增加对转义字符和Unicode编码的检测
  2. 开发建议

    • 使用参数化查询而非字符串拼接
    • 对JSON解析后的数据进行严格过滤
    • 实施最小权限原则

0x07 结论

JSON参数解析的特殊性为WAF绕过提供了新的途径。WAF产品需要充分考虑业务系统的数据交互流程,特别是各种编码格式的解析细节,才能有效防御此类绕过攻击。同时,开发者应从源头避免SQL注入漏洞的产生,而非单纯依赖WAF防护。

JSON参数解析对WAF绕过的影响 - 深度技术分析 0x00 背景介绍 在Web应用安全领域,WAF(Web应用防火墙)是保护网站免受攻击的重要防线。然而,由于HTTP协议支持多种数据传输格式,特别是JSON格式的广泛使用,使得攻击者可以利用JSON解析特性绕过WAF防护。 本文详细分析JSON格式数据在PHP+MySQL环境中解析时的特殊字符处理机制,以及如何利用这些特性绕过WAF防护。 0x01 基础概念 1.1 传统SQL注入示例 考虑以下PHP代码: 攻击者可通过构造URL进行注入: 1.2 WAF防护原理 WAF通过检测HTTP请求中的恶意关键字(如"and 1=1")进行阻断。攻击者常用变形手法绕过: and/**/1=1 and%0a1=1 and+1=1 0x02 JSON解析特性 2.1 JSON转义字符 JSON格式数据在解析时会进行特殊字符转义: \" → " \\ → \ \n → 换行符 \uXXXX → Unicode字符 2.2 测试环境 PHP 5.4.39 MySQL 5.1.73 测试代码: 0x03 编码探测与分析 3.1 URL编码探测 测试URL格式: 测试结果 : 仅 %20 (空格)和 %2B (+)能被正确解析并作为SQL分隔符 其他常见分隔符( %0A , %0B 等)无法被json_ decode解析 3.2 转义字符探测 测试URL格式: 有效转义字符 : \f ( %66 ) \n ( %6E ) \r ( %72 ) \t ( %74 ) 这些字符被解析后可作为MySQL单词分隔符。 3.3 Unicode编码探测 测试URL格式: 有效Unicode编码 : \u0009 (制表符) \u000A (换行) \u000B (垂直制表符) \u000C (换页) \u000D (回车) \u0020 (空格) \u002B (+) 3.4 单词内插入测试 测试URL格式: 测试结果 : 所有转义字符都会破坏SQL语法 无法在单词内部插入转义字符实现绕过 3.5 十六进制编码测试 \00-\FF 格式: \x00-\xFF 格式: 测试结果 : 两种格式均无法被json_ decode正确解析 0x04 有效绕过字符总结 在JSON环境下,以下字符可作为MySQL分隔符绕过WAF: | 类型 | 有效字符 | |------|---------| | URL编码 | %20 (空格), %2B (+) | | 转义字符 | \f, \n, \r, \t | | Unicode编码 | \u0009, \u000A, \u000B, \u000C, \u000D, \u0020, \u002B | 0x05 实战绕过案例 5.1 针对某云WAF的绕过 URL编码绕过 : %20 被拦截 %2B 未被拦截 转义字符绕过 : 使用 \r , \f , \n , \t 均未被拦截 注释符变形 : 传统 /**/ 可能被拦截,但JSON格式下可使用: \/ 会被解析为 / ,形成有效分隔符 0x06 防御建议 WAF改进方向 : 加强对JSON格式数据的深度解析 考虑JSON解码后的实际执行效果 增加对转义字符和Unicode编码的检测 开发建议 : 使用参数化查询而非字符串拼接 对JSON解析后的数据进行严格过滤 实施最小权限原则 0x07 结论 JSON参数解析的特殊性为WAF绕过提供了新的途径。WAF产品需要充分考虑业务系统的数据交互流程,特别是各种编码格式的解析细节,才能有效防御此类绕过攻击。同时,开发者应从源头避免SQL注入漏洞的产生,而非单纯依赖WAF防护。