介绍:
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
内存存储的主要目的:
通过缓存数据库查询结果, 减少数据库访问次数, 提高web应用次数。
与redis比较
看描述,memcached和redis有一点相似,那么, 这两个中间件有什么区别呢, 孰优孰劣?主要区别有如下几点:
相同点:
都是将数据存放在内存中
不同点:
笔者在学习中关注的点:
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
存数据:
key → runoob
flag → 0
exptime → 900 (以秒为单位)
bytes → 9 (数据存储的字节数)
value → memcached
set runoob 0 900 7
memcach
STORED
注意: 存储的字节数一定要完全一致, 否则会失败。
取数据:
get runoob
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
命令: (3种方法)
1. telnet
2. nc-vv11211,提示连接成功表示漏洞存在。
3. 使用端口扫描工具nmap进行远程扫描:nmap -sV -p 11211 –script memcached-info
笔者在手工验证这个漏洞的过程中, 一开始是在windows操作系统中用telnet命令验证的, 结果发现命令卡住,执行不成功, 以为没有漏洞;但是在linux操作系统中验证是没有问题的。 memcached这个中间件本身没有认证功能,存在安全设计缺陷, 从安全角度考虑, 还是需要严格访问控制的。
有两种方式:
学习了解了memcached中间件的基本安装与使用, 并验证memcached未授权访问漏洞, 给出了解决方案思路。