phpMyAdmin遠程執行代碼漏洞安全通告

發布時間 2018-07-03

漏洞編號和級別


CVE-2018-12613  廠商自評:高危  CVSS分值:官方未評定


影響范圍


受影響的系統版本:


phpMyAdmin 4.8.0
phpMyAdmin 4.8.1


漏洞概述


phpMyAdmin 是一個以PHP為基礎,以Web-Base方式架構在網站主機上的MySQL的數據庫管理工具,讓管理者可用Web接口管理MySQL數據庫。


在phpMyAdmin 4.8.x版本中,程序沒有嚴格控制用戶的輸入,攻擊者可以利用雙重編碼繞過程序的白名單限制,造成文件包含漏洞。


此漏洞使經過身份驗證的遠程攻擊者能夠在服務器上執行任意PHP代碼。


phpMyAdmin的國內數據統計圖如下:


 


漏洞分析


在/index.php


 

這里的target 可以直接傳值輸入。我們可以傳入一個本地文件路徑去讓其包含,就會造成LFI漏洞。


首先,我們滿足4個條件:


1.傳入的target 需要是一個字符串。
2.不能以/index/ 開頭。

3.不能在$target_blacklist數組內。


 


4.滿足checkPageValidity函數要求。


跟蹤一下checkPageValidity函數


在/libraries/classes/Core.php


 


該函數內,有三處返回ture的地方,只要有任意一處返回ture就可以。觀察這三處,有一個共同點,都是需要$page在$whitelist數組中內才會返回true。


 


我們先看第一個返回true的地方。


 


這里的$page在in_array之前沒有經過任何的修飾,直接就與$whitelist作比較。沒有辦法繞過,傳入的target值只能為白名單里的文件名才行。很明顯,第一個并不能利用。


再來看第二個


 


先介紹下這些函數的作用:


mb_strpos()函數的意思是查找字符串在另一個字符串中首次出現的位置。


mb_substr()函數的意思是:


string mb_substr ( string $str, int $start [, int $length = NULL [, string $encoding = mb_internal_encoding()]] )

從$str字符串中,提取從$start位置開始,長度為$length的字符串。


可以看出,第二個可以返回ture,我們利用db_sql.php?/../../格式就可以達到目的,繞過白名單限制。那是不是這樣就可以造成漏洞了呢?


假設我們用db_sql.php?/../../../aaa.txt來繞過白名單限制進行包含文件。


 


那這里就是 include ‘db_sql.php?/../../../aaa.txt’。


這種格式并不能跨路徑包含,因為php程序把?號后面的東西當成是傳入db_sql.php文件的參數。


再來看第三個:


 


第三個和第二個對比多出了個urldecode()函數。


而問題恰恰出在了這個urldecode()函數。


我們可以利用雙重編碼繞過,將?經過兩次編碼%253f就可以繞過白名單驗證。


原因是:


%253f 傳入時,首先會被自動解碼一次,變成%3f。然后urldecode()再解碼一次,就變成了 ?。 成功繞過了白名單限制。


這種情況下include的包含情況就是這樣的,也就可以任意包含本地文件了。


include  db_sql.php%3f/../../../aaa.txt。


漏洞利用


完整的exp:


GET /index.php?target=sql.php%3f/../../etc/passwd


tips:


1、%3f 將被解碼并成為?。

2、Core::checkPageValidity剝離所有內容?并sql.php在白名單內找到:檢查被繞過!
3、index.php運行include 'sql.php?/../../etc/passwd',PHP的魔術來轉換路徑 ../etc/passwd,而不檢查目錄是否sql.php?存在。最后,它包含../etc/passwd成功。


要寫這個漏洞,可以枚舉文件路徑,如:


/etc/passwd

../../etc/passwd
../windows/win.ini

../../windows/win.ini


一旦你找到了..你需要預先設置的數量 ,你可以將你的php有效載荷注入到訪問日志中,或者運行一個查詢SELECT ‘<?php phpinfo();?>',sql.php并包含你自己的會話文件(例如/var/lib/php5/sess_<PHPSESSID>),它包含你的SQL查詢,以執行任意PHP代碼。


修復建議


目前官方已修復該漏洞,發布了最新版本4.8.2,可從官網下載最新版本。


下載鏈接:https://www.phpmyadmin.net/news/2018/6/21/security-fix-phpmyadmin-482-released/。


參考鏈接


https://www.phpmyadmin.net/security/PMASA-2018-4/
https://www.securityfocus.com/bid/104532
https://nvd.nist.gov/vuln/detail/CVE-2018-12613