常见漏洞之SSRF

SSRF简介

  • SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。
  • 原理:由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。这个功能若被恶意使用,可利用存在缺陷的web应用作为代理攻击远程和本地的服务器。
  • 危害
    1、可以对服务器所在的内网、本地进行端口扫描,获取一些服务的banner信息
    2、攻击运行在内网或本地的应用程序(比如溢出)
    3、对内网web应用进行指纹识别,通过访问应用存在的默认文件实现;
    4、攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2漏洞利用,sql注入等)
    5、利用file协议读取本地敏感数据文件
    6、利用Redis未授权访问,HTTP CRLF注入达到getshell
    7、DOS攻击(请求大文件,始终保持连接keep alive always)
  • 引发ssrf漏洞的PHP函数
    file_get_contents:文件写入字符串,当url是内网文件的时候,会先去把这个文件的内容读出来再写入,导致了文件读取。

if (isset($_POST['url'])) 
{ 
$content = file_get_contents($_POST['url']); //获取文件内容
$filename ='./images/'.rand().';img1.jpg'; //生成一个随机的文件名保存到images这个文件中
file_put_contents($filename, $content); //写入文件内容
echo $_POST['url']; 
$img = ".$filename."\"/>"; 
} 
echo $img; 
?>

fsockopen()


 
function getfile($host,$port,$link){
//fsockopen(主机名称,端口号码,错误号的接受变量,错误提示的接受变量,超时时间)
	$fp = fsockopen($host,intval($port),$errno,$errstr,30);//打开一个网络连接或者一个unix套接字连接
	if(!$fp){
		echo "$errstr (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()函数将内容写入一个打开的文件当中
		fwrite($fp, $out);
		$content = '';
		while (!feof($fp)) { //检查是否已经达到文件末尾
			$contents .= fgets($fp,1024);
			# code...
		}
		fclose($fp)mianshiti 
		return $contents;
	}
 
}
echo(getfile("127.0.0.1","80","index.php"));
?>

curl_exec()


 //curl是一个利用URL语法在命令行下工作的文件传输工具
function curl($url){
	$ch = curl_init();//初始化一个新的curl会话,返回一个curl句柄
	curl_setopt($ch, CURLOPT_URL,$url);//设置一个curl传输选项,需要获取的url地址
	curl_setopt($ch, CURLOPT_HEADER,0);//启动时候将头文件的信息作为数据流输出
	curl_exec($ch);//执行一个curl会话
	curl_close($ch);
}
 
$url = $_GET['url'];
curl($url);
 
?>
  • 协议
    file:在有回显的情况下,利用 file 协议可以读取任意内容
    dict:泄露安装软件版本信息,查看端口,操作内网redis服务等
    gopher:gopher支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell
    http/s:探测内网主机存活

验证SSRF

  • 查看源代码判断是否是从本地进行了请求;
    eg:若该资源地址类型为 http://www.xxx.com/a.php?image=URL中,URL参数若是其他服务器地址就可能存在SSRF漏洞
  • 抓包:ssrf漏洞的原理是让服务器发送的请求,所以分析发送的请求是不是由客户端发送的,若不是,则可能存在漏洞

漏洞利用

SSRF漏洞利用手段:
1.可以对外网、内网、本地进行端口扫描,某些情况下端口的Banner会回显出来(比如3306的);
2.攻击运行在内网或本地的有漏洞程序(比如溢出);
3.可以对内网Web应用进行指纹识别,原理是通过请求默认的文件得到特定的指纹;
4.攻击内网或外网有漏洞的Web应用;
5.使用file:///协议读取本地文件(或其他协议)
SSRF漏洞出现点:
1.分享:通过URL地址分享网页内容                          
2.转码服务(手机适配)
3.在线翻译
4.图片加载与下载:通过URL地址加载或下载图片
5.图片、文章收藏功能
6.未公开的api实现及调用URL的功能
7.从URL关键字中寻找,如share,wap,url,link,src,source,target,sourceURL,imageURL,domian

漏洞绕过

  • 利用@:http://[email protected]
    例如:http://[email protected]与http://10.10.10.10 请求是相同的
  • 添加端口号:http://127.0.0.1:8080
  • 利用短地址:http://dwz.cn/11SMa
  • ip 地址进制转换
  • 可以指向任意ip的域名:xip.io

漏洞防御

  • 过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
  • 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
  • 限制请求的端口为http常用的端口,比如,80,443,8080,8090。
  • 黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
  • 禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。

你可能感兴趣的:(常见漏洞,安全漏洞,安全,web)