.net代码审计之我真的只想要管理员权限
字数 1219 2025-08-15 21:32:56
.NET代码审计实战:通过Cookie伪造获取管理员权限
1. 案例背景
这是一个教育系统的安全审计案例,系统包含三种角色:
- 管理员登录
- 教师登录
- 学生登录
审计人员从最薄弱的学生登录入手进行安全测试。
2. 初始信息收集
2.1 弱口令测试
审计人员尝试了常见弱口令:
- 123456
- 123456789
- 123123
- 666666
2.2 源码分析
通过分析"学生导入模板"文件,发现系统默认学生密码为"12345",成功登录学生账户。
3. 系统功能发现
登录后发现"个人网盘"功能,初步判断可能存在文件上传漏洞,但上传测试未成功。
4. 代码审计过程
4.1 版本确认
审计发现:
- 开发者网站显示系统仍在更新
- 手头源码版本较旧
- 通过目录比对找到对应版本源码
4.2 审计工具
使用.NET Reflector 8.5进行反编译分析
4.3 关键审计点
-
管理员认证机制分析
- 管理员登录页面继承自
Manager_index - 页面加载函数
page_load调用CookieHelp.JudgelsAdmin()
- 管理员登录页面继承自
-
身份验证逻辑
JudgeIsAdmin函数逻辑: if (mngCookieNname值为空) return false; else 检查Hs和Hid值 -
Cookie结构分析
- 格式:
{ mngCookieNname: { Hid:value, Hs:value } } Hs是Hid的MD5值mngCookieNname是关键
- 格式:
-
Cookie命名规律发现
- 学生cookie键名:
stuCookieNname - 管理员cookie键名:
mngCookieNname - 命名模式:首字母不同(S→M),后面部分相同
- 学生cookie键名:
5. 漏洞利用步骤
- 使用学生账号登录,获取
stuCookieNname值 - 将
stuCookieNname的首字母'S'改为'M',得到mngCookieNname - 假设管理员ID为1:
- 设置
Hid=1 - 计算
Hs=MD5(1)
- 设置
- 构造完整Cookie:
{ mngCookieNname: { Hid: 1, Hs: "c4ca4238a0b923820dcc509a6f75849b" // MD5(1) } } - 使用伪造的Cookie访问管理员页面,成功获取管理员权限
6. 漏洞原理总结
该漏洞利用了两个关键问题:
- 不安全的身份验证机制:完全依赖客户端Cookie验证身份
- 可预测的Cookie命名:管理员和学生Cookie名称存在可预测的模式
7. 修复建议
-
身份验证改进:
- 使用服务端Session替代Cookie存储身份信息
- 实现CSRF Token机制
-
Cookie安全增强:
- 使用随机生成的不可预测的Cookie名称
- 对Cookie值进行加密签名
- 设置HttpOnly和Secure标志
-
权限验证:
- 每次敏感操作前重新验证用户权限
- 实现多因素认证
-
日志监控:
- 记录管理员登录行为
- 设置异常登录告警
8. 扩展思考
类似漏洞可能存在于:
- 其他使用可预测Cookie命名的系统
- 依赖客户端状态管理的应用
- 使用模式化命名的认证系统
审计时应特别关注:
- 认证流程是否完全在服务端控制
- 客户端存储的认证信息是否可预测或可篡改
- 不同角色间的认证机制是否存在关联或可推导性