<menu id="ycqsw"></menu><nav id="ycqsw"><code id="ycqsw"></code></nav>
<dd id="ycqsw"><menu id="ycqsw"></menu></dd>
  • <nav id="ycqsw"></nav>
    <menu id="ycqsw"><strong id="ycqsw"></strong></menu>
    <xmp id="ycqsw"><nav id="ycqsw"></nav>
  • php代碼審計工具(講解php代碼審計入門)


    01、什么是文件包含漏洞?

    攻擊者利用包含的特性,加上應用本身對文件(包含)控制不嚴格,最終造成攻擊者進行任意文件包含。(包含的文件內容會被當成PHP腳本文件來解析,忽略文件后綴名)

    一句話來說就是:文件包含并不屬于漏洞,但是由于對包含進來的文件不可控,導致了文件包含漏洞的產生。

    本地文件包含叫做LFI(local file include),遠程文件包含叫做RFI(remote file include),默認PHP不開啟遠程文件包含。

    02、相關函數

    • include:PHP運行到include然后去調用被包含文件執行,如果包含文件不存在則報錯,但是會繼續往下執行;
    • require:PHP在運行前,就先去把被包含文件的內容提取出來然后整合成新的PHP一齊執行,如果包含的文件不存在則報錯,不會繼續執行;
    • include_once|require_once:如果文件已經被包含一次就不會重復包含。

    舉例,網站根目錄下有一個名為 “test.txt” 的文本文件,內容如下:一次對文件包含漏洞的代碼審計(CVE-2018-12613)

    圖1 test.txt

    在一張頁面中引用這個文件,我使用了include語句,內容如下:一次對文件包含漏洞的代碼審計(CVE-2018-12613)

    圖2 include.php

    使用瀏覽器訪問帶有文件包含的頁面時,效果如下:一次對文件包含漏洞的代碼審計(CVE-2018-12613)

    圖3 訪問頁面

    03、漏洞描述

    CVE-2018-12613漏洞來自phpMyAdmin中的一部分代碼被重定向和加載,以及對白名單頁面進行不正確的過濾,導致攻擊者能夠讀取到服務器下的任意文件。

    影響版本:

    phpMyAdmin 4.8.0 和 4.8.1

    代碼審計

    1、首先文件包含利用位于/index.php文件中的target參數

    第55-63行:一次對文件包含漏洞的代碼審計(CVE-2018-12613)

    圖 4 index.php

    這里寫明了想執行包含文件代碼include $_REQUEST[‘target’],需要滿足以下5個條件:

    • $_REQUEST[‘target’] 不為空;
    • $_REQUEST[‘target’] 是字符串;
    • $_REQUEST[‘target’] 開頭不是index;
    • $_REQUEST[‘target’] 不在 $target_blacklist 中;
    • Core::checkPageValidity($_REQUEST[‘target’]) 為真。

    于是,往前追溯找到變量$target_blacklist具體含有哪些內容。

    在同一文件下50-52行:一次對文件包含漏洞的代碼審計(CVE-2018-12613)

    圖 5 target_blacklist

    這時清楚了當$_REQUEST[‘target’]不是import.php或export.php,即可以實現文件包含。

    二、接下來定位另一個限制,在
    /libraries/classes/core.php文件中的checkPageValidity()方法。

    位于443-478行處:一次對文件包含漏洞的代碼審計(CVE-2018-12613)

    圖6 checkPageValidity方法

    分析該方法中包含的幾個if判斷:

    • 首先$whitelist為空,賦值為self::$goto_whitelist

    一次對文件包含漏洞的代碼審計(CVE-2018-12613)

    圖7 白名單內容

    • 如果$page在白名單中,就會返回true,但是我們的$page帶有參數,就要進行一下判斷若$page存在$whitelist中的某個值則返回true;

    mb_strpos()函數的意思是返回$page中” ? “的位置,然后substr()函數進行截取,返回結果$_page去的是$page問號前面的部分。如果$_page在白名單中就會返回ture。

    • 最后可以得出,若傳入target=db_sql.php%253f/../../test.txt(%253f是?的url二次編碼),經過兩次解碼后(GET傳參默認解碼一次url)變回?,分割后取出前面的字符串為db_sql.php,會進入最后一個 if 判斷返回 true

    因為php會將前面的db_sql.php?當成目錄,所以需要多加一個/../來跨出目錄。如果包含的文件需要傳參的時候可以使用&符號。

    所以,只要taget參數的值構造得當,就可以實現繞過它的檢測,實現文件包含漏洞。

    05、漏洞復現

    payload:

    http://[phpmyadmin_ip]/index.php?target=db_sql.php%253f/../../../../etc/passwd一次對文件包含漏洞的代碼審計(CVE-2018-12613)

    圖 8 漏洞利用

    可以看到成功讀取了/etc/passwd文件,除此之外還能使用該漏洞配合sql語句寫入木馬后getshell,感興趣的小伙伴可以深入研究,發現更多的利用姿勢。

    06、防御措施

    1. 在建站的過程中,非必須的情況下設置allow_url_include和allow_url_fopen為關閉;

    2. 如果需要文件包含,應對包含的文件進行限制,使用白名單方式或設置可包含目錄,如open_basedir;

    3. 對用戶輸入進行嚴格檢查,參數中不允許出現../之類的目錄跳轉符;

    4. 嚴格檢查include類的文件包含函數中的參數是否外界可控

    版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。

    發表評論

    登錄后才能評論
    国产精品区一区二区免费