arxenix/phpfuck
GitHub: arxenix/phpfuck
phpfuck 是一项仅使用 5 个字符即可编写并执行任意 PHP 代码的代码混淆与精简实验,展示了通过异或和类型杂凑逐步构造任意字符串的技术。
Stars: 31 | Forks: 2
# phpfuck
仅使用 5 个不同的字符编写并执行任意 PHP。
```
(^.9)
```
仅在 PHP7 中有效(目前)
# 工作原理
- `9^99` -> `106`
- 使用异或来生成数字
- `(9).(9)` -> `'99'`
- 使用 `.` 将数字拼接成字符串
- `'09'^'1069'^'99'` -> `'80'`
- 对两个字符串进行异或操作以获取一个字符串
- `'80'^0` -> `80`
- (滥)用类型杂凑将字符串转换为整数
- 结合上述技巧,你可以获取 0-9 的所有数字
- 可以通过拼接数字来构造任何 `/[0-9]+/` 字符串
- 可以通过转换为整数来获取任意数字
- 构造任意字符串需要更多的步骤......
- `(99999999999...)` -> `INF`
- 309 个 9 会得到 `INF`
- `(INF).(9)` -> `'INF9'`
- 现在可以获取 `/[a-zA-Z]/` 范围内的字符值了!
- 例如,`'INF9'^'00'^'33'^'99'` -> `'st'`
- 我们最初用于获取字符串的唯一原语是拼接,它会产生一个长度为 2 的字符串
- 我们可以生成 `/[a-z]{2,}|[A-Z]{2,}/`,但无法获取单字符的字符串
- `'funcname'(param)`
- 只需调用函数的字符串名称即可调用该函数
- 函数名不区分大小写
- `strtok(0)` -> `false`
- 对数字调用 strtok 以获取 `false`
- `=== ('st'+'rt'+'OK')(0)`
- `(9).false` -> `'9'`
- 将数字与 `false` 拼接以获取长度为 1 的字符串
- `'rw'^'99'^'9'` -> `'r'`
- 使用异或提取任何字符串的第一个字符
- 现在可以构建任意字符串 `/[a-zA-Z]/` 了
- `'CHr'(num)`
- 生成其他字符(例如空格)
- 现在可以构建任何字符串了!`/.*/`
- `str_getcsv("a,b")` -> `["a", "b"]`
- 通过解析 CSV 创建字符串数组
- `func(...["a", "b"])`
- 使用展开运算符将多个参数传递给函数
- `create_function("", "PAYLOAD")()`
- 使用 `create_function` 创建一个包含任意 PHP 代码的函数,然后调用它
- 最终的 payload 类似于:`'create_function'(...str_getcsv(',"$PAYLOAD"'))`
# 先前的研究
[PHPFuck](https://github.com/splitline/PHPFuck) 由 splitline 编写 - 使用 7 个不同的字符 `([+.^])`
我们在此基础上进行了改进,通过
- 使用异或和拼接从一个初始值获取更多数字(不需要加号)
- 使用数字代替 `[]` 让我们能够去掉一个括号
# 待办事项
- 与其他 PHP 版本的兼容性
- 基础字符串生成适用于 4.3.0 - 8.0.3
- 函数调用 'func'() 在 <= 7 的版本中不起作用,必须先将其赋值给一个变量
- 匿名函数也仅在 7+ 中支持
- 可以执行类似 `call_user_func(...["assert","eval('echo 1; return 1;')"]);` 的操作
- 仅适用于 5.6-7
- ... 展开运算符仅在 5.6+ 中支持
- `create_function` 在 PHP8 中已移除。不知道是否有任何方法可以 eval 代码,以便我们能够使用语言结构。
- 生成网站?
标签:OpenVAS, PHP, 代码执行, 代码混淆, 类型转换, 编程技巧