简介:头图 | CSDN付费下载自视觉中国 出品 | CSDN博客 前言 SSRF漏洞和CSRF漏洞有一些相似之处:CSRF跨站请求伪造,基于客户端的请求伪造;SSRF服务器端请求伪造,基于服务端的请求伪造。 今天,我们来学习一下SSRF漏洞! SS
【卡米网分享】
头图 | CSDN付费下载自视觉中国
出品 | CSDN博客
前言
SSRF漏洞和CSRF漏洞有一些相似之处:CSRF跨站请求伪造,基于客户端的请求伪造;SSRF服务器端请求伪造,基于服务端的请求伪造。
今天,我们来学习一下SSRF漏洞!
SSRF漏洞简介
1.SSRF漏洞概述
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。
一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内网。也就是说可以利用一个网络请求的服务,当作跳板进行攻击)。
2.SSRF漏洞产生原因
SSRF 形成的原因往往是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
如:从指定URL地址获取网页文本内容,加载指定地址的图片,下载等。利用的就是服务端的请求伪造。ssrf是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。
3.容易出现SSRF的地方
转码服务
在线翻译
图片加载与下载(通过URL地址加载或下载图片)
图片、文章收藏功能
网站采集、网页抓取的地方。
头像的地方。(远程加载头像)
一切要你输入网址的地方和可以输入ip的地方。
从URL关键字中寻找:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain
…
4.利用SSRF可以实现的攻击
可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner 信息
攻击运行在内网或本地的应用程序
对内网 WEB 应用进行指纹识别,通过访问默认文件实现(如:readme文件)
攻击内外网的 web 应用,主要是使用 GET 参数就可以实现的攻击(如:Struts2,sqli)
下载内网资源(如:利用file协议读取本地文件等)
进行跳板
无视cdn
利用Redis未授权访问,HTTP CRLF注入实现getshell
SSRF漏洞相关函数和协议
1.函数
file_get_contents、fsockopen、curl_exec、fopen、readfile等函数使用不当会造成SSRF漏洞
(1)file_get_contents
<?php$url = $_GET['url'];;echo file_get_contents($url);?>
file_get_content函数从用户指定的url获取内容,然后指定一个文件名j进行保存,并展示给用户。file_put_content函数把一个字符串写入文件中。
(2)fsockopen
<?php function GetFile($host,$port,$link) { $fp = fsockopen($host, intval($port), $errno, $errstr, 30); 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($fp, $out); $contents=''; while (!feof($fp)) { $contents.= fgets($fp, 1024); } fclose($fp); return $contents; } }?>
fsockopen函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器建立tcp连接,传输数据。变量host为主机名,port为端口,errstr表示错误信息将以字符串的信息返回,30为时限。
(3)curl_exec
<?php if (isset($_POST['url'])){$link = $_POST['url'];$curlobj = curl_init;// 创建新的 cURL 资源curl_setopt($curlobj, CURLOPT_POST, 0);curl_setopt($curlobj,CURLOPT_URL,$link);curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);// 设置 URL 和相应的选项$result=curl_exec($curlobj);// 抓取 URL 并把它传递给浏览器curl_close($curlobj);// 关闭 cURL 资源,并且释放系统资源$filename = './curled/'.rand.'.txt';file_put_contents($filename, $result); echo $result;}?>
curl_exec函数用于执行指定的cURL会话。
注意
1.一般情况下PHP不会开启fopen的gopher wrapper
2.file_get_contents的gopher协议不能URL编码
3.file_get_contents关于Gopher的302跳转会出现bug,导致利用失败
4.curl/libcurl 7.43 上gopher协议存在bug(截断) 经测试7.49 可用
5.curl_exec //默认不跟踪跳转,
6.file_get_contents // file_get_contents支持php://input协议
2.协议
(1)file:在有回显的情况下,利用 file 协议可以读取任意内容
(2)dict:泄露安装软件版本信息,查看端口,操作内网redis服务等
声明:本文内容仅代表作者个人观点,与本站立场无关。如有内容侵犯您的合法权益,请及时与我们联系,我们将第一时间安排处理