SSRF(服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
如果攻击者能够将url参数更改为localhost,这可能允许他们查看服务器上托管的本地资源,从而使其容易受到服务器端请求伪造的攻击。如果攻击者可以控制服务器端请求的目的地,这将开启一系列攻击活动
危害
1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的 banner 信息;
2.攻击运行在内网或本地的应用程序(比如溢出);
3.对内网 web 应用进行指纹识别,通过访问默认文件实现;
4.攻击内外网的 web 应用,主要是使用 get 参数就可以实现的攻击(比如 struts2,sqli 等);
5.利用 file 协议读取本地文件等。
漏洞成因
SSRF 漏洞形成的原因主要是服务器端所提供的接口中包含了所要请求的内容的 URL 参数,并且未对客户端所传输过来的 URL 参数进行过滤。
漏洞判断
可以发起对外请求,带回数据
参数关键字
share、wap、url、link、src、source、
target、u、3g、display、sourceURl、imageURL、domain
常见的漏洞功能点
能够对外发起网络请求的地方
请求远程服务器资源的地方
数据库内置功能
邮件系统
文件处理
在线处理工具
eg:
在线识图,在线文档翻译,分享,订阅等,这些有的都会发起网络请求。
根据远程URL上传,静态资源图片等,这些会请求远程服务器的资源。
数据库的比如mongodb的copyDatabase函数,这点看猪猪侠讲的吧,没实践过。
邮件系统就是接收邮件服务器地址这些地方。
文件就找ImageMagick,xml这些。
从URL关键字中寻找,比如:source,share,link,src,imageurl,target等
相关函数
1.file_get_contents()
读取文件,并且能够对外发起请求。
file_get_contents默认不支持访问https请求,如果要支持需配置php.ini文件,激活 php_openssl.dll模块
2.fsockopen()
它是打开一个网络连接,linux套接字连接。可以理解的就是肯定会对外发起一个请求,然后你会看到它的参数,第1个host name,肯定是一个IP或者就是主机名,port就是个端口号。
3.curl_exec()
调用curl利用会有一些不同的地方,它支持协议非常多,也就意味着调动时刻能够发起请求,而且能控制协议的话能做的事情将会变得非常多,将会极大的去扩展攻击面。
相关协议
利用协议收集信息及反弹shell。
1.Gopher协议
简介:是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。
gopher协议是比http协议更早出现的协议,现在已经不常用了,但是在SSRF漏洞利用中gopher可以说是万金油,因为可以使用gopher发送各种格式的请求包,这样便可以解决漏洞点不在GET参数的问题了。
可以先截获get请求包和post请求包,再构成符合gopher协议的请求,POST包中要注意Content-length,注意url编码的次数。gopher协议是ssrf利用中最强大的协议。
gopher是一个互联网上使用过的分布型的文件搜索获取网络协议。
使用格式
基本协议格式:URL:gopher://<host>:<port>/<gopher-path> 。</gopher-path></port></host>
gopher://xxxxxx:port/主体 主体部分需要进行url编码。
协议利用
万能协议(利用Gopher攻击Redis、攻击Fastcgi 等)。
是对目标发起攻击的主要协议:
* 利用此协议可以攻击内网的 `FTP、Telnet、Redis、Memcache`,也可以进行 `GET、POST` 请求。这无疑极大拓宽了 SSRF 的攻击面。
* 内网中的redis存在未授权访问漏洞,当Redis服务以root 权限运行时,利用 Gopher 协议攻击内网中的 Redis,通过写入定时任务可以实现反弹shell。
* 通过GOPHER我们在一个URL参数中构造Post或者Get请求,从而达到攻击内网应用的目的。
* 利用`Gopher` 协议还可以攻击 `FastCGI`,攻击内网 `Vulnerability Web`。
通过gopher协议可以反弹shell。
* 利用gopher连接redis,执行redis命令,将反弹shell的语句写入cron,使得受害者主机主动向你的主机弹shell。(注:用gopher进行发送的时候要对原语句进行url编码)。
[利用 Gopher 协议拓展攻击面](https://blog.chaitin.cn/gopher-attack-surfaces/)。有案例。
有发送POST包的案例。
通过gopher攻击内网数据库案例。
2.dict协议
dict协议是一个字典服务器协议,A Dictionary Server Protocol,通常用于让客户端使用过程中能够访问更多的字典源,但是在SSRF中如果可以使用dict协议那么就可以轻易的获取目标服务器端口上运行的服务版本等信息。
该协议约定服务器端侦听端口号:2628。
使用格式:?url=dict://
协议利用
除了泄露安装软件版本信息,还可以查看端口,操作内网redis服务等
利用dict协议,dict://127.0.0.1:6379/info可获取本地redis服务配置信息;
利用dict://127.0.0.1:6379/KEYS *获取 redis 存储的内容。
探测端口操作,以及版本信息 diet: //xxxx:port/info;
例:
http://xxx.com/ssrf.php?url=dict://127.0.0.1:22。
使用dict://协议进行端口扫描(扫描内网的机器的端口);
?url=dict://ip:port;
当访问未开放端口,脚本会显示空白或者报错;
当访问开放端口时,脚本会显示banner 信息。
协议也能攻击redis不过不能换行,一次只能执行一条命令。
3.FTP协议
只能探测是否存在ftp,不能进行暴力破解
使用格式
?url=ftp://
4.HTTP协议
用来探测是否存在SSRF
使用格式
http://
协议利用
访问内网资源;
http://share.xxx.com/index.php?url=http://127.0.0.1;
http://image.xxx.com/image.php?image=http://127.0.0.1。
用来探测是否存在ssrf。
5.File协议
用来进行任意文件读取
使用格式
file://
协议利用
通过file协议可以读取主机内任意文件。
读取用户密码、读取配置文件和源代码。
http://xxx.com/ssrf.php?url=file:///etc/passwd。
请求 http://192.168.163.150/test.php?url=file:///etc/passwd便可以获取敏感文件的信息;
6.SFTP
即SSH,在计算机领域,SSH文件传输协议(英语:SSH File Transfer Protocol,也称Secret File Transfer Protocol,中文:安全文件传送协议,英文:Secure FTP或字母缩写:SFTP)是一数据流连接,提供文件访问、传输和管理功能的网络传输协议。
使用格式
sftp://
7.TFTP
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。
使用格式
tftp://
8.ldap
LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议。
对于不同语言实现的web系统可以使用的协议也存在不同的差异,其中:
php:
http、https、file、gopher、phar、dict、ftp、ssh、telnet...
java:
http、https、file、ftp、jar、netdoc、mailto...