SSRF漏洞解析与靶场复现
1.概述
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。SSRF攻击的主要目标是从外网无法访问的内部系统。
SSRF形成的原因:服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。如通过指定URL地址获取网页敏感信息,加载指定地址的图片,下载等等。通俗的来讲SSRF就是利用存在缺陷的web应用作为代理,通过恶意篡改向服务器获取资源的请求从而攻击远程及本地服务器。
PHP中的 curl_exec()、 file_get_contents()、fsockopen()等函数若使用不当便会造成SSRF漏洞。
curl_exec()函数造成SSRF漏洞的部分源码:
<?php $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); if ($SELF_PAGE = "ssrf_curl.php"){ $ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); } $FILEDIR = $_SERVER['PHP_SELF']; $RD = explode('/',$FILEDIR)[1]; $PIKA_ROOT_DIR = "../../"; include_once $PIKA_ROOT_DIR.'header.php'; 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; } ?>
file_get_contents()函数造成SSRF漏洞的部分源码:
<?php $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 if(isset($_GET['file']) && $_GET['file'] !=null){ $filename = $_GET['file']; $str = file_get_contents($filename); echo $str; } ?>
如该web页面存在SSRF漏洞
http://192.168.43.116/control/more/ssrf.php?url=localhost/pt_env/control/xss/xss_1.php?id=1
此时构造pyload:
/control/more/ssrf.php?url=http://192.168.43.223/phpmyadmin/
打开同一网段内主机192.168.43.223的phpmyadmin页面。
继续构造file协议的pyload:
/control/more/ssrf.php?url=file:///C:/phpStudy/WWW/test/test.txt
打开本地文件
更多pyload:
php://filter/read=convert.base64-encode/resource=ssrf.php //读取PHP源码 http://192.168.43.100:22 //探测其他主机端口
SSRF漏洞可能造成的危害:
- 对内网进行端口扫描和主机存活探测等敏感信息收集
- 攻击内外网其他存在漏洞的web应用(主要是Get参数攻击)
- 造成内外网DDOS攻击
- 通过file://读取本地任意文件,通过dict协议获取服务器端口服务,通过http协议探测web应用等等。
SSRF漏洞的挖掘:
SSRF与CSRF的区别:
CSRF(client-site request forery客户端请求伪造)是服务器端没有对用户提交的数据进行随机值校验,且对http请求包内的refer字段校验不严,导致攻击者可以利用用户的cookie信息伪造用户请求发送至服务器;(见前面的博客:CSRF漏洞解析与靶场复现)
SSRF(server-site request forery服务端请求伪造)是服务器对用户提供的可控URL过于信任,没有对攻击者提供的URL进行地址限制和足够的检测,导致攻击者可以以此为跳板攻击内网或者其它服务器。
SSRF漏洞的修复建议:
- 限制请求的端口只能为web端口,只允许访问HTTP和HTTPS请求。
- 限制不能访问内网的IP,以防止对内网进行攻击。
- 屏蔽返回的详细信息。