0
我發現,當我把\r\n
放在鍵值從memcached服務器獲取值時,它可以用來注入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
來減慢網站速度或爲其他用戶設置密碼緩存。
爲什麼客戶端庫不會去除這些非法字符?如何在我的代碼中正確地阻止它?
你怎麼樣不讓你的用戶查詢任意鍵? – Carsten
有時我需要使用slu as作爲獲取文章內容的關鍵。攻擊者可以在URL中放入'%0D%0A'。 – lqs
那麼,過濾。或者說,只允許用戶給定的密鑰由絕對無害的字符組成。 – Carsten