講解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類的文件包含函數中的參數是否外界可控

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/234150.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-11 17:54
下一篇 2024-12-11 17:54

相關推薦

發表回復

登錄後才能評論