前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >了解SSRF漏洞,这一篇就足够了......

了解SSRF漏洞,这一篇就足够了......

作者头像
网络安全自修室
发布2022-05-16 15:25:34
2.3K0
发布2022-05-16 15:25:34
举报

1

免责声明

本号提供的工具、教程、学习路线、精品文章均为原创或互联网收集,旨在提高网络安全技术水平为目的,只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如有侵权请联系小编处理。

2

内容速览

SSRF(服务器端请求伪造)

0x00 原理简介

SSRF(Server-Side Request Forgery,服务端请求伪造),是攻击者让服务端发起构造的指定请求链接造成的漏洞。

由于存在防火墙的防护,导致攻击者无法直接入侵内网;

这时攻击者可以以服务器为跳板发起一些网络请求,从而攻击内网的应用及获取内网数据。

SSRF形成原因

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

一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)

大都是由于服务端提供了从其它服务器获取数据的功能,比如使用户从指定的URL web应用获取图片、下载文件、读取文件内容等。

但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发送请求,并返回对该目标地址请求的数据。

最常见的例子:攻击者传入一个未经验证的URL,后端代码直接请求这个URL,就会造成SSRF漏洞。

除了http/https等方式可以造成ssrf,类似tcp connect 方式也可以探测内网一些ip 的端口是否开发服务,只不过危害比较小而已

SSRF与CSRF的区别

CSRF是服务器端没有对用户提交的数据进行随机值校验,且对http请求包内的refer字段校验不严,导致攻击者可以利用用户的cookie信息伪造用户请求发送至服务器;

SSRF是服务器对用户提供的可控URL过于信任,没有对攻击者提供的URL进行地址限制和足够的检测,导致攻击者可以以此为跳板攻击内网或者其它服务器

由攻击者构造的攻击链接传给服务端执行造成的漏洞,一般用来在外网探测或攻击内网服务

SSRF漏洞危害:

  • 扫内网
  • 向内部任意主机的任意端口发送精心构造的Payload
  • DOS攻击(请求大文件,始终保持连接Keep-Alive Always)
  • 攻击内网的web应用,主要是使用GET参数就可以实现的攻击(比如struts2,sqli等)
  • 利用file协议读取本地文件等

0x01 可能出现的地方

1.社交分享功能:获取超链接的标题等内容进行显示

2.转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览

3.在线翻译:给网址翻译对应网页的内容

4.图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片

5.图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验

6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试

7.网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作

8.数据库内置功能:数据库的比如mongodb的copyDatabase函数

9.邮件系统:比如接收邮件服务器地址

10.编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等

11.未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞

一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……

12.从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)

0x02 漏洞验证及挖掘

  1. 排除法:浏览器f12查看源代码看是否是在本地进行了请求

比如:该资源地址类型为 http://www.xxx.com/a.php?image=(地址)的就可能存在SSRF漏洞

  1. dnslog等工具进行测试,看是否被访问

可以在盲打后台用例中将当前准备请求的uri 和参数编码成base64,这样盲打后台解码后就知道是哪台机器哪个cgi触发的请求。

  1. 抓包分析发送的请求是不是由服务器的发送的,如果不是客户端发出的请求,则有可能是,接着找存在HTTP服务的内网地址
  • 从漏洞平台中的历史漏洞寻找泄漏的存在web应用内网地址
  • 通过二级域名暴力猜解工具模糊猜测内网地址
  1. 直接返回的Banner、title、content等信息
  2. 留意bool型SSRF

0x03 利用方式

访问正常文件

访问正常的文件,提交参数?url=http://www.baidu.com/robots.txt

端口扫描

当访问未开放端口,脚本会显示空白或者报错。提交参数?url=dict://127.0.0.1:1234

当访问开放端口时,脚本会显示banner信息。例如:提交参数?url=dict://127.0.0.1:3306 提交参数?url=dict://127.0.0.1:21

这样我们只需要变换IP就能实现端口扫描

读取系统本地文件

利用file、dict、gopher[11]、ftp等协议可以任意读取系统本地文件,提交参数?url=file://c:\windows\system32\drivers\etc\hosts

内网web应用指纹识别

识别内网应用使用的框架,平台,模块以及cms可以为后续的渗透测试提供很多帮助。大多数web应用框架都有一些独特的文件和目录。

通过这些文件可以识别出应用的类型,甚至详细的版本。根据这些信息就可以针对性的搜集漏洞进行攻击。比如可以通过访问下列文件来判断phpMyAdmin是否安装以及详细版本。?url=http://localhost/phpmyadmin/README

攻击内网应用

内网的安全通常都很薄弱,溢出、弱口令等一般都是存在的。通过ssrf攻击,可以实现对内网的访问,从而可以攻击内网应用或者本地机器,获取shell,这里的应用包括服务、web应用等。

仅仅通过get方法可以攻击的web应用有很多,比如struts2命令执行等

0x04:代码审计

对于代码审计其实没什么好说的,只要能读懂代码,基本这种漏洞一眼就可以看出来,对于网络资源请求且没有过滤的就可能存在 SSRF,我这里也找了几个例子,大体来说涉及到获取内容的函数都有可能存在,例如 file_get_contents,fsockopen,curl_exec 等,示例如下。

例一:

代码语言:javascript
复制
$url = $_GET['url'];
echo file_get_contents($url);

例二:

代码语言:javascript
复制
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; 
    } 
}

例三:

代码语言:javascript
复制
function curl($url){  
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_exec($ch);
    curl_close($ch);
}
$url = $_GET['url'];
curl($url);

0x05 绕过方法

对于 SSRF 绕过方法也有很多,其基础是程序有一定的防御策略,比如说验证是否为内网 ip,如果是内网 ip 则阻止其内容的读取,而判断方式如果是纯粹的验证是否为 10 开头的 ip 这种的话,则会存在很多方式的绕过。

首先就是 @符,对于一个 url 的访问实际上是以 @符后为准的,比如说 xxxx.com@10.10.10.10,则实际上访问的是 10.10.10.10 这个地址。

第二个是网址后加 xip.io,其原理是例如 10.10.10.10.xip.io 会被解析成 10.10.10.10,详细介绍可以通过 xip.io 这个网站来查看。

第三个就是进制转换,将 ip 转换为八进制十进制十六进制这种,同样也可以正常访问 例如将 10.10.10.10 转换为十进制是 168430090,在浏览器访问 http ://168430090 就会去访问 10.10.10.10 这个地址

转换问题可以在线查看一般有很多网站提供,或者自己算也可以,这里为了方便,我写了一个 js 脚本,代码如下:

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
    <title>IP转换进制</title>
    <script>
        function ip(){
            var ipvalue = document.getElementById("ipvalue").value;
            var arr = ipvalue.split(".");
            var decm = parseInt(arr[0])*256*256*256+parseInt(arr[1])*256*256+parseInt(arr[2])*256+parseInt(arr[3]);
            var hex = parseInt(decm).toString(16).toUpperCase();
            var binary = parseInt(decm).toString(2).toUpperCase();
            document.getElementById("result").innerHTML = '十六进制 = '+hex+'<br> 十进制 = '+decm+"<br> 二进制 = "+binary;
        }
    </script>
</head>
<body>
    <input type="text" name="ip" id="ipvalue" />
    <button type="button" onclick="ip()">转换</button>
    <div id="result"></div>
</body>
</html>

代码比较简单,输入 ip 后会对 ip 进行进制转换,然后进行输出,效果如下

还有一个就是短网址绕过,这个在线转换有很多网站提供。

0x06 漏洞修复

比较形象的SSRF修复方案:

  • 限制协议为HTTP、HTTPS,禁用不需要的协议可以防止类似于file://, gopher://, ftp:// 等引起的问题
  • 禁止30x跳转
  • 设置URL白名单或者限制内网IP (使用gethostbyname()判断是否为内网IP)
  • 过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
  • 限制请求的端口为http常用的端口,比如 80、443、8080、8090
  • 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

0x07 漏洞利用

常见的有以下CMS中存在SSRF漏洞利用

  1. Wordpress3.5.1以下版本 xmlrpc.php pingback的缺陷与SSRF漏洞
  2. discuz!的SSRF漏洞(利用php的header函数来绕过,其实就是302跳转实现协议转换)
  3. weblogic的SSRF漏洞

这里以vulhub中的weblogic靶场进行演示

访问漏洞存在的地方10.0.105.222:7001/uddiexplorer

点击红框框住的内容,Public Registry选择 IBM

这时,打开bp进行抓包,然后再点击search按钮,查看抓包内容,并发送到repeater模块

点击go,并把response内容发送到comparer模块,下图中的http地址里面的%3A%2F其实就是./,可以选中,然后右键url decode得到

再把上述http地址改成:http://www.baidu.com,再点击go,再把response发送到comparer

点击words,进行信息比较

这里报错信息不同,我们就怀疑这里存在SSRF漏洞,因为换了不同的IP地址,报错信息不同

通过错误的不同,即可探测内网端口

怎么探测呢?

先把地址改成localhost,然后go,再把response发送到comparer

再加上7001端口。

比较两次的包的内容区别

到此为止,就能确定存在SSRF漏洞, 接下来就是进行访问内网IP,采取盲测的方法 首先192.168.1.1,然后go,查看response信息,提示不能连接

然后继续更换内网IP,直到连接成功。这里我们作弊一下,查看内网的网段

然后输入ip地址,

把端口号改为 6379

本机开启监听

把这下面的url编码添加到端口号6379的后面

如下图:

然后点击go,进行发包。再然后回到下图页面

我们需要等待一会,等待回连

到此就获得了root权限,通过whoami查看

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网络安全自修室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SSRF(服务器端请求伪造)
    • 0x00 原理简介
      • SSRF形成原因
        • SSRF与CSRF的区别
          • SSRF漏洞危害:
            • 0x01 可能出现的地方
              • 0x02 漏洞验证及挖掘
              • 0x03 利用方式
                • 访问正常文件
                  • 端口扫描
                    • 读取系统本地文件
                      • 内网web应用指纹识别
                        • 攻击内网应用
                          • 0x04:代码审计
                            • 0x05 绕过方法
                              • 0x06 漏洞修复
                                • 0x07 漏洞利用
                                相关产品与服务
                                代码审计
                                代码审计(Code Audit,CA)提供通过自动化分析工具和人工审查的组合审计方式,对程序源代码逐条进行检查、分析,发现其中的错误信息、安全隐患和规范性缺陷问题,以及由这些问题引发的安全漏洞,提供代码修订措施和建议。支持脚本类语言源码以及有内存控制类源码。
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档