2011-05-22 18 views
3

我們的一個Joomla網站遭到黑客入侵,攻擊者用他醜陋的頁面 - 「黑客」標題和一些紅色的阿拉伯語線條替換了我的模板的index.php。 顯然,攻擊者在用戶表(即超級用戶)中的第一個用戶的密碼(和電子郵件地址)重置了一些方法,並獲得了對管理面板的訪問權限。這個Joomla密碼重置如何利用工作?

做一個快速的恢復之後,我搜索網,以防止未來的黑客行爲,發現這篇文章:Security News-[20080801] - Core - Password Remind Functionality

我把代碼那篇文章來修補我的reset.php

但我仍然有疑惑。這篇文章並沒有說明這個漏洞的實際工作方式。 不過,我看到在互聯網上的一些地方,這是reset.php

執行SQL查詢的標記線的SQL注入漏洞:

$db->setQuery('SELECT id FROM #__users 
         WHERE block = 0 
          AND activation = '.$db->Quote($token)); 

使用JDatabase ::引用()方法。那麼如何做一些SQL注入成爲可能。是不是報價應該防止SQLi? Joomla版本的攻擊網站是1.5.18。

另一個疑問是在補丁檢查中只驗證字符串長度爲32.它如何防止漏洞利用。

我想知道如果一個SQLi真的可以傳遞Quote方法,那麼32個字符串的長度是否足以繞過該WHERE子句?

if(strlen($token) != 32) { 
     $this->setError(JText::_('INVALID_TOKEN')); 
     return false; 
    } 
+1

與此相關的,你真的應該更新到1.5.23 。由於你已經學會了艱難的道路,因此背後有5個安全版本是一個壞主意。 – 2011-05-23 03:37:45

+0

對,我很快就會這樣做。 – rineez 2011-05-24 05:10:57

回答

4

問題是標記值根本沒有驗證,只是從非字母數字字符中清除。而exploit是剛剛輸入過濾出來,以便有效令牌值是導致在這樣的一個空字符串單'

SELECT id FROM #__users WHERE block = 0 AND activation = "" 
+0

哇!那麼,這將選擇從未生成重置令牌的第一個用戶。但爲什麼這個'$ db-> Quote($ token)'在這種情況下不起作用? – rineez 2011-05-24 04:50:57

+0

如果一個'''輸入的最後一個查詢在報價必須爲 'SELECT ID FROM #__users WHERE block = 0 AND activation ='\''' 否? – rineez 2011-05-24 05:10:25

+1

@rineez:由於'JRequest :: getVar('token',null,'post','alnum')'由於'$ token'已經是一個空字符串,它刪除了非字母數字的任何東西。 – Gumbo 2011-05-24 06:37:18