SSRF概述
SSRF(Server-Side Request Forgery,服务器端请求伪造) 是一种由攻击者构造请求,由服务端发起请求的一个安全漏洞。一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统,因为服务器请求天然的可以穿越防火墙。漏洞形成的原因大多是因为服务端提供了从其他服务器应用获取数据的功能且没有对目标地址作正确的过滤和限制。
SSRF漏洞原理
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档等等。SSRF漏洞通过篡改获取资源的请求发送给服务器(服务器并没有检测这个请求是否合法的),然后服务器以他的身份来访问服务器的其他资源。SSRF利用存在缺陷的Web应用作为代理攻击远程和本地的服务器。
相关函数
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()#把整个文件读入一个字符串中。
fsockopen()#fsockopen(主机名称,端口号码,错误号的接受变量,错误提示的接受变量,超时时间)
#模拟生成 HTTP 连接,模拟post 和 get 传送数据的方法...等。
curl_exec() #执行给定的cURL会话
shell_exec(): #通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回
函数使用不当会造成SSRF漏洞
可利用的协议
除了http/https,还有
file://
:从文件系统中获取文件内容,如,file:///etc/passwd
dict://
:字典服务器协议,访问字典资源,如,dict:///ip:6739/info。还可以查看端口,操作内网redis服务等
gopher://
:分布式文档传递服务,可使用gopherus生成payload。万能协议(利用Gopher攻击Redis、攻击Fastcgi 等
UDP://
:发送UDP数据包
FTP(S)/SMB(S)
:匿名访问及爆破
SSH/Telnet
:匿名访问及爆破
SSRF高危触发点:
(1)图片加载与下载:通过URL地址加载或下载图片
(2)从远程服务器请求资源
(3)数据库内置功能(Orage,MongoDB,MSSQL,Posgres,couchDB)
(4)Web Mail收取其他邮箱邮件
(5)文件处理、编码处理、属性信息处理(FFmpeg,docx,pdf,XML处理)
攻击举例
靶机:pikachu
1,curl
可以看到一个url参数。
源码分析:
//payload:
//file:///etc/passwd 读取文件
//http://192.168.1.15:22 根据banner返回,错误提示,时间延迟扫描端口
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) ;
//ssrf的问是:前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。
//除了http/https外,curl还支持一些其他的协议curl --version 可以查看其支持的协议,telnet
//curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP
echo $RES;
}
curl 模拟浏览器请求,比如获取获取远程的网页,文件等,虽然可以使用file_get_contents函数 但是 curl支持cookie 自定义浏览器类型,来源 ip等等。
修改url
url=file:///C:/Windows/win.ini
查看到win.ini文件,进行了SSRF攻击,成功查看到服务器的敏感文件内容。关于Windows和Linux的敏感文件路径,可以百度。
2,file_get_contents()
源码分析:
$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);
if ($SELF_PAGE = "ssrf_fgc.php"){
$ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}
$FILEDIR = $_SERVER['PHP_SELF'];
$RD = explode('/',$FILEDIR)[1];
$PIKA_ROOT_DIR = "../../";
include_once $PIKA_ROOT_DIR.'header.php';
//读取PHP文件的源码:php://filter/read=convert.base64-encode/resource=ssrf.php
//内网请求:http://x.x.x.x/xx.index
if(isset($_GET['file']) && $_GET['file'] !=null){
$filename = $_GET['file'];
$str = file_get_contents($filename);
echo $str;
}
这里file_get_contents
函数还有一个文件包含漏洞,利用php伪协议读取文件的源码,url赋值php://filter/read=convert.base64-encode/resource=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info2.php
读取源码
file_get_content
可以对本地和远程的文件进行读取
本地:?file=file://C:/Users/26602/Desktop/xiema.txt
访问桌面文件
也可访问远程服务器网页,通过恶意网页进行攻击