閱讀209 返回首頁    go 阿裏雲 go 技術社區[雲棲]


LuManager高危SQL注入0day分析

2015年9月7日阿裏雲盾態勢感知係統捕獲到LuManager係統的0day一枚,經證實,該漏洞一旦被黑客利用可直接以最高權限登陸後台,上傳webshell, 控製係統數據庫、操作虛擬主機,後果不堪設想。

作者:雲盾攻防對抗團隊 - 千霄

LuManager是一種基於FreeBSD、Zijidelu、Debian、Centos、Ubuntu等Linux/Unix係統的網站服務器管理軟件,目前有大量國內用戶使用。雲盾攻防對抗團隊捕獲0day後第一時間通知廠商,廠商迅速響應,於8日上午發布安全更新並致謝阿裏雲盾。在此次事件過程中,正是基於雲盾態勢感知係統靈敏的漏洞捕獲能力、阿裏雲與廠商的快速溝通響應以及廠商負責任的態度,得以保證了阿裏雲用戶不受該漏洞影響,避免了不必要的損失。雲盾作為互聯網安全的基礎設施,對於基礎軟件的安全我們會進行深入研究和分析,保障雲平台的安全穩定運行。

0x00 漏洞捕獲

2015年9月6日,通過阿裏雲雲盾態勢感知係統,在異常流量中我們發現有黑客利用LuManager係統獲取webshell,捕獲到攻擊者的一枚攻擊payload:

1

0x01 漏洞複現

在漏洞庫中,我們並未發現該係統存在安全漏洞,推測該漏洞為一枚0day。我們第一時間對該payload進行了複現:向LuManager(版本2.0.99),index.php?m=Public&a=login 發送post數據包,提交後直接繞過登陸驗證進入後台,並執行了payload 中的SQL語句:

2

0x02 漏洞分析

官方下載了最新版本的Lumanager(2.0.99),登陸驗證的代碼位於/Lib/Action/PublicAction.php,LuManager核心代碼使用了Zend加密和代碼混淆,控製器目錄代碼解密後,函數名、類名無法還原,代碼的可讀性較差,從觸發位置尋找漏洞成因比較困難。我們更換思路來定位漏洞位置,Lumanager使用了Thinkphp框架開發,框架的代碼並未加密,開啟ThinkPHP框架trace模式進行調試,抓取到正常登陸和發送payload時候的SQL語句如下:

3

通過執行的SQL結果分析,payload觸發時,SQL語句中,User.user字段的值並沒有單引號包圍,同時這個變量可控,導致SQL注入漏洞。確定是位於where條件觸發的SQL注入,繼續跟蹤定位代碼,/Sys/Lib/Think/Db/Db.class.php 400行,parseWhere()函數內代碼:

if ( “exp” == strtolower( $val[$i][0] ) )
{
$whereStr .= “(“.$key.” “.$data.”) “.$rule.” “;
}

從上述代碼可以看到:當傳入where條件是數組,且數組第一個元素值為“exp”,會直接拚接$val[$i][1]到SQL語句的where條件中,由於沒有單引號,因此不受全局addsalash轉義影響。parseWhere()函數在上層被調用時,如果沒有檢查傳入變量的類型,直接將可控參數傳入,攻擊者利用這個特性就可以構造惡意SQL。

LuManager在登陸驗證代碼中,將$_POST[‘user’]參數傳遞後帶入了parseWhere()函數,構造該參數為數組類型,可觸發執行惡意SQL。由於該漏洞是登陸位置觸發的SQL注入,我們可以簡化payload,構造恒真條件,使用”萬能密碼”登陸後台:

POST /index.php?m=Public&a=login

user[0]=exp&user[1]==1)) or 1 --

提交後可直接以管理員身份進入後台。

LuManager登陸位置有驗證碼機製,發送payload時候需要先識別驗證碼,可以使用OCR庫自動識別驗證碼,進行自動化檢測,有興趣可以自己實現:

4

從漏洞成因上說,該漏洞實質是thinkphp框架自身的一處特性(Or 漏洞)引發的,@phith0n已經提交過thinkphp框架存在的安全問題(https://www.wooyun.org/bugs/wooyun-2010-086737),但是仍有很多基於thinkphp框架開發的係統並沒有意識到這個嚴重問題,存在漏洞的也不僅僅LuManager,建議thinkphp開發者檢查自身產品是否存在同樣問題。

0x03 漏洞影響

該漏洞影響LuManager 2.1.1以下的所有版本,攻擊者可直接以最高權限登陸後台,上傳webshell, 控製係統數據庫、操作虛擬主機。測試過程中,我們發現後台可以新增計劃任務,計劃任務會以root權限定時執行,攻擊者進入後台後可獲取係統root權限。

0x04 漏洞修複

該漏洞我們已經第一時間通知廠商,9月8日上午廠商發布升級,並對阿裏雲雲盾團隊表示感謝。目前最新版本為2.1.2,建議用戶盡快升級到最新版本2.1.2。

使用在線升級:
使用LuManager2.0.45以上版本的用戶,可以登陸LuManager在線升級,方法如下:登陸LuManager,在LuManager的首頁點擊“檢查更新”,如果沒有啟動保護密碼,請輸入後再重試

手動升級:

  • 下載LuManager_last.tar.gz安裝包:wget https://down.zijidelu.org/LuManager_last.tar.gz
  • 備份之前的LuManager:mv /usr/local/LuManager /usr/local/LuManager.bak
  • 解壓LuManager_last.tar.gz:tar -zxvf LuManager_last.tar.gz
  • 安裝新的LuManager:mv LuManager /usr/local/
  • 執行lu-repair命令便升級完成

最後更新:2017-04-01 13:38:49

  上一篇:go PostgreSQL 9.5 新特性匯總 [轉]
  下一篇:go Greenplum 表空間和filespace的用法