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, 代码执行, 代码混淆, 类型转换, 编程技巧