首页
/ CoreRuleSet项目中PHP过滤器绕过问题分析与改进方案

CoreRuleSet项目中PHP过滤器绕过问题分析与改进方案

2025-06-30 11:06:28作者:裴麒琰

问题背景

在Web应用安全防护领域,CoreRuleSet(CRS)作为ModSecurity的规则集,一直致力于提供全面的攻击防护。近期发现一个关于PHP注入攻击检测的潜在绕过问题,涉及PHP标签与XML声明的混淆使用。

技术细节

该问题的核心在于PHP解释器对标签语法的灵活处理。PHP允许使用<?xml :作为有效的PHP代码起始标记,其中的冒号(:)实际上是一个PHP标签(label)语法。这种特性使得攻击者可以构造特殊的"XML/PHP多语言"载荷,绕过现有的PHP注入检测规则。

具体表现为:

  • 攻击载荷示例:<?xml :echo 1;或更复杂的<?xml :fputCSV($alreadyOpenFile, array("foo", "bar"));
  • 这些载荷在PHP解释器中会被正常执行,但CRS的PHP注入检测规则(933100)未能有效识别

现有防护机制分析

当前CRS的933100规则使用以下正则表达式检测PHP注入:

(?:<\?(?:[^x]|x[^m]|xm[^l]|xml[^\s]|xml$|$)|<\?php|\[(?:/|\x5c)?php\])

该规则能够检测:

  • 基本的PHP开放标签<?<?php
  • 不完整的XML声明如<?x<?xm
  • 无空格后续内容的XML声明如<?xml:

但存在以下不足:

  • 无法检测<?xml :(带空格和冒号)这种有效PHP语法
  • 对XML声明后跟PHP代码的情况检测不够全面

改进方案

基于XML规范(W3C TR/xml)和PHP语法特性的深入分析,提出以下改进方案:

  1. XML声明规范分析

    • 合法XML声明格式为<?xml后跟版本、编码等属性
    • 只允许特定属性名:version、encoding、standalone
    • 属性间只允许特定空白字符(#x20、#x9、#xD、#xA)
  2. 改进的正则表达式

    (?:<\?(?:[^x]|x[^m]|xm[^l]|xml[^\s]|xml$|xml\s*[^a-zA-Z]|$)|<\?php|\[(?:/|\x5c)?php\])
    
    • 新增xml\s*[^a-zA-Z]模式检测非法后续内容
    • 保持对原有攻击模式的兼容检测
    • 严格限制XML声明后只能跟字母(属性名)或规范允许的空白
  3. 实现策略

    • 将复杂正则表达式分解为可维护的数据文件
    • 通过生成器构建最终规则表达式
    • 确保不影响现有规则性能

实际影响评估

该改进方案能够有效检测以下攻击变种:

  • <?xml :后跟任意PHP代码
  • 带多个空格的变种如<?xml :
  • 其他非规范XML声明后跟可执行代码的情况

同时避免了误报合法XML声明的情况,如:

  • <?xml version="1.0"?>
  • <?xml encoding="UTF-8"?>

总结

此次改进展示了安全规则集开发中的典型挑战:需要在多种语言规范间找到精确的检测平衡点。通过深入分析PHP和XML的语法规范,CRS项目组实现了既保持高检测率又避免误报的改进方案,进一步巩固了其对PHP注入攻击的防护能力。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
27
11
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
466
3.47 K
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
10
1
leetcodeleetcode
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
65
19
flutter_flutterflutter_flutter
暂无简介
Dart
715
172
giteagitea
喝着茶写代码!最易用的自托管一站式代码托管平台,包含Git托管,代码审查,团队协作,软件包和CI/CD。
Go
23
0
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
203
82
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.27 K
695
rainbondrainbond
无需学习 Kubernetes 的容器平台,在 Kubernetes 上构建、部署、组装和管理应用,无需 K8s 专业知识,全流程图形化管理
Go
15
1
apintoapinto
基于golang开发的网关。具有各种插件,可以自行扩展,即插即用。此外,它可以快速帮助企业管理API服务,提高API服务的稳定性和安全性。
Go
22
1