open basedir後可能存在的安全隱患

2021-05-24 21:25:12 字數 2746 閱讀 6871

目前php站點的安全配置基本是open_basedir+safemode,確實很無敵、很安全,即使在許可權沒有很好設定的環境中,這樣配置都是相當安全的,當然了,不考慮某些可以繞過的情況。本文討論兩點開啟open_basedir後可能導致的安全隱患(現實遇到的),乙個也許屬於php的乙個小bug,另外乙個可能是由於配置不當產生的。

一、open_basedir中處理檔案路徑時沒有嚴格考慮目錄的存在,這將導致本地包含或者本地檔案讀取的繞過。

看乙個本地檔案任意讀取的例子:

雖然file是任意提交的,但是限制了字首必須為img,我們如果想跳出目錄讀檔案,比如,讀取**根目錄下的config.php,我們得提交?file=img/../../config.php,但是此處有個限制條件,就是upload目錄下不存在img資料夾,在windows檔案系統裡,系統不會去考慮目錄存在不存在,會直接跳轉目錄從而導致漏洞;但linux檔案系統非常嚴謹,它會仔細判斷每一層目錄是否存在,比如這裡由於不存在img,則跳出去讀取檔案的時候直接報錯。看如下乙個示意圖:

再看乙個類似的本地包含的例子:

<?php  

include 

"aaa"

.$_get

['lang'

].".php"

;?>

由於linux檔案系統的限制,我們無法利用旁註去包含tmp下的檔案。

linux嚴謹的考慮在php那裡顯然沒有得到深刻的體會。在開啟了open_basedir的時候,php對傳入的檔案路徑進行了取真實路徑的處理,然後跟open_basedir中設定的路徑進行比較:

……

/* normalize and expand path */

if (expand_filepath(path, resolved_name tsrmls_cc) == null)

path_len = strlen(resolved_name);

memcpy(path_tmp, resolved_name, path_len + 1); /* safe */

……

但php在處理的時候忽略了檢查路徑是否存在,於是在開啟了open_basedir時,上面那個檔案讀取的例子,我們可以使用?file=img/../../config.php來直接讀取了,此時提交的路徑已經被處理成/home/www/config.php了,所以不存在任何讀取問題了。

問題由滲透測試的時候遇到繞過的情況從而導致疑問,經分析環境差異,然後xi4oyu牛指點有可能是open_basedir的問題後測試總結出這是php的乙個小的bug,但是很有可能導致安全隱患。

二、open_basedir的值配置不當,有可能導致目錄跨越。

很多管理員都知道設定open_basedir,但在配置不當的時候可能發生目錄跨越的問題。

錯誤的配置:/tmp:/home/www,正確的配置:/tmp/:/home/www/

……

/* resolve open_basedir to resolved_basedir */

if (expand_filepath(local_open_basedir, resolved_basedir tsrmls_cc) != null)

} else

……

php考慮了以/結束的路徑,但是如果沒有/,就直接帶入下文比較了。

於是,當新建乙個**為 /home/wwwoldjun/(均已經分別設定open_basedir),如果配置錯誤,則可以從/home/www/目錄跳轉到/home/wwwoldjun/目錄。

本地測試:

舉個滲透例項,某idc商在租用虛擬主機的時候如此分配空間/home/wwwroot/user***/、/home/wwwroot/useryyy/...,而open_basedir是這樣錯誤配置的:/tmp:/home/wwwroot/user***、/tmp:/home/wwwroot/useryyy。如果我們想通過配置的錯誤輕易滲透下user***站點,我們該怎麼做?

頂oldjun,之前也發現了這個問題。

建議大家設定open_basedir的時候可以這樣設定。

"/tmp":"/wwwroot/user***x":"/wwwroot/user000xx"

可以防止被包含,讀取敏感資料。

List裡有可能存String型別元素嗎?

這其實是我遇到的乙個線上bug,在這裡分享給大家。如果是用反射,那就很簡單了,畢竟泛型只是在編譯期進行約束,對執行期是無能為力的。想想看,如果不使用反射,有沒有辦法做到呢?主要業務邏輯 public static void main string args else 這是公司提供的乙個公共工具方法,...

Oracle 級聯刪除約束後索引物件仍然存在

oracle 資料庫裡可能因索引與約束建立的依賴關係不同,在級聯刪除約束後索引物件可能仍然存在 示例 建表 create table test tmp asselect rownum as task id from dual connect by rownum 10 先建立索引 create uni...

新增依賴後可能出現的各種問題

記錄一下今天遇到的各種坑 新增一條依賴之後,可能會出現這樣的問題 也可嘗試在build.gradle android中新增 packagingoptions在清單檔案標頭檔案中新增 xmlns tools tools replace android icon,android theme 同時你也可能...