\r\n
キーを入力して 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
して Web サイトの速度を低下させたり、別のユーザーのパスワード キャッシュを設定したりできます。
クライアント ライブラリがこれらの不正な文字を削除しないのはなぜですか? 私のコードでそれを適切に防ぐ方法は?