.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 关键审计点

  1. 管理员认证机制分析

    • 管理员登录页面继承自Manager_index
    • 页面加载函数page_load调用CookieHelp.JudgelsAdmin()
  2. 身份验证逻辑

    JudgeIsAdmin函数逻辑:
    if (mngCookieNname值为空) 
        return false;
    else 
        检查HsHid
    
  3. Cookie结构分析

    • 格式:{ mngCookieNname: { Hid:value, Hs:value } }
    • HsHid的MD5值
    • mngCookieNname是关键
  4. Cookie命名规律发现

    • 学生cookie键名:stuCookieNname
    • 管理员cookie键名:mngCookieNname
    • 命名模式:首字母不同(S→M),后面部分相同

5. 漏洞利用步骤

  1. 使用学生账号登录,获取stuCookieNname
  2. stuCookieNname的首字母'S'改为'M',得到mngCookieNname
  3. 假设管理员ID为1:
    • 设置Hid=1
    • 计算Hs=MD5(1)
  4. 构造完整Cookie:
    {
        mngCookieNname: {
            Hid: 1,
            Hs: "c4ca4238a0b923820dcc509a6f75849b"  // MD5(1)
        }
    }
    
  5. 使用伪造的Cookie访问管理员页面,成功获取管理员权限

6. 漏洞原理总结

该漏洞利用了两个关键问题:

  1. 不安全的身份验证机制:完全依赖客户端Cookie验证身份
  2. 可预测的Cookie命名:管理员和学生Cookie名称存在可预测的模式

7. 修复建议

  1. 身份验证改进

    • 使用服务端Session替代Cookie存储身份信息
    • 实现CSRF Token机制
  2. Cookie安全增强

    • 使用随机生成的不可预测的Cookie名称
    • 对Cookie值进行加密签名
    • 设置HttpOnly和Secure标志
  3. 权限验证

    • 每次敏感操作前重新验证用户权限
    • 实现多因素认证
  4. 日志监控

    • 记录管理员登录行为
    • 设置异常登录告警

8. 扩展思考

类似漏洞可能存在于:

  • 其他使用可预测Cookie命名的系统
  • 依赖客户端状态管理的应用
  • 使用模式化命名的认证系统

审计时应特别关注:

  1. 认证流程是否完全在服务端控制
  2. 客户端存储的认证信息是否可预测或可篡改
  3. 不同角色间的认证机制是否存在关联或可推导性
.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() 身份验证逻辑 Cookie结构分析 格式: { mngCookieNname: { Hid:value, Hs:value } } Hs 是 Hid 的MD5值 mngCookieNname 是关键 Cookie命名规律发现 学生cookie键名: stuCookieNname 管理员cookie键名: mngCookieNname 命名模式:首字母不同(S→M),后面部分相同 5. 漏洞利用步骤 使用学生账号登录,获取 stuCookieNname 值 将 stuCookieNname 的首字母'S'改为'M',得到 mngCookieNname 假设管理员ID为1: 设置 Hid=1 计算 Hs=MD5(1) 构造完整Cookie: 使用伪造的Cookie访问管理员页面,成功获取管理员权限 6. 漏洞原理总结 该漏洞利用了两个关键问题: 不安全的身份验证机制 :完全依赖客户端Cookie验证身份 可预测的Cookie命名 :管理员和学生Cookie名称存在可预测的模式 7. 修复建议 身份验证改进 : 使用服务端Session替代Cookie存储身份信息 实现CSRF Token机制 Cookie安全增强 : 使用随机生成的不可预测的Cookie名称 对Cookie值进行加密签名 设置HttpOnly和Secure标志 权限验证 : 每次敏感操作前重新验证用户权限 实现多因素认证 日志监控 : 记录管理员登录行为 设置异常登录告警 8. 扩展思考 类似漏洞可能存在于: 其他使用可预测Cookie命名的系统 依赖客户端状态管理的应用 使用模式化命名的认证系统 审计时应特别关注: 认证流程是否完全在服务端控制 客户端存储的认证信息是否可预测或可篡改 不同角色间的认证机制是否存在关联或可推导性