作者:綠盟科技
來源:http://blog.nsfocus.net/cve-2018-804-analysis/
CVE-2018-8045 漏洞簡介
漏洞具體情況可參見綠盟科技安全威脅周報-201812周
Joomla! Core SQL注入漏洞:
NSFOCUS ID:39158
CVE ID:CVE-2018-8045
受影響版本:Joomla! Joomla! 3.5.0-3.8.5
漏洞點評:Joomla是一套網站內容管理系統,使用PHP語言和MySQL數據庫開發。Joomla! 3.5.0 -3.8.5版本對SQL語句內的變量缺少類型轉換,導致User Notes列表視圖內SQL注 入漏洞,可使攻擊者訪問或修改數據等。目前廠商已經發布了升級補丁,修復了這個 安全問題,請用戶及時到廠商的主頁下載。
CVE-2018-8045 漏洞詳情
我們先看下joomla官網怎么說的:
https://developer.joomla.org/security-centre/723-20180301-core-sqli-vulnerability.html

User Notes模塊由于缺少變量類型轉換,導致sql注入的產生。這個漏洞在3.8.6版本被解決。
漏洞介紹很模糊,單從介紹來看,根本不知道這個sql注入產生的位置。
但是既然是3.8.6版本解決的,那我們就來從3.8.6版本的update包中找找思路。
如下是github上joomla的releases列表
https://github.com/joomla/joomla-cms/releases
找到Update from Joomla! 3.8.5升級包下載,打開下載好的升級包,根據notes這個線索搜索下。果然,在升級包中看到了一個notes.php文件。

我們回到github上,看下這個notes.php改動了什么。

很明顯,升級包中的notes.php中,對$categoryId的值進行了限制,強制轉換為int類型,可以確定,這個漏洞就出在這里。
在這里說個題外話,notes.php中getState方法出現過很多次,分別有
- getState(‘filter.search’)
- getState(‘filter.published’)
- getState(‘filter.category_id’)
- getState(‘filter.user_id’)
- getState(‘filter.level’)
但是唯有getState(‘filter.category_id’)方法沒有進行(int)類型轉換,存在著漏洞隱患,這可能是開發者一時的疏忽吧。
CVE-2018-8045 漏洞分析
來看下存在漏洞的代碼:
// Filter by a single or group of categories.
$categoryId = $this->getState('filter.category_id');
if ($categoryId && is_scalar($categoryId))
{
$query->where('a.catid = ' . $categoryId);
}
$categoryId未經過濾直接拼接sql語句進行查詢,造成了sql注入。
但是$categoryId參數如何控制呢?
存在漏洞的文件位于\administrator\components\com_users\models\notes.php,是一個joomla的模型文件,它的控制器是\administrator\components\com_users\controllers\notes.php
我們登錄joomla后臺來看一下在哪里觸發這個漏洞。
訪問http://xxx/joomla/administrator/index.php?option=com_users&view=notes 即可觸發該控制器。

但是如何控制$categoryId參數呢?如果只訪問
http://xxx/joomla/administrator/index.php?option=com_users&view=notes
只會向服務器發送一個get請求,請求中根本不包含我們想要的categoryId參數
先看下出問題的這行代碼
$categoryId = $this->getState('filter.category_id');
從getState(‘filter.category_id’)不難看出來,它的作用是一個過濾器,用來選擇category_id的
因此想向它傳參,一定和高級搜索之類功能的有關。
選擇Search Tools選項 Select Category選項。

此時joomla的發包情況

此時我們需要的filter[category_id]參數出現在了post參數中,通過這個參數的值,即可暢通無阻的進行注入。
下面驗證下這個filter[category_id]參部分可以直接傳遞給后臺的$categoryId參數
我們修改了filter[category_id]參數內容為’kingsguard_test’,并發包

后臺下斷點,抓取categoryId參數,并拼接sql語句進行查詢。

利用驗證

漏洞修復
升級joomla至最新版本
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/553/
暫無評論