ctfhub_SSRF漏洞

本文最后更新于:2023年6月5日 下午

1、内网访问

image-20221219112831233

由题目可知,该题可能存在ssrf漏洞。访问 127.0.0.1/flag.php 可以得到flag

image-20221219112909411

我们可以更改 参数url后面的地址为: http://127.0.0.1/flag.php

image-20221219113026903

即可得到flag

2、伪协议读取文件

image-20221219113241872

根据提示,我们可以使用 file 协议 读取文件内容

image-20221219113344170

所以,payload:

1
?url=file:///var/www/html/flag.php

3、端口扫描

image-20221219113504481

根据题目提示,我们要进行端口扫描。并且端口范围是 8000-9000

在SSRF中,dict 协议与http 协议可用来探测内网的主机存活与端口开放情况。

dict协议与gopher协议一般都出现在ssrf中,用来探测端口的指纹信息。

同时也可以用它来代替gopher协议进行ssrf攻击。

  • 探测端口指纹

    192.168.0.0/?url=dict://192.168.0.0:6379

    以上为探测6379(redis)端口的开发

所以。我们使用bp抓包进行爆破

image-20221219113719941

此处我们使用http协议进行端口探测设置端口

或者使用 dict协议:

image-20221219114051616

image-20221219113831042

根据题目提示,选择端口范围,

image-20221219113958305

此处我们使用5个线程,太快会出错

然后进行爆破即可,长度不一样的那个就是。

4、POST请求

image-20221219115054338

访问:127.0.0.1/flag.php

image-20221219115700785

发现了一个输入框,但是并没有提交按钮

查看源代码可得一个key

image-20221219115740513

把这个key输入到输入框,按回车:

image-20221219115910096

发现只能接受来自127.0.0.1的请求

我们使用file协议读取 /index.php 的代码:

image-20221219120040520

查看 /flag.php 源代码:

image-20221219120134627

综上,我们可以知道,在/index.php url中直接访问127.0.0.1/flag.php 是不能提交key的,我们可以自己构造一个post请求,去提交key。

尝试使用 Gopher 协议向服务器发送 POST 包
首先构造 Gopher协议所需的 POST请求:

image-20221219120823458

在使用 Gopher协议发送 POST请求包时,HostContent-TypeContent-Length请求头是必不可少的,但在 GET请求中可以没有。 key值为自己所获得的。

 **在向服务器发送请求时,首先浏览器会进行一次 URL解码,其次服务器收到请求后,在执行 `curl` 功能时,进行第二次 URL解码。**

所以我们需要对构造的请求包进行两次 URL编码:

第一次编码:

image-20221219121000599

在第一次编码后的数据中,**将%0A全部替换为%0D%0A**。因为 Gopher协议包含的请求数据包中,可能包含有=&等特殊字符,避免与服务器解析传入的参数键值对混淆,所以对数据包进行 URL编码,这样服务端会把%后的字节当做普通字节。

第二次编码:

image-20221219121216064

因为flag.php中的$_SERVER["REMOTE_ADDR"]无法绕过,只能通过index.php页面中的curl功能向目标发送 POST请求,构造如下Payload:

1
2
3
url=gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost:%2520127.0.0.
1%250D%250AContent-Type:%2520application/x-www-form-urlencoded%250D%250AContent-
Length:%25204%250D%250A%250D%250Akey=1531f30650dc3d95a29e15e63a5f9dfb

发包即可得到flag

5、上传文件

image-20221219132045143

访问 http://127.0.0.1/flag.php

image-20221219132117378

发现需要我们上传文件

我们同样可以使用file协议去获得源码:

index.php

image-20221219134602481

flag.php

image-20221219135108490

和上一题类似,只用访问用户的ip地址是 127.0.0.1 才可以,如果直接访问这个页面的话,ip地址不对,无法突破

1
$_SERVER["REMOTE_ADDR"]

这个函数,所以我们必须通过 /index.php 页面的 curl_exec()函数 执行curl会话,获取指定url的内容,这样通过服务器去访问的话,ip地址就满足要求了,但是该页面并没有文件上传按钮,所以我们可以使用gopher协议在/index.php页面发送post请求

上传文件的页面没有提交submit按钮,我们可以自己在页面添加一个(右键添加节点),上传文件然后bp抓包

image-20221219135351304

将数据包修改为gopher协议所需的样子,然后进行第一次url编码:

image-20221219135719434

然后再将 %0A 或为%0D%0A

使用小脚本:

image-20221219135757124

然后进行第二次编码:

image-20221219135831410

将参数与:

1
?url=gopher://127.0.0.1:80/_

进行拼接

发包即可得到flag

image-20221219140013909

6、FastCGI协议

image-20221219173126415

我们可以使用 gopherus 这个工具

然后在命令行 去执行:

1
python2 gopherus.py --exploit fastcgi

image-20221219173229525

这时,询问要我们给一个服务器上存在的文件,此处我们写 index.php

然后询问要执行的命令,此处我们查询根目录下有哪些文件 : ls /

之后便生成了一串字符串,我们将 :9000/_ 后面的字符串 再进行一次url编码 (因为浏览器会自动解码一次)

image-20221219173953410

将编码后的该字符串与前一部分进行拼接即可,

这时查询到flag在根目录下,我们使用 gopherus工具再构造一次命令:cat /f* 即可

image-20221219174109283

然后再进行编码,重复上述操作即可得到flag

7、redis协议

image-20221219174210683

与上题类似,使用 gopherus工具

1
python2 gopherus.py --exploit redis

image-20221219174359850

都使用默认的即可,

生成字符串再次对相应部分url二次编码等操作,访问之后,会在网站根目录生成 shell.php 文件

并且可以使用 cmd当作 get传参进行命令执行查询flag,或使用蚁剑连接

8、URL Bypass

image-20221219175302689

image-20221219175323495

返现,url必须以 http://notfound.ctfhub.com 开头

我们可以使用 @ HTTP 基本身份认证绕过

HTTP 基本身份认证允许 Web 浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。
也就是:http://www.xxx.com@www.yyy.com 形式

构造题目所需 Payload:

1
?url=http://notfound.ctfhub.com@127.0.0.1/flag.php

9、数字IP Bypass

image-20221219175737479 image-20221219175723351

使用file协议读取 /index.php 源码, 发现url与域名不能有127 、172、小数点等值。

但是 /flag.php 必须要从127.0.0.1进行访问

我们可以将 127.0.0.1 进行进制转化:

image-20221219180039095

payload:

1
2
3
?url=http://0x7F000001/flag.php     使用16进制的时候要加上0x,因为默认使用10进制

?url=http://2130706433/flag.php

image-20221219180300020

10、302跳转bypass

image-20221219180550356

image-20221219180531845

可以使用 sudo.cc 这个域名 , 自动解析到 127.0.0.1

或者使用自己的服务器写一个重定向跳转代码,访问服务器上的地址后自动跳转到127.0.0.1

也可以使用短地址:

image-20221219181150358

ctfhub_SSRF漏洞
https://leekosss.github.io/2023/08/24/ctfhub_SSRF漏洞/
作者
leekos
发布于
2023年8月24日
更新于
2023年6月5日
许可协议