全面解读SSRF

发布时间 2023-08-27 10:03:36作者: zstui

一、简介:

​ SSRF (Server-Side Request Forgery)服务器端请求伪造,是一种由攻击者构造,由服务端发起请求的一个安全漏洞。一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。

1.1、漏洞产生原理:

​ SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能没有对目标地址做过滤与限制。比如从指定 URL 地址获取网页文本内容,加载指定地址的图片,下载等等。

二、常见利用:

2.1、漏洞产生函数:

file_get_contents()、readfile()、fsockopen()、curl_exec()、fopen()、
2.1.1、file_get_contents()与readfile():

file_get_contents这一函数是把 传入的参数(变量)写入字符串,将文件的内容读入到一个字符串中,导致了任意文件读取,也就是信息泄露的一种。一般这种攻击也与目录遍历相结合。

<?php
$url = $_GET['url'];
echo file_get_contents($url);
?>
2.1.2、fsockopen():

​ fsockopen — 打开 Internet 或者 Unix 套接字连接。

​ fscokopen默认使用TCP进行连接hostname,也可以在hostname前加UDP://实现UDP连接.

fsockopen($hostname,$port,$errno,$errstr,$timeout)

​ 例子:

<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}
?>
2.1.3:curl_exec:

​ curl_exec — 执行 cURL 会话

<?php
// 创建新的 cURL 资源
$ch = curl_init();

// 设置 URL 和相应的选项

curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);

// 抓取 URL 并把它传递给浏览器
curl_exec($ch);

// 关闭 cURL 资源,并且释放系统资源
curl_close($ch);
?>

2.2、漏洞利用危险协议:

file、gopher、dict、http
2.2.1、file 协议

​ 在有回显的情况下,利用 file 协议可以读取任意内容

image-20230826151947322

2.2.2、gopher 协议

​ gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。

​ gopher支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。

​ gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell

gopher格式: 
    URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流
		gopher://192.168.12.41:2333/_abcd
[ps: gopher协议在gopher-path的第一个字符会丢失,所以构建任意字符在第一位]

​ 示例:调用kali的nc接收来自gopher请求的abc

<?php
    $url = $_GET['url'];
    $curlobj = curl_init($url);
    echo curl_exec($curlobj);
?>

image-20230826154742309

image-20230826154821075

2.2.3、dict 协议

​ dict 协议是一个在线网络字典协议,这个协议是用来架设一个字典服务的。

​ dict协议可以获取本地数据库如redis服务配置信息

2.2.4、http 协议

​ 使用http协议扫描内网存货主机

image-20230826155005572

三、漏洞验证方式:

3.1.排除法:

​ 浏览器f12查看源代码看是否是在本地进行了请求

​ 比如:该资源地址类型为 http://www.xxx.com/a.php?image=URL,URL参数若是其他服务器地址就可能存在SSRF漏洞

3.2.dnslog等工具进行测试

​ 看是否被访问(可以在盲打后台,用例中将当前准备请求的url和参数编码成base64,这样盲打后台解码后就知道是哪台机器哪个cgi触发的请求)

3.3.抓包分析

​ 查看发送的请求是不是通过服务器发送的,如果不是客户端发出的请求,则有可能是存在漏洞。接着找存在HTTP服务的内网地址

  • 从漏洞平台中的历史漏洞寻找泄漏的存在web应用内网地址
  • 通过二级域名暴力猜解工具模糊猜测内网地址
  • 通过file协议读取内网信息获取相关地址

3.4.直接返回的Banner、title、content等信息

3.5.布尔型SSRF

​ 通过判断两次不同请求结果的差异来判断是否存在SSRF,类似布尔型sql盲注方法。

四、SSRF漏洞点挖掘

4.1、 社交分享功能:

​ 获取超链接的标题等内容进行显示

4.2、 转码服务:

​ 通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览

4.3、 在线翻译:

​ 给网址翻译对应网页的内容

4.4、 图片加载/下载:

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

4.5、 图片/文章收藏功能:

​ 主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验

4.6、 云服务厂商:

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

4.7、 网站采集,网站抓取的地方:

​ 一些网站会针对你输入的url进行一些信息采集工作

4.8、 数据库内置功能:

​ 数据库的比如mongodb的copyDatabase函数

4.9、 邮件系统:

​ 比如接收邮件服务器地址

4.10、 编码处理, 属性信息处理,文件处理:

​ 比如ffpmg,ImageMagick,docx,pdf,xml处理器等

4.11、URL关键字:

Share、wap、url、link、src、source、target、u、3g、display、sourceURL、imageURL、domain

五、SSRF常见绕过:

5.1、@绕过:

5.1.1、URL完整格式:

<协议>://<用户名>:<密码>@<主机域名或者ip地址>:<端口号>/<路径>;<参数>?<查询>#<片段>
http://joe:passwd@www.baidu.com:80/main/index.html;type=a;color=b?name=bob&id=123#main

用户名和密码为了安全性通常不放在URL里;

5.1.2、绕过:

http://www.baidu.com@10.10.10.10  ------> http://10.10.10.10  请求是相同的
ip前面加上@后www.baidu.com被URL标准认定为账号密码格式

image-20230826161337822

5.2、编码绕过:

ip:
字符串:       10.0.0.3
二进制:       00001010 . 00000000 . 00000000 . 00000011
十六进制:     0A.00.00.03
整数:         167772163
字符串转整数:4位十进制点分字符串转换为24位二进制字符串,二进制字符串转换为十进制整数

5.3、短链接转换:

​ 将原链接转换为短链接,绕过过滤

image-20230826163042491

image-20230826163106640

5.4、"。"代替".":

	127。0。0。1 ----> 127.0.0.1

5.5、xip.io和xip.name绕过:

  • 泛域名解析,无需配置,将自定义的任何域名解析到指定的IP地址。假设你的IP地址是10.0.0.1,你只需使用前缀域名+IP地址+xip.io即可完成相应自定义域名解析。
10.0.0.1.xip.io # 解析到 10.0.0.1 
www.10.0.0.2.xip.io # www 子域解析到 10.0.0.2 
mysite.10.0.0.3.xip.io # mysite 子域解析到 10.0.0.3 
foo.bar.10.0.0.4.xip.io # foo.bar 子域解析到 10.0.0.4

xip.name 在使用上与xip.io一致

10.0.0.1.xip.name # 解析到 10.0.0.1 
www.10.0.0.2.xip.name # www 子域解析到 10.0.0.2 mysite.10.0.0.3.xip.name # mysite 子域解析到 10.0.0.3 foo.bar.10.0.0.4.xip.name # foo.bar 子域解析到 10.0.0.4

5.5、DNS重绑定:

在这里插入图片描述

​ 当我们输入URL地址时,服务器后端会首先在本地的DNS服务器里进行第一次DNS解析,如果没有该域名则在外网DNS服务器解析。

​ 服务器进行一个内网地址检验,如果第一次解析域名返回的IP为内网IP则判断不合法,当判断通过时再去解析一次输入的URL地址,这时第二次DNS解析。

​ 当攻击者将一个域名绑定了多个IP,且TTL为0(DNS解析记录缓存存活时间为0,无法将解析记录缓存再本地,每次解析域名都需要重新请求DNS服务器),服务器每次解析该域名都是从该域名的IP池里重新取,就存在第一次解析为外网IP第二次解析为内网IP的可能性。

六、SSRF常见防御措施:

6.1、禁用不需要的协议,

​ 只允许业务需要的协议请求,如果业务只需要进行URL跳转,只开放http和https协议,可以有效地防止攻击者调换协议进行如file://,fopher://,ftp://等协议进行访问内网资源

6.2、服务端认证交互

​ 禁止非正常用户访问服务;

6.3、过滤输入信息

​ 对用户输入的信息进行转义或者正则替换。

6.4、过滤返回信息

验证远程服务器对请求的响应是比较容易的方法,如果web应用是去获取某一种类型的文件。那么在把返* 回结果展示给用户之前先验证返回的信息是否符合标准。

6.5、统一错误信息

避免用户可以根据错误信息来判断远端服务器的端口状态。

6.6、禁止30x跳转

6.7、设置URL白名单或限制内网IP

参考资料:

SSRF漏洞(原理、挖掘点、漏洞利用、修复建议) - Saint_Michael - 博客园 (cnblogs.com)
从0到1完全掌握 SSRF - FreeBuf网络安全行业门户