SSRF漏洞

SSRF漏洞简介
SSRF全称为Server-side Request Fogery,中文含义为服务器端请求伪造,漏洞产生的原因是服务端提供了能够从其他服务器应用获取数据的功能,比如从指定的URL地址获取网页内容,加载指定地址的图片、数据、下载等等。
一般情况下,我们服务端请求的目标都是与该请求服务器处于同一内网的资源服务,但是如果没有对这个请求的目标地址、文件等做充足的过滤和限制,攻击者可通过篡改这个请求的目标地址来进行伪造请求,所以这个漏洞名字也叫作“服务器请求伪造”。

利用SSRF能实现以下效果:
1、可以对服务器所在的内网、本地进行端口扫描,获取一些服务的banner信息
2、攻击运行在内网或本地的应用程序(比如溢出)
3、对内网web应用进行指纹识别,通过访问应用存在的默认文件实现;
4、攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2漏洞利用等)
5、利用file协议读取本地文件
6、利用Redis未授权访问,HTTP CRLF注入达到getshell
7、DOS攻击(请求大文件,始终保持连接keep alive always)等等

SSRF漏洞出现点
1、通过url地址分享网页内容功能处
2、转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3、在线翻译
4、图片加载与下载(一般通过url地址加载或下载图片处)
5、图片、文章收藏功能
6、未公开的api实现以及其他调用url的功能
7、云服务器商(它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以
进行ssrf测试)
8、有远程图片加载的地方(编辑器之类的远程图片加载处)
9、网站采集、网页抓取的地方(一些网站会针对你输入的url进行一些信息采集工作)
10、头像处(某易就喜欢远程加载头像,例如:http://www.xxxx.com/image?url=http://www.image.co
m/1.jpg)
11、邮件系统(比如接收邮件服务器地址)
12、编码处理, 属性信息处理,文件处理(比如ffpmg,ImageMagick,docx,pdf,xml处理器等)
13、从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;
使用了xml引擎对象的地方 如wordpress xmlrpc.php)
14、从URL关键字中寻找

share
wap
url
link
src
source
target
u
3g
display
sourceURl
imageURL
domain

SSRF漏洞挖掘
在这里插入图片描述
产生SSRF漏洞的函数
ssrf攻击可能存在任何语言编写的应用,接下来我们将展示php中可能存在SSRF漏洞的函数。
1.file_get_contents
下面的代码使用file_get_contents函数从用户指定的url获取图片。然后把它用一个随即文件名保存在硬盘上,并展示给用户。

<?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; 
?>

2.sockopen()
以下代码使用fsockopen函数实现获取用户制定url的数据(文件或者html)。这个函数会使用socket跟服务器建立tcp连接,传输原始数据。

<?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; 
} 
}
?>

3.curl_exec()
curl这是另一个非常常见的实现,它通过 PHP获取数据。文件/数据被下载并存储在“curled”文件夹下的磁盘中,并附加了一个随机数和“.txt”文件扩展名。

<?php 
if (isset($_POST['url']))
{
$link = $_POST['url'];
$curlobj = curl_init();
curl_setopt($curlobj, CURLOPT_POST, 0);
curl_setopt($curlobj,CURLOPT_URL,$link);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($curlobj);
curl_close($curlobj);
 
$filename = './curled/'.rand().'.txt';
file_put_contents($filename, $result); 
echo $result;
}
?>

注意

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(%00截断) 经测试7.49 可用
5.curl_exec() 默认不跟踪跳转
6.file_get_contents() file_get_contents支持php://input协议

SSRF漏洞绕过方式
url解析规则
IP地址进制转换
302跳转
DNS重绑定

1、利用@

可以尝试采用http基本身份认证的方式绕过,如:http://www.aaa.com@www.bbb.com@www.ccc.com,在对@解析域名中,不同的处理函数存在处理差异
在PHP的parse_url中会识别www.ccc.com,而libcurl则识别为www.bbb.com。

2、采用短网址绕过

比如百度短地址https://dwz.cn/

3、采用进制转换

127.0.0.1八进制:0177.0.0.1。十六进制:0x7f.0.0.1。十进制:2130706433.

在这里插入图片描述
4、利用特殊域名

xip.io可以指向任意域名,即
127.0.0.1.xip.io,可解析为127.0.0.1

5、利用[::]

可以利用[::]来绕过localhost
http://127.0.0.1>>http://[::127.0.0.1]

6、利用句号

127。0。0。1 > 127.0.0.1

7、CRLF 编码绕过

%0d->0x0d->\r回车
%0a->0x0a->\n换行
进行HTTP头部注入

8、利用封闭的字母数字

ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ >>> example.com
①②⑦.⓿.⓿.① >>> 127.0.0.1

在这里插入图片描述
SSRF漏洞常见限制
1.限制为http://www.xxx.com 域名

采用http基本身份认证的方式绕过,即@
http://www.xxx.com@www.xxc.com

2.限制请求IP不为内网地址

当不允许ip为内网地址时:
(1)采取短网址绕过
(2)采取特殊域名
(3)采取进制转换

3.限制请求只为http协议

(1)采取302跳转
(2)采取短地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值