记一次通用.NET系统通杀漏洞挖掘:从登录旁路到敏感信息泄露
字数 3740 2025-09-23 19:27:46
针对通用.NET MVC系统漏洞挖掘与审计教学文档
1. 目标系统与技术栈分析
- 系统架构: 经典的ASP.NET MVC (Model-View-Controller) 应用程序。
- 技术栈: 基于 .NET Framework。
- 审计重点: 核心业务逻辑(Controller中的方法)与权限控制机制(如过滤器、Session管理)。
MVC架构快速入门(用于代码审计)
对于漏洞挖掘者,理解MVC架构有助于快速定位代码:
- Model (模型): 负责数据处理(如数据库的增删改查CRUD操作)、业务逻辑实现。漏洞高发区域,如SQL注入、不安全的直接对象引用(IDOR)等逻辑漏洞常在此处。
- View (视图): 负责用户界面显示(.aspx, .cshtml等文件)。在代码审计中通常关注度较低,但可能存在XSS漏洞。
- Controller (控制器): 接收用户HTTP请求,调用相应的Model进行处理,并返回结果给View。这是漏洞挖掘的首要切入点,因为所有用户请求的入口点都在这里。
2. 漏洞挖掘流程详解
0x01 登录逻辑初探与旁路尝试
-
第一步:定位入口点
- 方法: 在源代码中全局搜索登录相关关键词,如
login,Login,SignIn。 - 目标: 找到处理登录请求的Controller和Action方法。
- 方法: 在源代码中全局搜索登录相关关键词,如
-
第二步:代码审计与黑盒测试
- 审计登录代码时,发现其对名为
inWxlogin的请求参数有特殊处理逻辑。代码逻辑疑似:如果该参数存在,则可能跳过正常的用户名密码验证。 - 漏洞假设: 存在登录旁路漏洞,通过添加特定参数可无需凭证直接登录。
- 测试验证:
- Payload: 在登录请求中附加参数
?inWxlogin=true或类似值。 - 结果: 系统报错。分析: 并非漏洞不存在,而是目标环境可能已更新补丁,但该思路依然有效,在其他未修复的系统上可能成功。
- Payload: 在登录请求中附加参数
- 审计登录代码时,发现其对名为
0x02 关键Session方法审计 - 发现未授权访问
-
第一步:追踪Session设置逻辑
- 在登录方法中,发现其调用了一个名为
setLoginSession的方法来设置用户会话(Session)。这是登录成功后的关键步骤。 - 全局搜索
setLoginSession,未发现其调用链有直接问题。
- 在登录方法中,发现其调用了一个名为
-
第二步:扩大审计范围 - 审查基类
- 发现登录Controller继承自一个名为
BaseController的基类。这是一种常见的代码复用方式。 - 审计
BaseController,发现其中定义了另一个关键方法:setLoginOperatorSession。该方法的功能也是设置登录Session。 - 关键发现:
BaseController类自身或其继承的Controller均未配置[Authorize]等访问控制过滤器(Attribute)。在ASP.NET MVC中,这意味着任何继承自BaseController的类中的公共方法(Public Method)都可以被直接通过URL访问,除非该方法本身被标记为[ChildActionOnly]或非公共。
- 发现登录Controller继承自一个名为
-
第三步:漏洞验证
- 尝试直接访问: 构造URL直接访问
setLoginOperatorSession方法(例如:/BaseController/SetLoginOperatorSession或/某Controller/SetLoginOperatorSession)。 - 结果: 方法可以被访问,但执行报错(通常是因为缺少必要的参数)。这证明了未授权访问的确存在。
- 尝试直接访问: 构造URL直接访问
-
第四步:分析利用条件
- 分析
setLoginOperatorSession方法的代码,确定其需要哪些参数才能成功执行。通常需要传入用户标识(如userId)和令牌(token)。
- 分析
0x03 会话伪造与初步权限获取
-
Payload构造与利用
- 根据方法所需参数构造HTTP请求。链接中提到需要传入一个经过Base64编码的Token(原始Token可能格式不正确导致报错)。
- 请求示例 (POST/GET):
POST /XXController/SetLoginOperatorSession HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded userId=test123&token=Base64EncodedTokenHere - 结果: 请求成功,服务器响应中设置了新的登录Session Cookie。至此,已实现任意用户会话伪造(Session Fixation)和登录绕过。
-
权限测试与遇到的新问题
- 使用新伪造的Session Cookie访问系统主页,成功进入系统。
- 但在尝试操作具体功能时,系统返回 “Token错误”。
- 分析: 系统存在二次校验机制。虽然本地Session验证已通过,但在执行核心业务功能时,系统会向服务器远端或另一个服务校验Token的有效性。我们伪造的Token无法通过该校验。
0x04 绕过远程Token校验
-
思路:寻找信息泄露点
- 既然无法直接绕过远端校验,目标是获取一个有效的、真实的Token。
- 在已获得的低权限会话下,遍历系统功能点,寻找可能泄露敏感信息(如Token) 的地方。
-
黑盒测试与关键突破
- 发现一个“查询学生信息”的功能点(例如:
querystudent)。 - 测试过程:
- 向该功能发送测试请求(如提供测试学号)。
- 虽然该功能的响应主体仍然返回“Token错误”,但分析HTTP响应体的其他部分或响应头时,发现服务器错误地将有效的Token信息(如
userId和token)直接返回在了响应内容中。这通常是由于开发调试信息未关闭或错误处理逻辑不当导致。
- 结果: 从错误响应中提取到了合法用户的
userId和token。
- 发现一个“查询学生信息”的功能点(例如:
-
完成利用链
- 使用泄露出来的真实
userId和token,再次调用setLoginOperatorSession方法。 - 此次设置的Session所携带的Token是真实有效的。
- 最终结果: 成功获得一个功能完整、能通过远端Token校验的稳定高权限会话。
- 使用泄露出来的真实
0x05 敏感信息泄露漏洞挖掘
-
定位敏感功能
- 在拥有稳定权限后,全局搜索与查询相关的关键词,如
geStulnfo,query,get。 - 定位到负责查询学生信息的具体方法(如
geStulnfo)。
- 在拥有稳定权限后,全局搜索与查询相关的关键词,如
-
漏洞验证
- 直接调用
geStulnfo方法,并传入目标学生的参数(如学号、ID)。 - 结果: 接口成功返回了该学生的全部详细信息,包括但不限于:姓名、身份证号、手机号、家庭住址、学籍信息等极度敏感的数据。
- 直接调用
-
漏洞定性
- 漏洞类型: 敏感信息泄露。
- 根源:
- 越权访问 (Broken Access Control): 该接口可能缺乏有效的权限验证,导致任意登录用户(甚至未授权用户)均可访问。
- 过度数据暴露: 接口一次性返回了所有字段,而非最小必要字段。
0x06 漏洞通杀性分析
-
为何可通杀?
- 这套漏洞利用链基于目标系统采用的特定代码架构(如存在未授权访问的
BaseController)和实现逻辑(如Session管理方式、Token校验机制、错误信息泄露)。 - 许多.NET MVC系统,尤其是由同一供应商开发或采用相同基础框架、架构相似的系统,很可能存在完全相同的代码缺陷。
- 这套漏洞利用链基于目标系统采用的特定代码架构(如存在未授权访问的
-
如何实现通杀?
- 指纹采集: 提取目标系统的特征,用于快速识别同类系统。这些特征可能包括:
- 特定的JavaScript文件、CSS路径。
- 独特的Cookie名称、HTTP响应头。
- 固定的URL路径(如
/Home/Login特定样式)。 - 静态资源(如图片、图标)的MD5哈希值。
- 自动化扫描: 将构造好的Payload(访问
setLoginOperatorSession、触发信息泄露等)编写成脚本或插件,集成到网络安全空间测绘引擎或扫描器中,即可在互联网上批量发现和验证存在此类漏洞的系统。
- 指纹采集: 提取目标系统的特征,用于快速识别同类系统。这些特征可能包括:
3. 总结与修复建议
漏洞链总结
- 未授权访问 (
BaseController缺乏权限控制) -> - 会话伪造 (可任意调用
setLoginOperatorSession) -> - 信息泄露 (错误响应泄露真实Token) ->
- 完整权限获取 (利用真实Token重置会话) ->
- 敏感数据泄露 (越权访问查询接口)
修复建议(对开发人员)
- 权限控制: 在所有Controller或基类上使用
[Authorize]属性。对无需登录即可访问的方法显式使用[AllowAnonymous]。 - 输入验证: 不要信任客户端传来的任何参数(如
inWxlogin),关键逻辑必须在服务器端进行强校验。 - 错误处理: 自定义错误页面,避免将敏感信息(如Token、数据库连接字符串、堆栈跟踪)返回给客户端。
- 接口安全:
- 遵循最小权限原则,对每个业务接口进行严格的权限校验。
- API返回值应遵循最小数据暴露原则,只返回前端必需的数据字段。
- Session管理: 确保Session标识符的随机性和不可预测性,避免使用可猜解的参数来设置会话。