ASP.NET 代码审计
字数 1735 2025-08-25 22:58:35
ASP.NET 代码审计全面指南
0x00 ASP.NET 基础介绍
ASP.NET 开发框架
- ASP.NET Core:新一代跨平台框架
- ASP.NET Framework:传统Windows平台框架
项目类型
-
WebApplication:
- 命名空间(namespace)结构
- 所有代码编译为单一程序集(位于bin目录)
- 代码修改后需要重启应用
-
WebSite:
- 无命名空间结构
- 每个ASPX页面独立编译为DLL
- 代码修改无需重启
关键文件
-
web.config:
- XML格式配置文件
- 存储数据库连接字符串、安全验证等
- 加载顺序:
当前目录 → 上级目录 → 根目录 → %windir%/Microsoft.NET/Framework/v2.0.50727/CONFIG/web.config → %windir%/Microsoft.NET/Framework/v2.0.50727/CONFIG/machine.config
-
Global.asax:
- 全局应用程序类
- 处理应用程序/会话级别事件
- 常用于实现全局过滤器
常见文件扩展名
| 扩展名 | 描述 |
|---|---|
| .aspx | Web窗体文件 |
| .cs | 类文件 |
| .aspx.cs | Web窗体后台代码 |
| .ascx | Web用户控件 |
| .asmx | Web服务文件 |
| .asax | 全局应用文件 |
| .config | 配置文件 |
| .ashx | HTTP处理程序 |
| .soap | SOAP扩展文件 |
0x01 注入漏洞审计
典型注入场景
-
未参数化查询:
string sql = "SELECT * FROM users WHERE id=" + Request["id"]; Instance.ExeDataSet(sql); // 直接执行拼接的SQL -
绕过身份验证的注入点:
- 通过特殊参数绕过验证(如
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对象直接获取的参数
安全编码实践
// 正确做法 - 参数化查询
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 认证机制
-
认证模式:
- Windows:IIS集成认证
- Passport:微软集中式认证
- Forms:表单认证(最常用)
- None:依赖IIS认证
-
Forms认证配置:
<system.web> <authentication mode="Forms" /> <authorization> <deny users="?"/> <!-- 禁止匿名访问 --> </authorization> </system.web>
常见越权类型
-
垂直越权:
- 普通用户访问管理员功能
- 检查
RoleHelper.IsAdmin等权限验证
-
水平越权:
- 用户A访问用户B的数据
- 缺少资源所有权验证
-
认证绕过:
- 伪造身份认证Cookie
- 示例:
userinfo=userid=1&roles=administrators
权限验证缺陷
-
缺失全局验证:
- 未继承基类或母版页验证
- 直接访问URL绕过验证
-
Cookie/Session验证缺陷:
// 不安全示例 - 仅依赖Cookie验证 if (HttpContext.Current.Request.Cookies["userinfo"] != null) { return int.Parse(HttpContext.Current.Request.Cookies["userinfo"]["userid"]); } -
权限验证逻辑缺陷:
// 不安全更新操作 - 无权限验证 public void UpdateProfile() { string sql = "UPDATE users SET password=@pwd WHERE uid=@id"; // 缺少当前用户与目标ID的权限比对 }
安全实践建议
-
实施RBAC:
- 基于角色的访问控制
- 明确角色权限划分
-
资源级权限验证:
// 安全示例 - 验证资源所有权 public void UpdateProfile(int userId) { if (CurrentUser.Id != userId && !CurrentUser.IsAdmin) { throw new UnauthorizedAccessException(); } // 安全更新逻辑 } -
使用ASP.NET内置机制:
<location path="admin"> <system.web> <authorization> <allow roles="Administrators"/> <deny users="*"/> </authorization> </system.web> </location>
审计工具链
-
反编译工具:
- 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应用中的安全风险。