• 【中间件安全知识学习 之 memcached】


    引言

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


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

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

    笔者在学习中关注的点:

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

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 启动命令:
    只监听本地
    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    memcached 的简单使用

    • 简单了解功能即可

    存数据:

    key → runoob
    flag → 0
    exptime → 900 (以秒为单位)
    bytes → 9 (数据存储的字节数)
    value → memcached
    
    
    set runoob 0 900 7
    memcach
    STORED
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    get  runoob 
    
    
    • 1
    • 2
    • 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() );
          }
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    查看状态:

    stats
    
    
    • 1
    • 2

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

    命令: (3种方法)

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

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

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

    有两种方式:

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

    小结

    学习了解了memcached中间件的基本安装与使用, 并验证memcached未授权访问漏洞, 给出了解决方案思路。 
    
    • 1
  • 相关阅读:
    韵搜坊 -- 聚合接口优化(设计模式)
    589. N 叉树的前序遍历——迭代法实现
    31岁才转行程序员,目前34了,我来说说我的经历和一些感受吧...
    ant design vue 的getPopupContainer
    3.MySQL表的增删改查(基础)
    SAP 内表数据转换为JSON格式
    linux权限维持(三)
    在灾难推文分析场景上比较用 LoRA 微调 Roberta、Llama 2 和 Mistral 的过程及表现
    RK3588 预安装APK
    【4.4 统计分布】(描述性统计分析)——CDA
  • 原文地址:https://blog.csdn.net/weixin_37682263/article/details/126321294