文章目录

  • 引言
  • memcache的安装
  • memcached 的简单使用
  • memcached 未授权访问的漏洞验证方法
  • 未授权访问的漏洞修复方案, 如何进行安全加固操作
  • 小结


引言

介绍:
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
内存存储的主要目的:
通过缓存数据库查询结果, 减少数据库访问次数, 提高web应用次数。


与redis比较
看描述,memcached和redis有一点相似,那么, 这两个中间件有什么区别呢, 孰优孰劣?主要区别有如下几点:
相同点:
都是将数据存放在内存中
不同点:

  1. memcached可以存储图片,视频等数据。
  2. redis可以存储list, set, zset, hash, 但是memcache只支持简单的数据类型。
  3. redis只使用单核, memcached可以使用多核。 redis适合存储小数据, memcache适合存储大数据。

笔者在学习中关注的点:

  • memcached的功能以及一般业务的使用场景
  • memcached 未授权访问的漏洞验证方法
  • 未授权访问的漏洞修复方案, 如何进行安全加固操作
    主要的参考文档。

memcache的安装

  • 说明: 这是基于欧拉操作系统
    核心步骤如下:
yum install libevent libevent-devel


wget http://memcached.org/latest
tar -zxvf latest
cd memcached-1.6.15/
./configure --prefix=/usr/local/memcached
make && make test
make install
  • 启动命令:
只监听本地
memcached  -d -m 1024 -u root -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid

全网监听
memcached  -d -m 1024 -u root -l 0.0.0.0 -p 11211 -c 1024 -P /tmp/memcached.pid

memcached 的简单使用

  • 简单了解功能即可

存数据:

key → runoob
flag → 0
exptime → 900 (以秒为单位)
bytes → 9 (数据存储的字节数)
value → memcached


set runoob 0 900 7
memcach
STORED

注意: 存储的字节数一定要完全一致, 否则会失败。
取数据:

get  runoob
  • java代码连接memcached
import java.net.InetSocketAddress;
import java.util.concurrent.Future;
 
import net.spy.memcached.MemcachedClient;
 
public class MemcachedJava {
   public static void main(String[] args) {
      try{
         // 连接本地的 Memcached 服务
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
         System.out.println("Connection to server successful.");
         // 存储数据
         Future fo = mcc.set("runoob", 900, "Free Education");
         // 查看存储状态
         System.out.println("set status:" + fo.get());  
         // 输出值
         System.out.println("runoob value in cache - " + mcc.get("runoob"));
         // 关闭连接
         mcc.shutdown();     
      }catch(Exception ex){
         System.out.println( ex.getMessage() );
      }
   }
}

查看状态:

stats

memcached 未授权访问的漏洞验证方法

命令: (3种方法)

1.  telnet <ip>  <port>
2. nc-vv<target>11211,提示连接成功表示漏洞存在。
3. 使用端口扫描工具nmap进行远程扫描:nmap -sV -p 11211 –script memcached-info <target>

笔者在手工验证这个漏洞的过程中, 一开始是在windows操作系统中用telnet命令验证的, 结果发现命令卡住,执行不成功, 以为没有漏洞;但是在linux操作系统中验证是没有问题的。 memcached这个中间件本身没有认证功能,存在安全设计缺陷, 从安全角度考虑, 还是需要严格访问控制的。

未授权访问的漏洞修复方案, 如何进行安全加固操作

有两种方式:

  1. 通过iptables 方式限制只允许这些网段访问 memcached 端口。
  2. 通过安全组的方式限制只允许这些网段访问 memcached 端口