我如何发现这个能让数据库妥协的黑客链
字数 1482 2025-08-27 12:33:49
从LFI到数据库泄露:一个完整的安全漏洞链分析
漏洞概述
本文详细分析了一个从本地文件包含(LFI)漏洞开始,最终导致数据库泄露的完整攻击链。攻击者通过一系列精心设计的步骤,逐步提升权限,最终获取了目标系统的敏感数据。
初始发现:LFI漏洞
漏洞点定位
- 目标系统存在一个
download_handler.php文件,负责处理应用下载请求 - 该文件缺少必要的参数验证,特别是
path参数 - 预期URL结构:
downloadcallback/download_handler.php?path=[下载链接]&name=[文件名]
漏洞利用
- 使用目录遍历攻击读取系统文件:
downloadcallback/download_handler.php?path=../../../../etc/passwd - 成功读取
/etc/passwd文件,确认LFI漏洞存在 - 进一步读取其他敏感文件:
- 系统配置文件
- 访问日志
- 用户访问令牌
漏洞升级:SSRF攻击
发现SSRF漏洞
download_handler.php不仅存在LFI漏洞,还存在SSRF漏洞- 可接受多种URL模式:
file:///dict://ftp://gopher://
利用SSRF获取AWS元数据
- 通过读取
/etc/motd文件发现系统部署在AWS Elastic Beanstalk上 - 利用SSRF访问AWS实例元数据服务:
downloadcallback/download_handler.php?path=http://169.254.169.254/latest/meta-data/ - 获取关键信息:
- 实例身份文档:
http://169.254.169.254/latest/dynamic/instance-identity/document - 包含AWS账户ID和区域信息
- 实例身份文档:
- 获取临时凭证:
http://169.254.169.254/latest/meta-data/iam/security-credentials/aws-elasticbeanstalk-ec2-role- 包含Access Key、Secret Access Key和Token
AWS凭证利用
配置AWS CLI
- 使用获取的凭证配置本地AWS CLI
- 验证凭证有效性:
aws sts get-caller-identity
枚举S3存储桶
- 列出所有可访问的S3存储桶:
aws s3 ls - 递归下载存储桶内容:
aws s3 cp s3://bucket-name ./local-dir --recursive
敏感数据发现
关键文件识别
在下载的S3存储桶内容中发现:
database.js- 数据库连接配置config.js- 应用配置app.js- 应用逻辑payment.config- 支付相关配置
泄露的敏感信息
- 支付相关:
- 支付哈希密钥
- 盐值(可能用于订单篡改)
- 数据库凭证:
- MongoDB连接字符串(明文存储)
- 内部工具凭证:
- 用户名/密码组合
数据库访问
连接MongoDB
- 使用发现的凭证连接MongoDB实例
- 发现包含超过10,000条客户记录的数据库
- 虽然不完整,但包含大量敏感用户信息
漏洞修复建议
-
LFI防护:
- 验证所有文件路径输入
- 使用白名单限制可访问的文件
- 禁用目录遍历字符(../)
-
SSRF防护:
- 验证所有URL输入
- 禁用危险协议(file://, dict://等)
- 使用网络层限制对内部服务的访问
-
AWS安全:
- 限制EC2实例元数据服务(IMDS)访问
- 使用IMDSv2(需要会话令牌)
- 为Elastic Beanstalk角色应用最小权限原则
-
凭证管理:
- 避免在配置文件中存储明文凭证
- 使用AWS Secrets Manager或Parameter Store
- 定期轮换凭证
-
S3安全:
- 应用最小权限原则
- 启用S3存储桶加密
- 定期审计存储桶权限和内容
攻击链总结
- 发现LFI漏洞 → 读取系统文件
- 发现SSRF漏洞 → 访问AWS元数据服务
- 获取临时凭证 → 配置AWS CLI
- 枚举S3存储桶 → 下载配置文件
- 获取数据库凭证 → 连接数据库
- 访问客户数据 → 完成数据泄露
这个案例展示了看似简单的漏洞如何通过精心设计的攻击链演变成严重的安全事件,强调了纵深防御的重要性。