文件上傳之.user.ini


文件上傳之.user.ini

前言

  • 環境:buuctf中[SUCTF 2019]CheckIn1
  • 知識點:.user.ini配置文件
  • 參考:wp

做題

按照往常那樣,上馬套路修改,在所有的php后綴都試過之后,嘗試試着用.htaccess文件,將test.png當成php解析

<FilesMatch "test.png">

SetHandler application/x-httpd-php

</FilesMatch>

最終也上傳成功,但是test.png沒有被當做php文件解析,原因在於本題服務器是nginx不是apache,(nginx要引用.htaccess也可以,但是還要進行某部分修改),這里顯然不滿足條件,所以沒用。

.user.ini

首先介紹php.ini文件,php有很多配置,並可以在php.ini中設置。在每個正規的網站里,都會由這樣一個文件,而且每次運行PHP文件時,都會去讀取這個配置文件,來設置PHP的相關規則。
這些配置可以分為四種:


我感覺是按重要程度分類了,比如關乎到系統一類的配置,那一類的全部配置,都屬於“PHP_INI_SYSTEM”。它只能在,像php.ini這樣的“厲害”的文件里可以設定。而其他的三類不怎么重要的配置,除了可以在php.ini中設定外,還可以在其它類似的文件中設定,其中就包括.user.ini文件。

實際上,除了PHP_INI_SYSTEM以外的模式(包括PHP_INI_ALL)都是可以通過.user.ini來設置的。而且,和php.ini不同的是,.user.ini是一個能被動態加載的ini文件。也就是說我修改了.user.ini后,不需要重啟服務器中間件,只需要等待user_ini.cache_ttl所設置的時間(默認為300秒),即可被重新加載。

這里就很清楚了,.user.ini實際上就是一個可以由用戶“自定義”的php.ini,我們能夠自定義的設置是模式為“PHP_INI_PERDIR 、 PHP_INI_USER”的設置。(上面表格中沒有提到的PHP_INI_PERDIR也可以在.user.ini中設置)

其中有兩個配置,可以用來制造后門:
auto_append_file、auto_prepend_file
指定一個文件,自動包含在要執行的文件前,類似於在文件前調用了require()函數。而auto_append_file類似,只是在文件后面包含。 使用方法很簡單,直接寫在.user.ini中:

auto_prepend_file=test.jpg

或者

auto_append_file=test.jpg

然后將圖片馬傳上去,再訪問index.php,注意是上傳目錄下的index.php,執行任意命令即可,也可蟻劍連接

題目源碼

<?php
// error_reporting(0);
$userdir = "uploads/" . md5($_SERVER["REMOTE_ADDR"]);
if (!file_exists($userdir)) {
    mkdir($userdir, 0777, true);
}
file_put_contents($userdir . "/index.php", "");
if (isset($_POST["upload"])) {
    $tmp_name = $_FILES["fileUpload"]["tmp_name"];
    $name = $_FILES["fileUpload"]["name"];
    if (!$tmp_name) {
        die("filesize too big!");
    }
    if (!$name) {
        die("filename cannot be empty!");
    }
    $extension = substr($name, strrpos($name, ".") + 1);
    if (preg_match("/ph|htacess/i", $extension)) {
        die("illegal suffix!");
    }
    if (mb_strpos(file_get_contents($tmp_name), "<?") !== FALSE) {
        die("&lt;? in contents!");
    }
    $image_type = exif_imagetype($tmp_name);//獲取文件頭的,要用GIF89a?繞過
   if (!$image_type) {
        die("exif_imagetype:not image!");
    }
    $upload_file_path = $userdir . "/" . $name;
    move_uploaded_file($tmp_name, $upload_file_path);
    echo "Your dir " . $userdir. ' <br>';
    echo 'Your files : <br>';
    var_dump(scandir($userdir));
}


免責聲明!

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



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