Memcached数据库简单学习与使用
Memcached 是一款高性能的分布式内存缓存系统,通常用于加速动态Web应用程序,通过减少数据库的负载来提升性能。Memcached的基本原理很简单:它通过将数据存储在内存中,减少数据库的访问频率,从而提高应用程序的响应速度。
一、Memcached的工作原理
作为一个缓存系统,Memcached主要完成以下任务:
-
数据存储与检索:Memcached将数据存储在内存中,支持多种数据类型,如字符串、整数、JSON对象等。这样,Web应用可以快速从缓存中获取常用数据,从而减少对数据库的频繁访问。
-
键值对存储:数据以键值对的形式存储,使用键可以迅速检索与之对应的值。这种设计特别适用于缓存频繁访问的数据。
-
过期策略:Memcached允许为存储的数据设置过期时间。数据在超时后会自动清除,防止内存占用过多。
尽管Memcached在提升性能方面表现优异,但其本身并没有提供默认的身份验证或加密机制,因此如果没有严格的安全配置,它容易成为攻击者的目标。
二、Memcached的默认配置与安全风险
-
默认端口:Memcached默认监听11211端口。如果未修改配置,该端口将直接暴露。
-
无身份验证:Memcached缺乏内建的身份验证机制,任何可以访问服务的用户均可进行数据存储和读取操作。
-
无加密:Memcached的通信是明文的,数据在传输过程中缺乏加密保护,容易遭到嗅探与篡改。
-
暴露端口:许多Memcached服务未进行安全配置,导致其暴露在公网,攻击者可以直接连接并执行命令,甚至获取敏感信息。
这些默认配置带来了明显的安全风险,尤其是敏感数据泄露、服务滥用等问题。为了避免这些问题,必须在部署Memcached时进行严格的安全配置。
三、常用Memcached命令
连接Memcached服务
可以使用 telnet
或 nc
等工具连接到Memcached服务:
telnet <target-ip> 11211
或
nc <target-ip> 11211
连接后,Memcached将进入交互模式,允许执行各种操作。
查看Memcached状态:stats
使用 stats
命令可以查看Memcached的运行状态,帮助测试人员了解内存使用情况、命中率、存储项数等重要信息。
stats
返回示例:
STAT pid 1234
STAT uptime 1234567
STAT time 1615284097
STAT version 1.6.9
STAT pointer_size 64
STAT rusage_user 20.13
STAT rusage_system 15.89
STAT curr_items 1123
STAT total_items 14567
STAT bytes 10485760
STAT evictions 0
STAT cmd_get 2034
STAT cmd_set 15432
...
关键字段:
curr_items
:当前缓存中的项目数。total_items
:Memcached启动以来总共存储的项目数。bytes
:Memcached当前使用的内存总量。evictions
:被驱逐的缓存项数(缓存溢出时会发生)。cmd_get
和cmd_set
:获取和设置操作的次数。
获取缓存项分布:stats items
stats items
命令列出了Memcached中所有存储的“桶”(slabs)及其缓存项数量和年龄。Memcached使用不同大小的内存块(“桶”)来存储缓存项。
stats items
返回示例:
STAT items:1:number 128
STAT items:1:age 235
STAT items:2:number 324
STAT items:2:age 160
STAT items:3:number 56
STAT items:3:age 87
解释:
items:<slab-class>:number
:每个“桶”中的项数,slab-class
表示内存块类型。items:<slab-class>:age
:每个“桶”中的缓存项存活时间。
查看特定桶的缓存项:stats cachedump
stats cachedump
命令允许查看某个桶中的所有缓存项。需要提供 slab-class
和要列出的项数限制。
stats cachedump <slab-class> <limit>
例如,查看第一个桶中的所有项:
stats cachedump 1 100
返回示例:
ITEM session_12345 [55 b; 1615284097 s]
ITEM user_67890 [102 b; 1615284098 s]
ITEM api_key_xyz123 [200 b; 1615284099 s]
...
获取指定键的数据:get <key>
get
命令用于检索存储在Memcached中的数据,适用于直接查询某个缓存项的内容。
get <key>
例如,要查看 session_12345
键的内容:
get session_12345
返回示例:
VALUE session_12345 0 55
<binary_data>
END
设置新的键值对:set
set
命令用于将键值对存储到Memcached。渗透测试人员可以通过此命令测试Memcached的防篡改能力,或尝试写入恶意数据。
set <key> <flags> <exptime> <bytes> <data>
例如,设置一个新的键:
set session_12345 0 3600 9 hello_world
解释:
0
:flags,通常为0。3600
:过期时间,单位秒。9
:数据大小,单位字节。hello_world
:存储的数据。
清空缓存:flush_all
flush_all
命令可以清空Memcached中的所有数据,这对测试缓存行为或敏感数据存储有一定帮助。
flush_all