漏洞概述
SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由攻击者构造形成并由服务端发起恶意请求的一个安全漏洞。正是因为恶意请求由服务端发起,而服务端能够请求到与自身相连而与外网隔绝的内部网络系统,所以一般情况下,SSRF的攻击目标是攻击者无法直接访问的内网系统。
SSRF漏洞的形成大多是由于服务端提供了从其他服务器应用获取数据的功能而没有对目标地址做过滤和限制。 例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片,下载等,利用的就是服务端请求伪造,SSRF漏洞可以利用存在缺陷的WEB应用作为代理攻击远程和本地的服务器。
SSRF(curl)
漏洞产生的地方
//payload: //file:///etc/passwd 读取文件 //http://192.168.1.15:22 根据banner返回,错误提示,时间延迟扫描端口 if(isset($_GET['url']) && $_GET['url'] != null){ //接收前端URL没问题,但是要做好过滤,如果不做过滤,就会导致SSRF $URL = $_GET['url']; $CH = curl_init($URL); //创建新的cURL资源 curl_setopt($CH, CURLOPT_HEADER, FALSE); //设置URL和相应的选项 curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE); $RES = curl_exec($CH); //抓取URL,并把它传给浏览器 curl_close($CH) ; //关闭cURL资源,并且释放系统资源 //ssrf的问是:前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。 //除了http/https外,curl还支持一些其他的协议curl --version 可以查看其支持的协议,telnet //curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP echo $RES; }
服务器没有对传进来的URL参数进行过滤,并且把服务器请求的结果输出到了前端。
漏洞利用
读取本地文件
利用file协议读取本地文件
payload:http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=file://D:\testr.txt
利用file协议读取php文件
探测内网主机存活(http/s协议)
一般是先想办法得到目标主机的网络配置信息,如读取/etc/hosts、/proc/net/arp、/proc/net/fib_trie等文件,从而获得目标主机的内网网段并进行爆破。
我们可以借助burp中的爆破模块进行存活主机探测
通过截图可以看到172.168.116.129主机存活
扫描内网端口(http/s和dict协议)
说明主机开放了80端口
开启了21端口
如果没没有相应就说明该端口处于关闭状态。
base64编码读取同目录下的源代码
payload:127.0.0.1/pikachu/vul/ssrf/ssrf_fgc.php?file=php://filter/read=convert.base64-encode/resource=ssrf.php
SSRF(file_get_content)
漏洞分析
file_get_content()函数使用不当导致SSRF漏洞
利用方式和上面的相同