Ihipop 學(xué)校的 Discuz X1.5 論壇被黑,在那里吵了一個(gè)下午。Google 一下“Discuz! X1-1.5 notify_credit.php Blind SQL injection exploit”,你就知道。
Discuz 是國(guó)內(nèi)很流行的論壇系統(tǒng),被黑的網(wǎng)站應(yīng)該會(huì)很多吧。不過我對(duì)入侵別人的網(wǎng)站不感興趣,同時(shí)也鄙視那些代碼都不會(huì)寫只會(huì)使用別人放出的工具攻擊的所謂的“黑客”。
粗略看了一下代碼,這個(gè) SQL 注入漏洞是 urldecode 函數(shù)造成的。在 PHP 手冊(cè)中,urldecode 函數(shù)下面有一個(gè)警告:
The superglobals $_GET and $_REQUEST are already decoded. Using urldecode() on an element in $_GET or $_REQUEST could have unexpected and dangerous results.
而 Discuz 的開發(fā)人員(估計(jì)是新手)畫蛇添足,多加了一個(gè) urldecode:
復(fù)制代碼代碼如下:
foreach($_POST as $k => $v) {
$value = urldecode($v);
$this->setParameter($k, $value);
}
單引號(hào)被 urlencode 兩次以后是 %2527,然后 POST,PHP 內(nèi)部在生成全局變量 $_POST 的時(shí)候會(huì)先 urldecode,得到 %27,然后 PHP 會(huì)檢查 Magic Quotes 的設(shè)置,但是無論是否開啟 Magic Quotes,%27 都不會(huì)被 addslashes,因?yàn)檫@時(shí)根本沒有單引號(hào)。但是這時(shí)如果你在 PHP 代碼中畫蛇添足的加上 urldecode,%27就變成單引號(hào)了,然后……你懂的。
在我初學(xué) PHP 的時(shí)候,看的是學(xué)校圖書館的一本爛書,里面根本就沒寫 PHP 在處理表單的時(shí)候會(huì)自動(dòng) urldecode,所以自己用 urldecode 函數(shù)來解碼(依稀記得書上好像也是這么寫的,真是誤人子弟啊)。
總結(jié)一下,就是:1、選擇一本好書非常重要;2、慎用 urldecode 函數(shù)。3、注意 PHP 手冊(cè)中的警告。
原文來自 http://demon.tw/programming/php-urldecode-sql-injection.html