前段時間免費開源相冊Piwigopwigo出了一個piwigo <= 2.6.0sql注入漏洞。漏洞公布的時候,piwigo已經更新到了2.7.1。但是,這個漏洞公布的時候確實是一個貨真價實的0day,影響piwigo全版本。
下面是當時在官方網站測試的記錄:
跟piwigo作者溝通了解到他們知道這個漏洞并且認為已經修復了。給他們提供了更多的細節和證明之后,piwigo很快發布了新版本。
漏洞的分析看起來比較簡單,是由于functions_rate.inc.php文件中的rate_picture函數沒有對傳入的$rate變量進行過濾,直接拼接到SQL中執行:代碼如下
為什么這么簡單的一個問題,piwigo沒有發現,認為這個漏洞已經修復了呢。關鍵在與rate_picture函數開頭其實是有個對$rate變量的過濾的。如下
判斷$rate是否是$conf['rate_items']的項。而后面這個數組的值是配置文件里寫死的。
看起來這句的功能是設置了一個rate變量的白名單。只能是0,1,2,3,4,5其中之一。這樣子應該很安全才對。當然事實證明這樣子寫是不安全的。當$rate = “5’aaaaaaaaaaaaaaaaa “時,in_array($rate, $conf[‘rate_items’]) 這個判斷是返回True的。這是php里不同類型變量比較時候的一個特性。關于php比較運算符的特性可以參考這里。
簡言之:當字符串跟整型變量使用”==”比較的時候,會將字符串轉換成整型,再進行比較。
經過測試發現,in_array方法在進行比較時候的邏輯跟”==”是一致。
所以,利用這個特性,相當于完全的bypass in_array的過濾。可以輸入任意的數據拼接到SQL語句中,只要以數組中的數字開頭就可以了。此外php中的switch也存在類似的特性。
升級版本即可。官方在新版中,對$rate用正則又判斷了一把。限制了只能是數字。話說國內的程序一般就intval一下了。
文章來源:Freebuf黑客與極客(FreeBuf.COM)