1

我发现当我\r\n输入从 memcached 服务器获取值的 key 时,它可以用来注入 memcached 协议来运行另一个命令。以下是代码示例,

在 PHP 中:

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

$key = "foo\r\nset bar 0 10 10000\r\n";

echo $m->get($key);
echo $m->get($key); // <- hang here
?>

在 Python 中:

import pylibmc

mc = pylibmc.Client(['127.0.0.1:11211'])

key = 'foo\r\nset bar 0 10 10000\r\n';
print mc.get(key)
print mc.get(key) # <- hang here

如果key从用户那里读取,用户可以在 memcached 服务器中执行任意命令,例如运行flush_all以减慢网站速度或为另一个用户设置密码缓存。

为什么客户端库不去除这些非法字符?如何在我的代码中正确防止它?

4

1 回答 1

2

编码用户值(例如base64)并使用结果作为键,或者使用二进制协议。

于 2013-09-09T14:10:17.553 回答