记一次攻防演练代码审计
字数 1402 2025-08-24 10:10:13

攻防演练代码审计实战教学文档

0x00 前言

本文记录了一次针对.NET系统的完整渗透测试过程,从黑盒测试到灰盒测试,最终发现多个高危漏洞的实战案例。通过本案例可以学习到:

  1. 密码重置逻辑漏洞的发现与利用
  2. 源码泄露的发现与利用
  3. 代码审计技巧
  4. 多种漏洞的串联利用

0x01 黑盒测试阶段

1.1 初始信息收集

目标系统是一个.NET站点,具有典型的登录界面。初始尝试通过备份文件扫描未获成功。

1.2 密码重置漏洞发现

通过JS文件分析发现密码找回接口,观察到两个关键接口:

  1. 第一个接口用于验证账户存在性
  2. 第二个接口用于重置密码,仅需xmm(新密码)参数

漏洞利用步骤

  1. 构造请求爆破存在的账户
  2. 发现直接返回"OK"的异常响应
  3. 推测后台逻辑:验证用户名存在后直接设置会话session,不验证密保问题

漏洞原理

  • 系统先验证用户名是否存在
  • 存在则直接设置session:base.Session["yhm"] = peo.Rows[O]["UID"].ToString()
  • 重置密码时仅检查session存在性
  • 导致可绕过密保问题直接重置任意账户密码

1.3 源码泄露发现

在系统功能点中发现疑似源码预览功能,通过分析发现:

  1. 预览功能返回文件路径但直接访问404
  2. 通过路径拼接发现目录前缀
  3. 最终下载到系统源码压缩包

0x02 灰盒测试阶段

使用dnSpy反编译.NET程序集进行代码审计。

2.1 密码重置漏洞代码分析

第一段代码(验证用户名)

string ucode = base.Request.Form["yhm"];
DataTable peo = this.user.GetPeo(ucode);
if (peo.Rows.Count <= 0)
{
    return "不存在该用户名";
}
base.Session["yhm"] = peo.Rows[O]["UID"].ToString();

第二段代码(重置密码)

string xmm = base.Request.Form["xmm"];
this.user.UpPwd(xmm, base.Session["yhm"].ToString(), "1");

漏洞关键点

  1. 未验证密保问题与用户名是否匹配
  2. 仅凭用户名存在性就设置session
  3. 重置密码时仅检查session

2.2 默认账户发现

系统存在硬编码的默认账户,降低了攻击难度。

0x03 深入漏洞挖掘

3.1 任意文件上传漏洞

发现过程

  1. 全局搜索"Upload"关键字
  2. 找到未做过滤的上传点

漏洞代码

text = text.Insert(text.LastIndexOf(text2));

在最后一个句点(.)前插入字符串,但后缀未改变,全程可控。

漏洞利用

  • 可上传任意后缀文件
  • 包括.aspx等可执行脚本

3.2 任意文件删除漏洞

漏洞描述

  • 简单粗暴的文件删除功能
  • 无任何权限校验
  • 参数完全可控

3.3 SQL注入漏洞

发现过程

  1. 存在特殊字符过滤器CuustomFilter
  2. 过滤了'等字符
  3. 找到未经过滤的控制器

注入点代码

pageModel.strCondition = string.Concat(new string[] {" FTimePC=", pe, " and BPjUID='", BPjUID, "'"});

直接拼接SQL语句导致注入。

0x04 漏洞利用链

完整的攻击链:

  1. 利用密码重置漏洞获取任意账户权限
  2. 使用默认账户登录(如存在)
  3. 利用文件上传漏洞上传WebShell
  4. 利用SQL注入获取数据库信息
  5. 利用文件删除漏洞清除痕迹

0x05 防御建议

  1. 密码重置功能

    • 必须验证密保问题与用户名匹配
    • 使用一次性令牌而非session
    • 增加验证码防护
  2. 文件上传

    • 严格白名单限制文件类型
    • 重命名上传文件
    • 限制上传目录不可执行
  3. SQL注入

    • 使用参数化查询
    • 统一输入过滤机制
    • 最小权限原则配置数据库账户
  4. 文件删除

    • 严格权限校验
    • 记录操作日志
    • 限制可删除路径范围
  5. 其他

    • 移除默认账户
    • 源码不应存在于Web目录
    • 敏感功能增加二次验证

0x06 总结

本案例展示了从外部测试到内部审计的完整过程,重点在于:

  • 逻辑漏洞的发现与利用
  • 源码泄露的利用价值
  • 多种漏洞的串联思路
  • 代码审计的关键点定位

通过全面审计,即使是已修复的系统也可能发现新的安全问题。

攻防演练代码审计实战教学文档 0x00 前言 本文记录了一次针对.NET系统的完整渗透测试过程,从黑盒测试到灰盒测试,最终发现多个高危漏洞的实战案例。通过本案例可以学习到: 密码重置逻辑漏洞的发现与利用 源码泄露的发现与利用 代码审计技巧 多种漏洞的串联利用 0x01 黑盒测试阶段 1.1 初始信息收集 目标系统是一个.NET站点,具有典型的登录界面。初始尝试通过备份文件扫描未获成功。 1.2 密码重置漏洞发现 通过JS文件分析发现密码找回接口,观察到两个关键接口: 第一个接口用于验证账户存在性 第二个接口用于重置密码,仅需 xmm (新密码)参数 漏洞利用步骤 : 构造请求爆破存在的账户 发现直接返回"OK"的异常响应 推测后台逻辑:验证用户名存在后直接设置会话session,不验证密保问题 漏洞原理 : 系统先验证用户名是否存在 存在则直接设置session: base.Session["yhm"] = peo.Rows[O]["UID"].ToString() 重置密码时仅检查session存在性 导致可绕过密保问题直接重置任意账户密码 1.3 源码泄露发现 在系统功能点中发现疑似源码预览功能,通过分析发现: 预览功能返回文件路径但直接访问404 通过路径拼接发现目录前缀 最终下载到系统源码压缩包 0x02 灰盒测试阶段 使用dnSpy反编译.NET程序集进行代码审计。 2.1 密码重置漏洞代码分析 第一段代码(验证用户名) : 第二段代码(重置密码) : 漏洞关键点 : 未验证密保问题与用户名是否匹配 仅凭用户名存在性就设置session 重置密码时仅检查session 2.2 默认账户发现 系统存在硬编码的默认账户,降低了攻击难度。 0x03 深入漏洞挖掘 3.1 任意文件上传漏洞 发现过程 : 全局搜索"Upload"关键字 找到未做过滤的上传点 漏洞代码 : 在最后一个句点(.)前插入字符串,但后缀未改变,全程可控。 漏洞利用 : 可上传任意后缀文件 包括.aspx等可执行脚本 3.2 任意文件删除漏洞 漏洞描述 : 简单粗暴的文件删除功能 无任何权限校验 参数完全可控 3.3 SQL注入漏洞 发现过程 : 存在特殊字符过滤器 CuustomFilter 过滤了 ' 等字符 找到未经过滤的控制器 注入点代码 : 直接拼接SQL语句导致注入。 0x04 漏洞利用链 完整的攻击链: 利用密码重置漏洞获取任意账户权限 使用默认账户登录(如存在) 利用文件上传漏洞上传WebShell 利用SQL注入获取数据库信息 利用文件删除漏洞清除痕迹 0x05 防御建议 密码重置功能 : 必须验证密保问题与用户名匹配 使用一次性令牌而非session 增加验证码防护 文件上传 : 严格白名单限制文件类型 重命名上传文件 限制上传目录不可执行 SQL注入 : 使用参数化查询 统一输入过滤机制 最小权限原则配置数据库账户 文件删除 : 严格权限校验 记录操作日志 限制可删除路径范围 其他 : 移除默认账户 源码不应存在于Web目录 敏感功能增加二次验证 0x06 总结 本案例展示了从外部测试到内部审计的完整过程,重点在于: 逻辑漏洞的发现与利用 源码泄露的利用价值 多种漏洞的串联思路 代码审计的关键点定位 通过全面审计,即使是已修复的系统也可能发现新的安全问题。