作者:
phith0n
·
2014/10/30 10:51
0x00 背景
這個估計很多同學看了不屑,認為是爛大街的東西了:
.htaccess檔案構成的PHP後門
那麼我來個新的吧:.user.ini
。它比.htaccess
用的更廣,不管是nginx/apache/IIS,只要是以fastcgi執行的php都可以用這個方法。我的nginx伺服器全部是fpm/fastcgi,我的IIS php5.3以上的全部用的fastcgi/cgi,我win下的apache上也用的fcgi,可謂很廣,不像.htaccess有侷限性。
0x01 .user.ini
那麼什麼是.user.ini?
這得從php.ini說起了。php.ini是php預設的配置檔案,其中包括了很多php的配置,這些配置中,又分為幾種:PHP_INI_SYSTEM
、PHP_INI_PERDIR
、PHP_INI_ALL
、PHP_INI_USER
。 在此可以檢視:http://php.net/manual/zh/ini.list.php 這幾種模式有什麼區別?看看官方的解釋:
其中就提到了,模式為PHP_INI_USER的配置項,可以在ini_set()函式中設定、登錄檔中設定,再就是.user.ini中設定。 這裡就提到了.user.ini,那麼這是個什麼配置檔案?那麼官方文件在這裡又解釋了:
除了主 php.ini 之外,PHP 還會在每個目錄下掃描 INI 檔案,從被執行的 PHP 檔案所在目錄開始一直上升到 web 根目錄($_SERVER['DOCUMENT_ROOT']
所指定的)。如果被執行的 PHP 檔案在 web 根目錄之外,則只掃描該目錄。
在 .user.ini
風格的 INI 檔案中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 設定可被識別。
這裡就很清楚了,.user.ini
實際上就是一個可以由使用者“自定義”的php.ini,我們能夠自定義的設定是模式為“PHP_INI_PERDIR 、 PHP_INI_USER”的設定。(上面表格中沒有提到的PHP_INI_PERDIR也可以在.user.ini中設定)
實際上,除了PHP_INI_SYSTEM
以外的模式(包括PHP_INI_ALL)都是可以透過.user.ini來設定的。
而且,和php.ini
不同的是,.user.ini
是一個能被動態載入的ini檔案。也就是說我修改了.user.ini
後,不需要重啟伺服器中介軟體,只需要等待user_ini.cache_ttl
所設定的時間(預設為300秒),即可被重新載入。
然後我們看到php.ini中的配置項,可惜我沮喪地發現,只要稍微敏感的配置項,都是PHP_INI_SYSTEM
模式的(甚至是php.ini only的),包括disable_functions
、extension_dir
、enable_dl
等。 不過,我們可以很容易地藉助.user.ini
檔案來構造一個“後門”。
Php配置項中有兩個比較有意思的項(下圖第一、四個):
auto_append_file
、auto_prepend_file
,點開看看什麼意思:
指定一個檔案,自動包含在要執行的檔案前,類似於在檔案前呼叫了require()函式。而auto_append_file類似,只是在檔案後面包含。 使用方法很簡單,直接寫在.user.ini中:
auto_prepend_file=01.gif
01.gif是要包含的檔案。
所以,我們可以藉助.user.ini輕鬆讓所有php檔案都“自動”包含某個檔案,而這個檔案可以是一個正常php檔案,也可以是一個包含一句話的webshell。
測試一下,我分別在IIS6.0+Fastcgi+PHP5.3和nginx+fpm+php5.3上測試。 目錄下有.user.ini,和包含webshell的01.gif,和正常php檔案echo.php:
訪問echo.php即可看到後門:
Nginx下同樣:
那麼,我們可以猥瑣地想一下,在哪些情況下可以用到這個姿勢? 比如,某網站限制不允許上傳.php檔案,你便可以上傳一個.user.ini,再上傳一個圖片馬,包含起來進行getshell。不過前提是含有.user.ini的資料夾下需要有正常的php檔案,否則也不能包含了。 再比如,你只是想隱藏個後門,這個方式是最方便的。
0x02 參考文獻:
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!