被人遗忘的Memcached内存注射
Posted 黑白之道
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了被人遗忘的Memcached内存注射相关的知识,希望对你有一定的参考价值。
0x00 写在前面
wooyun主站也有过Memcached相关漏洞,但大多都是未授权访问,其实即使是部署得当的Memcached,如果碰上安全意识差的程序员哥哥,那么同样会出现Memcached安全风险,导致敏感内存泄露。
也就是本文要说的Memcached
0x01 Memcached简介&安全性分析
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。
它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。
用白话就是说,当传统web将访问产生的临时数据存储在后端数据库(如user sessions),部署了Memcached的应用会将user sessions以及其他一些敏感信息存储在RAM中,增速同时也减轻后端数据库反复查询带来的负载。
Memcached创建者Dormando很早就写过两篇文章,告诫开发人员不要用memcached存储Session。但是很多开发者为了性能或者其他原因,依旧把session存储在memcached中。这样做,一旦memcached被,直接将导致管理员或者是用户token泄露。
0x02 Memcached协议
当Memcache被部署之后,我们该如何向其中添加数据?我们通过一个cheat sheet了解一下Memcached的协议。
Memcached的语法由如下元素组成
{COMMAND}0x20{ARGUMENT}(LF|CRLF)
command字段有如下几条命令:
1.存储操作(set, add, replace, append, prepend, cas)
2.检索操作 (get, gets)
3.删除操作 (delete)
4.增减操作 (incr, decr)
5.touch
6.slabs reassign
7.slabs automove
8.lru_crawler
9.统计操作(stats items, slabs, cachedump)
其他操作 (version, flush_all, quit)
下面给出几个安全测试中有用的命令
stats cachedump 读取内存中存储的条目
0x03 Memcached代码实现
部署好Memcached之后,一个调用Memcached的php代码是这样的。
可以看到,对Memcached的协议来讲,\r\n是可以用来分割命令的,所以说,我们能直接通过CLRF,将\r\n到将要传入Memcached的元素中(例如cookies),实现命令执行。
0x04 Memcache Injection实例
最近的一次ctf中,有一个典型的基于CLRF的Memcache。(目前该站可以访问)
http://login2.chal.mmactf.link/login
login as admin
登录之后的请求是这样的
恩,memcached出错了,那不就是刚刚提到的error吗?
> 1234567890
< ERROR
说明这里ss的value代入了memcached。
我们继续在cookies里面:ss=%0astats
果然返回了memcached的stats
现在来做我们最想做的一件事情,dump内存中的东西看看:我们利用cachedump
stats cachedump {slab class} {number of items to dump}
这里需要介绍下 memcached是以slab class进行分类的 比如:
终于注入到我们所需要的class中去。
0x05 参考
Memcache cheat sheet: http://lzone.de/cheat-sheet/memcached
Memcached Injection: https://www.blackhat.com/docs/us-14/materials/us-14-Novikov-The-New-Page-Of-Injections-Book-Memcached-Injections-WP.pdf
----------------------------------
要闻、干货、原创、专业
关注“黑白之道” 微信:i77169
华夏黑客同盟我们坚持,自由,免费,共享!
以上是关于被人遗忘的Memcached内存注射的主要内容,如果未能解决你的问题,请参考以下文章