1. 什么是 SSRF?请简述其原理。
SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者诱导服务器发起恶意请求的漏洞。 原理:攻击者通过构造恶意输入(如 URL、参数等),诱导服务器后端程序(如爬虫、资源加载功能)发起请求。由于服务器通常拥有内网访问权限或本地资源访问权限,攻击者可借助服务器访问原本无法直接触及的资源(如内网服务、本地文件、受限 API 等),实现对内部网络或服务器自身的攻击。
2. SSRF 的成因及防御措施是什么?
成因:开发人员未对用户输入的 URL / 参数进行严格校验(如未过滤内网 IP、危险协议),直接将用户可控内容传递给后端请求函数(如
curl_exec
、file_get_contents
等),导致服务器按攻击者意图发起请求。防御措施:
限制协议:仅允许
http
/https
,禁用file
/gopher
/ftp
等危险协议;限制端口限制请求的端口为http常用的端口,比如,80,443,8080,8090:
过滤内网 IP:禁止访问内网 IP(如
10.0.0.0/8
、192.168.0.0/16
、127.0.0.1
)和本地回环地址;过滤返回信息:在返回结果展示给用户之前先验证返回的信息是否符合标准;
统一错误信息:避免用户可以根据错误信息来判断远端服务器的端口状态。
禁止跳转:关闭 HTTP 自动跳转,阻止服务器在发起请求时自动跟随 301/302 等重定向响应;
3. SSRF 常见于哪些应用场景?
常见于需要服务器主动发起外部请求的功能,例如:
URL 分享 / 预览功能(自动抓取链接标题、图片);
远程资源加载(如从 URL 上传图片、视频,加载外部脚本);
在线翻译工具(通过 URL 翻译网页内容);
云服务内部调用(如跨服务 API 请求、CDN 节点资源拉取);
爬虫服务(批量抓取外部网站内容)。
4. SSRF 漏洞可能出现的场景有哪些?
与应用场景类似,更侧重具体功能点:
社交平台的 “链接预览” 功能(自动请求用户输入的 URL);
电商平台的 “外部商品导入”(从 URL 加载商品信息);
企业内部系统的 “远程数据同步”(未过滤同步目标地址);
物联网设备的 “远程控制接口”(通过 URL 发送控制指令);
API 网关的 “第三方服务代理”(直接转发用户输入的 API 地址)。
5. SSRF 重点函数有哪些?
不同语言中常用于发起请求且易引发 SSRF 的函数:
PHP:
curl_exec
、file_get_contents
、fsockopen
、fopen
、readfile
;Python:
urllib.urlopen
、requests.get
、httplib.HTTPConnection
;Java:
URL.openStream
、HttpClient.execute
、OkHttpClient.newCall
;Node.js:
http.get
、axios.get
、fetch
。
6. PHP 站点中,哪些函数或者类可能会引发 SSRF?
函数:
curl_exec
(curl 系列)、file_get_contents
、fsockopen
、fopen
、readfile
、stream_socket_client
;类 / 方法:
SimpleXMLElement
(加载外部 XML 时)、DOMDocument::load
(加载外部资源)、GuzzleHttp\Client
(HTTP 客户端类)。
7. SSRF 常见的相关协议有哪些?(及作用)
http
/https
:访问内网或外部 Web 服务,探测端口、服务版本;file
:读取服务器本地文件(如file:///etc/passwd
);ftp
:访问内网 FTP 服务,读取 / 上传文件;gopher
:构造复杂请求(如 POST 数据、多协议数据包),攻击内网服务(如 Redis 未授权访问、MySQL 注入);dict
:查询端口信息(如dict://127.0.0.1:6379/info
探测 Redis 端口);ldap
:访问内网 LDAP 服务,获取目录信息或注入攻击。
8. SSRF 利用方式有哪些?
探测内网:扫描内网 IP 段和端口,获取存活主机、服务版本(如
http://192.168.0.1:8080
);读取文件:通过
file
协议读取服务器本地敏感文件(如/etc/passwd
、/proc/self/environ
);攻击内网服务:利用内网服务漏洞(如 Redis 未授权、Weblogic 反序列化),执行命令或写入文件;
反弹 shell:通过
gopher
协议构造恶意请求,向内网漏洞服务(如 Struts2)发送 shell 指令;DOS 攻击:请求大文件或高频访问内网端口,消耗服务器资源。
9. 你发现一个 SSRF 漏洞你会怎么利用?
第一步:验证漏洞存在(如请求
http://127.0.0.1
看响应,或用file:///etc/passwd
测试文件读取);第二步:探测内网范围(扫描
192.168.0.0/24
、10.0.0.0/8
等网段,通过响应时间判断存活 IP 和开放端口);第三步:识别内网服务(访问常见端口如 8080、3306、6379,结合响应内容判断服务类型,如 Tomcat、MySQL、Redis);
第四步:针对性攻击(如利用 Redis 未授权写公钥、Weblogic 反序列化漏洞执行命令);
第五步:扩大影响(读取内网凭证、横向移动攻击其他主机)。
10. SSRF 可以用来攻击内网哪些应用?
常见内网应用及攻击点:
Redis:未授权访问时,通过
gopher
协议写入计划任务或 ssh 公钥;MySQL/MSSQL:弱口令情况下,通过
http
/tcp
请求执行 SQL 注入;Weblogic:利用其 HTTP 接口漏洞(如 CVE-2017-10271)执行反序列化攻击;
Tomcat:访问默认管理页面(
/manager
),尝试弱口令登录;Elasticsearch:未授权访问时,读取敏感索引数据或执行脚本;
邮件服务器(SMTP):发送恶意邮件或枚举用户。
11. SSRF 绕过姿势有哪些?
IP 绕过:用 IP 变种(如
127.0.0.1
→2130706433
十进制、0x7F000001
十六进制、localhost
);协议绕过:加特殊符号(如
http://@192.168.0.1
,@
后 IP 优先解析);端口绕过:用端口注释(如
192.168.0.1:80#
、192.168.0.1:80/
);跳转绕过:通过 302 跳转(先请求外部可控域名,再跳转到内网 IP);
DNS 重绑定:利用 DNS 解析延迟,先返回合法域名,再返回内网 IP;
12. 如何检测和挖掘 SSRF 漏洞?(含检测思路)
思路 1:定位用户可控参数(如
url
、image_url
、source
等可能传入 URL 的参数);思路 2:构造测试 payload :
访问内网 IP(
192.168.0.1
)和本地 IP(127.0.0.1
),对比响应差异;访问内网
127.0.0.1
的80
端口和55555
端口,对比响应差异访问不存在的 IP 和存在的 IP,观察响应时间(存在的 IP 通常响应更快);
用
file:///etc/passwd
测试是否能读取文件;调用
dnslog
平台(如xxx.dnslog.cn
),若服务器请求该域名,说明存在请求发起行为;
思路 3:结合业务功能(如 URL 预览、远程上传),主动测试是否会触发服务器请求。
13. SSRF 不出网怎么探测?
不出网时无法通过外部dnslog
验证,需依赖内网特征:
探测内网 IP 段(
192.168.0.0/24
、10.0.0.0/8
),通过响应时间差异判断端口是否开放(开放端口响应更快);访问内网常见服务的默认页面(如 Tomcat 默认页
/
、Nginx 欢迎页),对比响应内容;测试本地服务(如
127.0.0.1:22
(SSH)、127.0.0.1:3306
(MySQL)),不同服务的响应头或状态码不同;利用服务器读本地文件(如
file:///proc/self/cmdline
),若能读取则确认漏洞存在。
14. SSRF 只能用 http 怎么打 weblogic?
Weblogic 存在多个 HTTP 协议可利用的漏洞,通过 SSRF 发起 HTTP 请求攻击:
利用其内置 SSRF 漏洞(如 CVE-2014-4210):向 Weblogic 的
uddiexplorer/SearchPublicRegistries.jsp
传入内网 IP,探测并攻击其他 Weblogic 节点;利用反序列化漏洞(如 CVE-2017-10271):通过 SSRF 向 Weblogic 的
/wls-wsat/
路径发送恶意 HTTP POST 数据(含反序列化 payload),触发命令执行;访问管理端口(默认 7001):尝试弱口令登录管理控制台,或利用控制台部署恶意 war 包。
15. SSRF 的检测工具有哪些?
Burp Suite 插件:SSRF Scanner(自动检测请求中的 SSRF 参数)、Param Miner(发现隐藏参数并测试)。
开源工具:ssrf-test.py(自定义 Payload 测试脚本)、OWASP ZAP(集成 SSRF 检测规则)。
手动工具:通过 Burp 拦截请求,手动修改 URL/IP 参数(如将
http://example.com
改为http://127.0.0.1