【问题标题】:How to properly prevent memcached "protocol injection"?如何正确防止memcached“协议注入”?
【发布时间】:2013-01-23 14:37:36
【问题描述】:

我发现当我把\r\n放在key中从memcached服务器中获取值时,它可以用来注入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以减慢网站速度或为其他用户设置密码缓存。

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

【问题讨论】:

  • 不让用户查询任意键怎么样?
  • 有时候我需要用slug作为key来获取文章的内容。攻击者可以在 URL 中添加%0D%0A
  • 好吧,然后过滤它。或者更确切地说,只允许用户给定的密钥由绝对无害的字符组成。

标签: php python security memcached libmemcached


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 2020-12-15
    相关资源
    最近更新 更多