SSRF漏洞虽然在各大SRC上都被评为低危,但是不要小瞧它,它的强大之处是在探测到一些信息后能进一步加以利用。比如获取内网的开放端口信息、主机的信息收集和服务banner信息、攻击内网和本地的应用程序及服务、以及利用file协议读取本地文件等,威力不容小觑。
今天i春秋特邀白帽子H师傅,分享一期关于《由浅及深摸索SSRF漏洞》的公开课,深度剖析SSRF漏洞的危害及防御措施。
课程介绍
SSRF漏洞(服务器端请求伪造):是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。
本节课程由三部分组成,分别是SSRF基础概念、CTF比赛中几种漏洞绕过方式及各大比赛的例题讲解,通过多个案例深度剖析SSRF漏洞的危害和防御方法。
感兴趣的小伙伴,识别二维码立即看课
PS:Web端看课体验更佳,看课地址:
https://www.ichunqiu.com/open/68667
讲师介绍
本期课程主讲人:HhhM,国内知名CTF战队SU的成员。
-
2020年i春秋优秀签约作家;
-
2020年全国大学生信息安全竞赛总决赛三等奖;
-
XCTF分站赛SCTF2019国内赛冠军。
课程延伸
SSRF漏洞相关函数和协议
1、函数
file_get_contents( )、fsockopen( )、curl_exec( )、fopen( )、readfile( )等函数使用不当会造成SSRF漏洞
(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.1rn";
$out .= "Host: $hostrn";
$out .= "Connection: Closernrn";
$out .= "rn";
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会话。
注意:
①一般情况下PHP不会开启fopen的gopher wrapper;
②file_get_contents的gopher协议不能URL编码;
③file_get_contents关于Gopher的302跳转会出现bug,导致利用失败;
④curl/libcurl 7.43 上gopher协议存在bug(%00截断) 经测试7.49 可用;
⑤curl_exec( ) //默认不跟踪跳转;
⑥file_get_contents( ) // file_get_contents支持php://input协议。
2、协议
(1)file:在有回显的情况下,利用file协议可以读取任意内容;
(2)dict:泄露安装软件版本信息,查看端口,操作内网redis服务等;
(3)gopher:gopher支持发出GET、POST请求,可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是SSRF利用中一个最强大的协议(俗称万能协议),可用于反弹shell;
(4)http/s:探测内网主机存活。
WebLogic的SSRF漏洞
WebLogic的SSRF漏洞算是一个比较知名的SSRF漏洞,具体原理可以自行谷歌。
这里主要是通过复现该漏洞来加深对SSRF漏洞的理解。
WebLogic的SSRF漏洞的存在页面样子是这样的:
在学习这块的时候,天真的以为只要存在这个页面就必有SSRF,结果当然是否定的,在借鉴了猪猪侠大佬的PPT之后,发现一共有如图四种回显状态:
那么可以通过构造:
http://xxx.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http://
(要探测的内网地址)
&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search
对其进行探测,观察其回显状态,判断是否存在目标网段,这个地方最主要的就是operator这个参数,主要思路就是通过修改这个参数,来探测内网地址和内网端口。不过问题来了,上面刚才说内网地址那么多,要怎么才能知道呢?
在WebLogicSSRF的漏洞页面点击这里:
就会来到这里,有时候由于配置不当的关系,这个地方会直接给出内网地址的网段:
有网段了,就可以一点一点的探测了,探测内网的telnet,ssh,redis,以及各个数据库,为以后的内网漫游做好信息收集。还有,在WebLogic的SSRF中,有一个比较大的特点,就是虽然它是一个“GET”请求,但是我们可以通过传入%0a%0d来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令,也就说可以通过该SSRF攻击内网中的redis服务器。
手动反弹shell,就是常规的发送redis命令,然后把弹shell脚本写入crontab中,最后用get发送命令,不过别忘了,get发送命令的时候要进行url编码,最后在服务器上进行监听就OK了。
End
— 往期回顾 —
▶ 浅析勒索病毒
▶ 浅析红队基础设施
▶ 红队建设之道
▶ 手机锁屏密码安全
▶ 中间人攻击
▶ 十分钟看懂隐写术
▶ 信息泄露问题
▶ 狡猾的漏洞利用
▶ CAN总线安全
文末下方点个赞和在看哦
i春秋官方公众号为大家提供
前沿的网络安全技术
简单易懂的实用工具
紧张刺激的安全竞赛
还有网络安全大讲堂
更多技能等你来解锁
本文始发于微信公众号(i春秋):白帽黑客H师傅精彩分享:被低估的SSRF漏洞威力有多大!
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论