ssrf漏洞详解


0x01. ssrf概述

1、SSRF漏洞概述

SSRF(服务器端请求伪造): 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。

一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内网。也就是说可以利用一个网络请求的服务,当作跳板进行攻击)

2、SSRF漏洞产生原因

SSRF 形成的原因往往是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。

如:从指定URL地址获取网页文本内容,加载指定地址的图片,下载等。利用的就是服务端的请求伪造。ssrf是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。

3.漏洞的产生

在PHP中的curl()file_get_contents()fsockopen() 等函数是几个主要产生ssrf漏洞的函数。

1) curl()

<?php
function curl($url){
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    #curl_setopt($ch,CUPLOPT_HEADER,1);
    curl_exec($ch);
    curl_close($ch);
}
$url = $_GET['url'];
curl($url);
?>

function 定义一个函数,叫做curl,有一个参数,叫$url
curl_init() 初始化一个cURL会话后。将$url传入curl_setopt($ch,CURLOPT_URL,$url);

curl_setopt($ch, CURLOPT_HEADER, 1) 这边是设定返回信息信息,是否要返回响应信息头这里的话可以注释掉)
这是注释后
这是没注释的

然后通过 curl_exec 发起一个请求,curl_exec详细信息
然后这就是一个函数,接下来再设置一个get传参为变量url,然后再把这个变量url代入前面所创建的那个 curl函数

2)file_get_contents()

<?php

if(isset($_POST['url']))
{
    $content=file_get_contents($_POST['url']);
    $filename='./images/'.rand().'.img';\
    file_put_contents($filename,$content);
    echo $_POST['url'];
    $img="<img src=\"".$filename."\"/>";

}
echo $img;
?>
<?php
$url = $_GET['url'];;
echo file_get_contents($url);
?>

file_get_content函数从用户指定的url获取内容,然后指定一个文件名进行保存,并展示给用户。file_put_content函数把一个字符串写入文件中。

3) fsockopen()

<?php
$host=$_GET['url'];
$fp = fsockopen("$host", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: $host\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}?>

fsockopen 函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器建立tcp连接,传输数据。变量host为主机名,port为端口,errstr表示错误信息将以字符串的信息返回,30为时限

注意
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协议

2.协议
(1)file: 在有回显的情况下,利用 file 协议可以读取任意内容
(2)dict:泄露安装软件版本信息,查看端口,操作内网redis服务等
(3)gopher:gopher支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell
4)http/s:探测内网主机存活

0x02.一些ssrf利用文章

1.SSRF漏洞的利用与攻击内网应用实战
2. Web安全基础学习之SSRF漏洞利用及绕过方式
3.挖洞达人必杀技之SSRF漏洞的利用与攻击内网应用实战

0x03 修复方式

1.限制请求的端口,只能为web端口,只允许访问http 和 https的请求
2.限制不能访问内网ip,以防止对内网进行攻击
3.屏蔽 返回的详细信息


文章作者: Young
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Young !
评论
 上一篇
通读全文审计 通读全文审计
0x00 简介本文章来自 公众号:404安全 通读全文推荐大家开始可以审计一些比较好看懂的CMS,我们先看大体网站框架,这里你大概知道什么文件夹是放什么类型的文件,然后从index.php文件开始往里面读,然后重点关注是否有全局过滤等等。
2020-04-01
下一篇 
python中request模块的基本使用 python中request模块的基本使用
Requests库的基础使用Get/Post请求 Get请求 requests.get('http://www.baidu.com',参数) Post请求 requests.post('http://www.baidu
2020-03-20
  目录