前言:
本文首发于先知社区结合漏洞、ssrf-lab学习SSRF漏洞
学习新知识,这次通过Weblogic 存在的SSRF漏洞和ssrf-lab,来学习SSRF漏洞
0x00 了解SSRF
SSRF简介:
SSRF(Server-Side Request Forgery)
,即服务器端请求伪造,利用漏洞伪造服务器端发起请求,从而突破客户端获取不到数据限制,本质上是属于信息泄露漏洞。
SSRF漏洞原理:
SSRF
形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制 。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等,而且在大部分的web服务器架构中,web服务器自身是可以访问互联网和服务器所在的内网的,所以攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
而且在一般情况下,SSRF
攻击的目标是外网无法访问的内部系统(即内网),所以SSRF漏洞也可以用一句话来进行总结:利用一个可以发起网络请求的服务当作跳板来攻击内部其他服务
gopher、dict协议以及redis服务、Curl 命令
Gopher
协议可以做很多事情,特别是在 SSRF 中可以发挥很多重要的作用。利用此协议可以攻击内网的 FTP、Telnet、Redis、Memcache
,也可以进行 GET、POST
请求。
DICT
协议,一个字典服务器协议,A Dictionary Server Protocol
,允许客户端在使用过程中访问更多字典并且该协议约定服务器端侦听端口号:2628
。
redis
服务是在6379
端口开启的
这些我们大致了解一下知道其用处即可
curl命令在SSRF漏洞有非常重要的作用,所以这里就简单介绍一下curl命令:
curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思
不带有任何参数时,curl 就是发出 GET 请求
$ curl https://www.example.com
上面命令向www.example.com
发出 GET 请求,服务器返回的内容会在命令行输出
-v
参数输出通信的整个过程,用于调试。我们便可以利用-v
参数进行读取文件
使用file协议curl -v file:///etc/passwd
使用ftp协议 curl -v "ftp://127.0.0.1:端口/info"
使用dict协议 curl -v "dict://127.0.0.1:端口/info"
使用gopher协议 curl -v "gopher://127.0.0.1:端口/_info"
其他参数可以参考curl
常见内网IP段
局域网地址范围分三类,以下IP段为内网IP段:
C类:192.168.0.0 - 192.168.255.255
B类:172.16.0.0 - 172.31.255.255
A类:10.0.0.0 - 10.255.255.255
SSRF漏洞的挖掘与利用:
存在SSRF
漏洞的站点主要利用四个协议,分别是http、file、gopher、dict
协议
file
协议进行本地文件的读取
http
协议进行内网的ip扫描、端口探测
探测到6379
端口开放,可以利用http、gopher、dict
这几个协议来打开放6379
端口的redis
服务。
正如上图所示,SSRF挖掘与利用方式有很多,只通过理论是无法理解一些东西的,下面就练习一下:
0x01 ssrf-lab
OUTGOING WEBHOOK 输入的https://yourhandler.io/events
是有 REST API 监听的需要测试项目
在 SEE THE RESULT 的部分会显示请求响应的结果和状态码
下面就先测试一下127.0.0.1
,发现有回显数据,说明这里没有对内网ip进行限制
上面了解了SSRF可以通过几种协议来进行读取文件,在这里就进行测试一下:
使用file:///etc/passwd
读取用户密码,发现是可以读取
除此之外,利用这个协议可以读取主机内任意文件。接下来可以读取配置文件和源代码方便进一步的渗透,这里之所以成功实现是因为URL没有经过严格的过滤,所以才可以利用这个协议进行任意文件读取。
在上面还介绍过redis
服务,看了很多SSRF
协议中的利用都是结合 Redis 服务的,所以这里就先在ssrf-basics
容器里面安装该服务
$ docker ps #查看容器编号
$ docker exec -it 容器编号 /bin/bash #进入容器
$ apt-get install redis-server # 安装redis服务
$ redis-server #开启redis服务
安装好之后,便可以利用协议收集信息及反弹 shell
利用dict
协议,dict://127.0.0.1:6379/info
可获取本地redis
服务配置信息
利用dict://127.0.0.1:6379/KEYS *
获取 redis
存储的内容
这就是