记一次攻防演练代码审计
字数 1402 2025-08-24 10:10:13
攻防演练代码审计实战教学文档
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 密码重置漏洞代码分析
第一段代码(验证用户名):
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");
漏洞关键点:
- 未验证密保问题与用户名是否匹配
- 仅凭用户名存在性就设置session
- 重置密码时仅检查session
2.2 默认账户发现
系统存在硬编码的默认账户,降低了攻击难度。
0x03 深入漏洞挖掘
3.1 任意文件上传漏洞
发现过程:
- 全局搜索"Upload"关键字
- 找到未做过滤的上传点
漏洞代码:
text = text.Insert(text.LastIndexOf(text2));
在最后一个句点(.)前插入字符串,但后缀未改变,全程可控。
漏洞利用:
- 可上传任意后缀文件
- 包括.aspx等可执行脚本
3.2 任意文件删除漏洞
漏洞描述:
- 简单粗暴的文件删除功能
- 无任何权限校验
- 参数完全可控
3.3 SQL注入漏洞
发现过程:
- 存在特殊字符过滤器
CuustomFilter - 过滤了
'等字符 - 找到未经过滤的控制器
注入点代码:
pageModel.strCondition = string.Concat(new string[] {" FTimePC=", pe, " and BPjUID='", BPjUID, "'"});
直接拼接SQL语句导致注入。
0x04 漏洞利用链
完整的攻击链:
- 利用密码重置漏洞获取任意账户权限
- 使用默认账户登录(如存在)
- 利用文件上传漏洞上传WebShell
- 利用SQL注入获取数据库信息
- 利用文件删除漏洞清除痕迹
0x05 防御建议
-
密码重置功能:
- 必须验证密保问题与用户名匹配
- 使用一次性令牌而非session
- 增加验证码防护
-
文件上传:
- 严格白名单限制文件类型
- 重命名上传文件
- 限制上传目录不可执行
-
SQL注入:
- 使用参数化查询
- 统一输入过滤机制
- 最小权限原则配置数据库账户
-
文件删除:
- 严格权限校验
- 记录操作日志
- 限制可删除路径范围
-
其他:
- 移除默认账户
- 源码不应存在于Web目录
- 敏感功能增加二次验证
0x06 总结
本案例展示了从外部测试到内部审计的完整过程,重点在于:
- 逻辑漏洞的发现与利用
- 源码泄露的利用价值
- 多种漏洞的串联思路
- 代码审计的关键点定位
通过全面审计,即使是已修复的系统也可能发现新的安全问题。