一次多版本.net系统代码审计
字数 1476 2025-08-23 18:31:25
.NET多版本系统代码审计实战教学
前言
本教学文档基于一次实际的.NET多版本系统代码审计经验,重点分析不同版本系统中存在的安全漏洞,特别是未授权访问和文件上传漏洞。通过本案例,您将学习到如何对.NET系统进行代码审计,发现常见漏洞。
环境准备
-
工具准备:
- dnSpy:用于反编译.NET程序集
- Visual Studio:用于代码分析和调试
- Nuclei:用于漏洞验证
-
目标获取:
- 获取目标系统的bin.rar文件(包含编译后的程序集)
- 注意不同版本的系统可能存在差异
审计流程
1. 初步分析
- 快速检查配置文件(如web.config)寻找数据库连接字符串等敏感信息
- 扫描常见漏洞(如未授权访问接口)
2. 版本差异分析
本案例中发现了三个版本的系统:
- 老版本:漏洞较多
- 中版本:部分漏洞修复
- 新版本:大部分漏洞已修复但引入了新功能
3. 供应商定制化分析
注意不同企业可能有定制化功能,可能导致特有漏洞
漏洞分析
1. 未授权访问漏洞
老版本:
mobileController下的多个方法未进行授权检查- 可利用接口众多,但部分需要特定参数
- 典型危害:信息泄露(如人员手机号等敏感信息)
中版本改进:
- 开始使用
AllowAnonymous特性明确标记无需授权的接口 ImgFile功能默认关闭
审计技巧:
- 搜索Controller中未使用
[Authorize]特性的方法 - 检查是否有接口遗漏了权限控制
2. 文件上传漏洞
老版本发现:
-
直接图片上传getshell:
- 搜索
SaveAs方法找到上传功能 - 未充分验证文件类型和内容
- 可直接上传恶意文件获取Webshell
- 搜索
-
参数完全可控的上传:
- 上传路径、文件名等参数均可控
- 原始附件目录不可解析,但可通过目录穿越上传到Web根目录
版本差异:
- 中版本:修复了文件上传漏洞
- 新版本:其他漏洞修复但新增了功能(需特别关注)
审计技巧:
- 全局搜索
SaveAs方法 - 检查文件类型验证逻辑
- 检查上传路径是否可控
- 检查是否有目录穿越可能
3. SQL注入漏洞
老版本发现:
- 存在传统SQL注入漏洞
- 未使用参数化查询或ORM
审计技巧:
- 搜索直接拼接SQL字符串的代码
- 检查数据库操作是否使用参数化查询
4. 反序列化漏洞
经检查,系统中未发现反序列化漏洞
5. 任意用户登录漏洞
特殊案例:
- 某企业定制化功能导致
- 通过用户名即可获取对应cookie
- 典型危害:身份认证绕过
代码审计重点区域
-
Controller层:
- 检查权限控制
- 检查输入验证
- 检查敏感操作
-
文件操作:
- 文件上传
- 文件包含
- 路径操作
-
数据库操作:
- SQL拼接
- ORM使用情况
-
身份认证:
- Cookie生成
- Session管理
- 认证绕过可能
防御建议
-
权限控制:
- 默认拒绝所有请求
- 明确标记无需授权的接口(使用
AllowAnonymous) - 实施基于角色的访问控制
-
文件上传:
- 验证文件类型(内容和扩展名)
- 限制上传目录权限
- 使用随机文件名
- 禁止目录穿越
-
SQL注入防御:
- 使用参数化查询
- 使用ORM框架
- 实施最小权限原则
-
定制化功能安全:
- 对定制功能进行安全评审
- 避免引入认证绕过逻辑
总结
通过本次多版本.NET系统代码审计,我们发现了以下关键点:
- 版本迭代过程中,漏洞会被修复但也可能引入新问题
- 供应商定制化开发可能带来特有漏洞
- 未授权访问和文件上传是高危常见漏洞
- 系统重构可能改变安全状况,需要重新评估
代码审计时应关注不同版本差异和定制化功能,这些往往是漏洞的高发区域。