phpMyAdmin遠程執行代碼漏洞安全通告
發布時間 2018-07-03漏洞編號和級別
影響范圍
受影響的系統版本:
phpMyAdmin 4.8.1
漏洞概述
phpMyAdmin 是一個以PHP為基礎,以Web-Base方式架構在網站主機上的MySQL的數據庫管理工具,讓管理者可用Web接口管理MySQL數據庫。
在phpMyAdmin 4.8.x版本中,程序沒有嚴格控制用戶的輸入,攻擊者可以利用雙重編碼繞過程序的白名單限制,造成文件包含漏洞。
此漏洞使經過身份驗證的遠程攻擊者能夠在服務器上執行任意PHP代碼。
phpMyAdmin的國內數據統計圖如下:
漏洞分析
在/index.php
這里的target 可以直接傳值輸入。我們可以傳入一個本地文件路徑去讓其包含,就會造成LFI漏洞。
首先,我們滿足4個條件:
2.不能以/index/ 開頭。
3.不能在$target_blacklist數組內。
跟蹤一下checkPageValidity函數
在/libraries/classes/Core.php
該函數內,有三處返回ture的地方,只要有任意一處返回ture就可以。觀察這三處,有一個共同點,都是需要$page在$whitelist數組中內才會返回true。
我們先看第一個返回true的地方。

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

先介紹下這些函數的作用:
mb_strpos()函數的意思是查找字符串在另一個字符串中首次出現的位置。
mb_substr()函數的意思是:
從$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 傳入時,首先會被自動解碼一次,變成%3f。然后urldecode()再解碼一次,就變成了 ?。 成功繞過了白名單限制。
這種情況下include的包含情況就是這樣的,也就可以任意包含本地文件了。
漏洞利用
完整的exp:
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
修復建議
目前官方已修復該漏洞,發布了最新版本4.8.2,可從官網下載最新版本。
參考鏈接
https://www.securityfocus.com/bid/104532
https://nvd.nist.gov/vuln/detail/CVE-2018-12613