声明:
由于笔者能力有限,难免出现各种错误和漏洞。全文仅作为个人笔记,仅供参考。
笔记内容来源于各类网课。
环境:本地环境
一、SSRF介绍
SSRF (Server Side Request Forgery,服务器端请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统(正因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔离的内部系统)。
二、SSRF漏洞原理
SSRF的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片等,利用的是服务端的请求伪造。
SSRF利用存在缺陷的Web应用作为代理攻击远程和本地的服务器。
主要攻击方式如下所示。
- 对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息。
- 攻击运行在内网或本地的应用程序。
- 对内网Web应用进行指纹识别,识别企业内部的资产信息。
- 攻击内外网的Web应用,主要是用HTTP GET请求就可以实现的攻击(比如struts2、SQli等) 。
- 利用file协议读取本地文件等。
三、SSRF漏洞利用
内网服务器有文件ssrf.php,这个代码存在SSRF漏洞。
ssrf.php存储在:192.168.85.204
<?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'];
echo $url;
curl($url);
?>
请求设置为百度(http),会使用curl打开百度页面。?
url=http://www.baidu.com/
如果我们本地文件
url=file:///C:/windows/win.ini
同时也可以尝试请求内网其他主机的某些服务,例如mysql的3306端口。?
在页面SSRF.php中,程序获取GET参数URL,通过curl init () 初始化curl组件后,将参数URL带入curl_ setopt ($ch, CURLOPT URL, $url) ,然后调用所以curl_exec请求该URL。由于服务端会将banner信息返回客户端,所以可以根据banner判断主机是否存在某些服务,代码如下。
四、SSRF漏洞修复
- 限制请求的端口只能为Web端口,只允许访问HTTP和HTTPS的请求。
- 限制不能访问内网的IP,以防止对内网进行攻击。
- 屏蔽返回的详细信息。
|