目录
SSRF漏洞
漏洞原理
形成原因
SSRF用途:
怎么找到SSRF漏洞?
漏洞案例
SSRF漏洞
漏洞原理
-
SSRF(Server-Side Request Forgery:服务器端请求伪造)是——种由仅专构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要目标网站的内部系统。(因为他是从内部系统访问的,所有可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人)
形成原因
-
SSRF形成的原因SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档,等等。
-
首先,我们要对目标网站的架构了解,脑子了要有一个架构图。比如︰A网站,是一个所有人都可以访问的外网网站,B网站是一个他们内部的OA网站,我们普通用户只可以访问a网站,不能访问b网站。但是我们可以同过a网站做中间人,访问b网站,从而达到攻击b网站需求。
-
正常用户访问网站的流程是:
-
输入A网站URL-->发送请求-->A服务器接受请求(没有过滤),并处理-->返回用户响应[那网站有个请求是www.cJdboyedu,com/xxx.php?image=URL]
-
那么产生SSRF漏洞的环节在哪里呢?安全的网站应接收请求后,检测请求的合法性
-
-
产生的原因:服务器端的验证并没有对其请求获取图片的参数(image=)做出严格的过滤以及限制,导致A网站可以从其他服务器的获取数据
-
例如:
-
www.oldboyedu.com/xxx.php?image=www.luffycity.com/1.jpg
-
如果我们将www.luffycity.com/1.jpg换为与该服务器相连的内网服务器地址会产生什么效果呢?如果存在该内网地址就会返回1xx2xx之类的状态码,不存在就会其他的状态码
-
-
终极简析: SSRF漏洞就是通过篡改获取资源的请求发送给服务器,但是服务器并没有检测这个请求是否合法的,然后服务器以他的身份来访问其他服务器的资源。
SSRF用途:
-
攻击者利用ssrf可以实现的攻击主要有5种:︰
-
1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
-
2.攻击运行在内网或本地的应用程序(比如溢出);
-
3.对内网web应用进行指纹识别,通过访问默认文件实现;
-
4.攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
-
5.利用file协议读取本地文件等。
-
怎么找到SSRF漏洞?
-
1.能够对外发起网络请求的地方,就可能存在SSRF漏洞(在自己的网站上请求到别人的资源)
-
2.从远程服务器请求资源(Upload from URL,lmport & Export RSS feed)
-
3.数据库内置功能(Oracle、MongoDB、MSSQL、Postgres、CouchDB)
-
4.Webmail收取其他邮箱邮件(POP3/IMAP/SMTP)
-
5.文件处理,编码处理,属性信息处理(ffpmg,lmageMaic,DOGX,RD;XML处理器)
漏洞案例
-
SSRF漏洞就是通过篡改获取资源的请求发送给服务器,但是服务器并没有检测这个请求是否合法的,然后服务器以他的身份来访问其他服务器的
-
ssrf攻击可能存在任何语言编写的应用,我们通过一些php实现的代码来作为样例分析。代码 的大部分来自于真实的应用源码。
<?php
if (isset($_POST[ 'url']))
{
$content = file_get_contents($_POST [ 'url']);
$filename ='./images/ ' .rand( ) . 'img1.jpg';
file_put_contents($filename,$content);
echo $_POST[ 'url'];
$img = "<img src=\"".$filename . "\"/>";
}
echo $img;
?>
<?php
function GetFile($host , $port ,$link){
$fp = fsockopen( $host, intval($port), $errno,$errstr, 30);
if(!$fp){
echo "$errstrR ( error number $errno) \n";
}else{
$out = "GET $link HTTP/1.1\r\n" ;
$out .= "Host: $host\r\n";
$out .= "connection: Close \r\n\r\n" ;
$out .= "\r\n";
fwrite($f;$out);
$contents='';
while (!feof($fp)) {
$contents.= fgets($fp,1024);
}
fclose($fp);
return $contents;
}
}
?>