ASP.NET 代码审计
字数 1735 2025-08-25 22:58:35

ASP.NET 代码审计全面指南

0x00 ASP.NET 基础介绍

ASP.NET 开发框架

  • ASP.NET Core:新一代跨平台框架
  • ASP.NET Framework:传统Windows平台框架

项目类型

  1. WebApplication

    • 命名空间(namespace)结构
    • 所有代码编译为单一程序集(位于bin目录)
    • 代码修改后需要重启应用
  2. WebSite

    • 无命名空间结构
    • 每个ASPX页面独立编译为DLL
    • 代码修改无需重启

关键文件

  1. web.config

    • XML格式配置文件
    • 存储数据库连接字符串、安全验证等
    • 加载顺序:
      当前目录 → 上级目录 → 根目录 → 
      %windir%/Microsoft.NET/Framework/v2.0.50727/CONFIG/web.config → 
      %windir%/Microsoft.NET/Framework/v2.0.50727/CONFIG/machine.config
      
  2. Global.asax

    • 全局应用程序类
    • 处理应用程序/会话级别事件
    • 常用于实现全局过滤器

常见文件扩展名

扩展名 描述
.aspx Web窗体文件
.cs 类文件
.aspx.cs Web窗体后台代码
.ascx Web用户控件
.asmx Web服务文件
.asax 全局应用文件
.config 配置文件
.ashx HTTP处理程序
.soap SOAP扩展文件

0x01 注入漏洞审计

典型注入场景

  1. 未参数化查询

    string sql = "SELECT * FROM users WHERE id=" + Request["id"];
    Instance.ExeDataSet(sql); // 直接执行拼接的SQL
    
  2. 绕过身份验证的注入点

    • 通过特殊参数绕过验证(如g=p)
    • 示例payload:purchase/orderdetail.aspx?g=p&t=view&sid=1%20and%201=user--

审计方法

  1. 使用dnSpy反编译DLL

    • 定位关键类方法(如Book.Login)
    • 跟踪SQL语句构建过程
  2. SQL Server Profiler监控

    • 实时捕获应用执行的SQL语句
    • 验证用户输入是否被正确过滤
  3. 重点关注

    • ExeDataSet/ExeScalar等方法调用
    • 字符串拼接构建的SQL语句
    • Request对象直接获取的参数

安全编码实践

// 正确做法 - 参数化查询
string sql = "SELECT uid FROM users WHERE username=@username AND password=@password";
SqlParameter[] prams = {
    new SqlParameter("@username", username),
    new SqlParameter("@password", Helper.Encrypt(password))
};

0x02 越权漏洞审计

ASP.NET 认证机制

  1. 认证模式

    • Windows:IIS集成认证
    • Passport:微软集中式认证
    • Forms:表单认证(最常用)
    • None:依赖IIS认证
  2. Forms认证配置

    <system.web>
      <authentication mode="Forms" />
      <authorization>
        <deny users="?"/> <!-- 禁止匿名访问 -->
      </authorization>
    </system.web>
    

常见越权类型

  1. 垂直越权

    • 普通用户访问管理员功能
    • 检查RoleHelper.IsAdmin等权限验证
  2. 水平越权

    • 用户A访问用户B的数据
    • 缺少资源所有权验证
  3. 认证绕过

    • 伪造身份认证Cookie
    • 示例:userinfo=userid=1&roles=administrators

权限验证缺陷

  1. 缺失全局验证

    • 未继承基类或母版页验证
    • 直接访问URL绕过验证
  2. Cookie/Session验证缺陷

    // 不安全示例 - 仅依赖Cookie验证
    if (HttpContext.Current.Request.Cookies["userinfo"] != null) {
        return int.Parse(HttpContext.Current.Request.Cookies["userinfo"]["userid"]);
    }
    
  3. 权限验证逻辑缺陷

    // 不安全更新操作 - 无权限验证
    public void UpdateProfile() {
        string sql = "UPDATE users SET password=@pwd WHERE uid=@id";
        // 缺少当前用户与目标ID的权限比对
    }
    

安全实践建议

  1. 实施RBAC

    • 基于角色的访问控制
    • 明确角色权限划分
  2. 资源级权限验证

    // 安全示例 - 验证资源所有权
    public void UpdateProfile(int userId) {
        if (CurrentUser.Id != userId && !CurrentUser.IsAdmin) {
            throw new UnauthorizedAccessException();
        }
        // 安全更新逻辑
    }
    
  3. 使用ASP.NET内置机制

    <location path="admin">
      <system.web>
        <authorization>
          <allow roles="Administrators"/>
          <deny users="*"/>
        </authorization>
      </system.web>
    </location>
    

审计工具链

  1. 反编译工具

    • dnSpy
    • ILSpy
    • dotPeek
  2. 数据库监控

    • SQL Server Profiler
    • Entity Framework Profiler
  3. HTTP流量分析

    • Fiddler
    • Burp Suite
    • OWASP ZAP
  4. 代码扫描工具

    • Visual Studio Code Analysis
    • Security Code Scan
    • OWASP Dependency Check

典型漏洞模式速查表

漏洞类型 危险代码模式 安全实践
SQL注入 字符串拼接SQL 参数化查询
认证绕过 仅Cookie验证 多因素认证
垂直越权 缺失角色检查 RBAC实现
水平越权 无资源所有权验证 用户上下文验证
信息泄露 详细错误信息 自定义错误页
文件上传 无类型/内容验证 白名单验证

通过系统性地检查这些关键点,可以有效识别ASP.NET应用中的安全风险。

ASP.NET 代码审计全面指南 0x00 ASP.NET 基础介绍 ASP.NET 开发框架 ASP.NET Core :新一代跨平台框架 ASP.NET Framework :传统Windows平台框架 项目类型 WebApplication : 命名空间(namespace)结构 所有代码编译为单一程序集(位于bin目录) 代码修改后需要重启应用 WebSite : 无命名空间结构 每个ASPX页面独立编译为DLL 代码修改无需重启 关键文件 web.config : XML格式配置文件 存储数据库连接字符串、安全验证等 加载顺序: Global.asax : 全局应用程序类 处理应用程序/会话级别事件 常用于实现全局过滤器 常见文件扩展名 | 扩展名 | 描述 | |--------|------| | .aspx | Web窗体文件 | | .cs | 类文件 | | .aspx.cs | Web窗体后台代码 | | .ascx | Web用户控件 | | .asmx | Web服务文件 | | .asax | 全局应用文件 | | .config | 配置文件 | | .ashx | HTTP处理程序 | | .soap | SOAP扩展文件 | 0x01 注入漏洞审计 典型注入场景 未参数化查询 : 绕过身份验证的注入点 : 通过特殊参数绕过验证(如 g=p ) 示例payload: purchase/orderdetail.aspx?g=p&t=view&sid=1%20and%201=user-- 审计方法 使用dnSpy反编译DLL : 定位关键类方法(如 Book.Login ) 跟踪SQL语句构建过程 SQL Server Profiler监控 : 实时捕获应用执行的SQL语句 验证用户输入是否被正确过滤 重点关注 : ExeDataSet / ExeScalar 等方法调用 字符串拼接构建的SQL语句 Request对象直接获取的参数 安全编码实践 0x02 越权漏洞审计 ASP.NET 认证机制 认证模式 : Windows :IIS集成认证 Passport :微软集中式认证 Forms :表单认证(最常用) None :依赖IIS认证 Forms认证配置 : 常见越权类型 垂直越权 : 普通用户访问管理员功能 检查 RoleHelper.IsAdmin 等权限验证 水平越权 : 用户A访问用户B的数据 缺少资源所有权验证 认证绕过 : 伪造身份认证Cookie 示例: userinfo=userid=1&roles=administrators 权限验证缺陷 缺失全局验证 : 未继承基类或母版页验证 直接访问URL绕过验证 Cookie/Session验证缺陷 : 权限验证逻辑缺陷 : 安全实践建议 实施RBAC : 基于角色的访问控制 明确角色权限划分 资源级权限验证 : 使用ASP.NET内置机制 : 审计工具链 反编译工具 : dnSpy ILSpy dotPeek 数据库监控 : SQL Server Profiler Entity Framework Profiler HTTP流量分析 : Fiddler Burp Suite OWASP ZAP 代码扫描工具 : Visual Studio Code Analysis Security Code Scan OWASP Dependency Check 典型漏洞模式速查表 | 漏洞类型 | 危险代码模式 | 安全实践 | |---------|------------|----------| | SQL注入 | 字符串拼接SQL | 参数化查询 | | 认证绕过 | 仅Cookie验证 | 多因素认证 | | 垂直越权 | 缺失角色检查 | RBAC实现 | | 水平越权 | 无资源所有权验证 | 用户上下文验证 | | 信息泄露 | 详细错误信息 | 自定义错误页 | | 文件上传 | 无类型/内容验证 | 白名单验证 | 通过系统性地检查这些关键点,可以有效识别ASP.NET应用中的安全风险。