redis和mongodb我之所见

最近自己在做一些个人的小创作、小项目,其中用到了mongodb和redis,最初可能对这二者没有深入的认识。
都是所谓的“非关系型数据库”,有什么区别么?

实际上,在我看来,redis的角色更接近于memcache,而mongodb是一个真正的数据库。

redis是一个key-value型数据库,信息以键对应值的关系存储在内存中,比memcache较大的优势就在于其数据结构的多样性。

说它不算一个真正意义上的数据库,因为redis是主要把数据存储在内存中(当然可以把其存储至硬盘上,这也是写shell的必要条件之一),其“缓存”的性质远大于其“数据存储”的性质,其中数据的正删改查也只是像变量操作一样简单。而mongodb却是一个“存储数据”的系统,增删改查数据的时候有“与或非”条件,查询数据的方式也能像SQL数据库一样灵活,这是redis所不具备的。

所以在我的项目中,redis作为session、任务队列的存储器,而mongodb作为数据(包括用户信息等)的存储器。

进入正题,昨天看到freebuf上已经说了redis可能造成的安全问题,提到了写文件,那么我在这里把方法说明一下吧。

redis安装完成以后有自己的命令行,也就是redis-cli,其中包含的命令可以在:http://redis.io/commands 进行查阅。各个客户端基本也就是依照这个命令去增删改查。

之前说了redis的数据主要保存在内存中,当与memcache不同之处在于,我们可以随时执行“save”命令将当前redis的数据保存到硬盘上,另外redis也会根据配置自动存储数据到硬盘上。

这不得不说到redis的持久化运作方案 http://redis.io/topics/persistence ,其中说到的一个RDB,一个AOF。RDB更像一个数据库备份文件,而AOF是一个log日志文件。我们可以设置让redis再指定时间、指定更改次数时进行备份,生成RDB文件;而设置AOF,可以在操作或时间过程后将“日志”写入一个文件的最末,当操作越来越多,则AOF文件越来越大。

二者是相辅相成的,通过二者的配合我们能够稳定地持久地将数据存储于服务器上。

利用redis写webshell

而我们就是利用这些储存数据的操作,来进行任意文件写入。

redis的配置中,有几个关键项目:

dir,指定的是redis的“工作路径”,之后生成的RDB和AOF文件都会存储在这里。

    dbfilename,RDB文件名,默认为“dump.rdb”

    appendonly,是否开启AOF

    appendfilename,AOF文件名,默认为“appendonly.aof”

    appendfsync,AOF备份方式:always、everysec、no

经过我的研究发现,我们可以将dir设置为一个目录a,而dbfilename为文件名b,再执行save或bgsave,则我们就可以写入一个路径为a/b的任意文件:

当我们获得了一个redis控制台,我们可以调用config set/get等命令对redis的部分配置进行修改。

而恰好的是,我们可以通过config set来更改dir和dbfilename。也就是说我们可以不用修改redis.conf,也不用重启redis服务就可以写入任意文件:

config set dir /home/wwwroot/default/

config set dbfilename redis.php

set webshell "<?php phpinfo(); ?>"

save

当我们随便set一个变量webshell的值为"<?php phpinfo(); ?>"后,即可对服务器进行getshell。可见已写入:

导出的RDB实际上是一个二进制文件,但因为其中包含<?php phpinfo(); ?>,所以被解析了:

在前图中,我们可以看到其实还生成了一个appendonly.aof,这个文件名能不能自定义呢?可惜的是,appendfilename的值并不能使用config set命令定义:

但仅有的一个dbfilename已经足够了。

所以,以后如果扫到redis未授权访问,先别急着提交乌云。看看服务器有没有web服务,如果有,不妨试试能不能拿下webshell。

安全脉搏姿势

redis权限其实很高的,一般都是root
利用前提:
1.redis未授权 能redis-cli连上
2.开了web并且知道路径(如利用phpinfo)
如果没执行成功 检查看看:1.shell可读权限 2.shell内容是否前面有<?这种字符把shell弄坏了(主要原因可能是shell写的有问题)

redis基础技巧参见:Trying to hack Redis via HTTP requests

【作者:phithon 安全脉搏首发】

【本文版权归安全脉搏所有,未经许可不得转载。文章仅代表作者看法,如有不同观点,欢迎添加安全脉搏微信号:SecPulse,进行交流。】

利用redis写webshell的更多相关文章

  1. redis未授权弱口令检测脚本(redis未授权访问漏洞,利用redis写webshell)

    以下如有雷同,不胜荣幸 * --- 示例代码!!!!!----*/ #! /usr/bin/env python # _*_  coding:utf-8 _*_ import socket impor ...

  2. Redis未授权访问写Webshell和公私钥认证获取root权限

    0x01 什么是Redis未授权访问漏洞 Redis 默认情况下,会绑定在 0.0.0.0:,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服 ...

  3. 利用多写Redis实现分布式锁原理与实现分析(转)

    利用多写Redis实现分布式锁原理与实现分析   一.关于分布式锁 关于分布式锁,可能绝大部分人都会或多或少涉及到. 我举二个例子:场景一:从前端界面发起一笔支付请求,如果前端没有做防重处理,那么可能 ...

  4. 利用redis未授权访问漏洞(windows版)

    0x00 原理   首先需要知道的是,redis是一种非关系型数据库.它在默认情况下,绑定在0.0.0.0:6379 ,若不采取相关策略,比如添加防火墙限制非信任IP访问,会使得redis服务暴露到公 ...

  5. [翻译]利用REDIS来搭建可靠分布式锁的提议

    本系列都是翻译REDIS作者的博文  另外加上我自己的一点点理解  希望有问题大家一起讨论 http://antirez.com/news/77 原文地址 在利用REDIS做分布式锁时基本持有2种观点 ...

  6. redis写shell与ssh免密码登陆

     redis-cli参数:-h :指定要连接的主机IP或域名-p :指定连接的端口-a :指定密码-r :执行指定的命令-n :数据库名-x :将最后一个参数输出为value redis写shell- ...

  7. 利用redis实现分布式锁

    分布式锁一般有三种实现方式: 1. 数据库乐观锁: 2. 基于ZooKeeper的分布式锁: 3. 基于Redis的分布式锁: 这里大概说一下三种方式的优缺点,数据库乐观锁优点是实现简单,只需要for ...

  8. 利用Redis发布订阅完成tomcat集群下的消息通知

    以下为个人想法,如果有说的不对的地方请各位大佬见谅! 这是博主的第一篇博客,可能排版以及一些描述有不合理的地方还请勿喷,希望大家尽可能的多给我这样的新人一些鼓励让我能在写博客的道路上走下去. 进入正题 ...

  9. 后端利用Redis队列及哈希实现定时推送提醒的三个思路

    周煦辰 2016年8月31日 本文介绍了一下本人在开发过程中遇到"定时推送提醒"的需求的时候所思考的三种解决方案. 明确问题 首先明确一下这个需求可能包含的几个"坑&qu ...

随机推荐

  1. 我与python3擦肩而过(二)—— csv文件头哪去啦?

    在看Python Data Visualization Cookbook 这本书(基于python2),开始时读取csv文件头的时候出现问题.查了资料,又是python3的问题,从这个链接找到答案. ...

  2. Android布局大全

    Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面. 所有的布局方式都可以归类为ViewGroup的 ...

  3. 升级IOS 9 和 XCode 7 引起的问题

    问题一: 升级xcode 7最低的系统配置要求 升级了ios9 后使用 xcode 6.1 已经不能用了,必须升级 xcode 7才行,原先的系统是OSX 10.10.1 版本.而xcode 7.0 ...

  4. 夜黑风高的夜晚用SQL语句做了一些想做的事·······

         IT这条漫漫长路注定是孤独的,陪伴我们的只有那些不知冷暖的代码语句和被手指敲打的磨掉了键上的标识的键盘. 之所以可以继续坚持下去,是因为心中有一份永不熄灭的激情. 成功的路上让我们为自己带盐 ...

  5. Java 集合深入理解(14):Map 概述

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 终于把 List 常用的几种容器介绍完了,接下来开始 Map 的相关介绍. 什么是 Map Java 中的 Map 接口 ...

  6. 怎样将某一类型标识为适合绑定到 System.Web.UI.WebControls.ObjectDataSource 对象的对象

    1.页面的代码如下: body> <form id="form1" runat="server"> <div> </div& ...

  7. [转]LUA 学习笔记

    Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...

  8. [转]MMORPG服务器架构

    MMORPG服务器架构 一.摘要 1.网络游戏MMORPG整体服务器框架,包括早期,中期,当前的一些主流架构2.网络游戏网络层,包括网络协议,IO模型,网络框架,消息编码等.3.网络游戏的场景管理,A ...

  9. Word Ladder II

    Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformat ...

  10. Qt之镜像旋转

    简述 Qt中可以对图片进行任何处理,改变亮度.灰度.透明度.大小.形状等,当然也可以进行镜像旋转! 简单的几行代码,有时就可以事半功倍...甚至图片不用经过美工处理就可以直接拿来使用! 简述 实现 原 ...