.user.ini导致文件上传绕过
前言
上周末有SUCTF,然而我却在摸鱼基本没看题,赛后看到队里的共享文档中有一道web的writeup,涉及到的知识点在特定的情况下很实用,因此复现一下(周内太忙了,拖到周五所有的)
之前也在ciscn的华东北的线下赛
遇到一道.htaccess
绕过黑名单上传限制,达到getshell
的效果的题目
https://www.cnblogs.com/sijidou/p/13111905.html
但是.htaccess
只是适用于apache
,如果变成niginx
或者iis
则不会被解析
预备知识
现在大部分网站都是用的fastcgi
,这个东西我理解的是可以提供web服务器的一种api
,而apache
/nginx
/iis
这些服务器都会依靠这种api
来运行
而在服务器以fastcgi
启动运行的时候,.user.ini
也是php
的一种配置文件,众所周知php.ini
是php
的配置文件,它可以做到显示报错,导入扩展,文件解析,web站点路径等等设置。但是如果想要把某个文件里面的配置与全局的php.ini
不同,则可以在php文件
中加上ini_set()
来配置特定的配置变量。
而.user.ini
和.htaccess
一样是对当前目录的所以php
文件的配置设置,即写了.user.ini
和它同目录的文件会优先使用.user.ini
中设置的配置属性。
但是不是php.ini
中的每个变量都能通过ini_set()
或者.user.ini
和.htaccess
来设置,简单的来说每个变量有它所属于的模式,下面官方手册的四个模式
https://www.php.net/manual/zh/configuration.changes.modes.php
比如在PHP_INI_ALL
模式下,而不在PHP_INI_PERDIR
模式下的配置属性,则不能通过ini_set()
来设置
通过上表,看到PHP_INI_USER
模式中提到,可以在.user.ini
中设定。但实际上,只要不是PHP_INI_SYSTEM
模式下的属性,均可以在.user.ini
中设置,可以通过该表来查看哪些属性属于哪些模式
https://www.php.net/manual/zh/ini.list.php
有2个属性,它们的作用是,auto_append_file
在php
文件最后用require
包含进指定文件,auto_prepend_file
则是在php
文件代码执行前用require
包含进指定的文件
它们在.user.ini
中的语法十分的简单
//.user.ini
auto_prepend_file=top.html
auto_append_file=down.html
利用
此时接着写的时候已经是周五了,比赛环境已经关了,于是本地写个demo复现一波
本地写个简单的上传验证,简单过滤了 ph*
和.htaccess
<?php
var_dump($_FILES);
$ext = @end(explode('.',$_FILES['file']['name']));
echo $ext;
if(preg_match("/ph.*|\.htaccess/i", $ext) === 0){
move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']);
}
else{
die("disable upload");
}
?>
<html>
<head>
<title>上传测试</title>
<meta charset="utf-8">
</head>
<body>
<form action="" method="POST" enctype="multipart/form-data">
<input type="file" name="file" id="file" />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
这个明显是传不了php的脚本了的,但是利用.user.ini
首先上传个1.jpg
看下文件夹中是成功进去了
直接访问肯定是不行的,接下来上传.user.ini
成功上传进去了
执行以下访问index.php
,可以看到whoami
已经打印出来了
利用条件
利用.user.ini
上传条件需要是使用的是fastcgi
,我的环境是phpstudy
的php7.2
, 之前使用php5.4
失败
注意server API
不一样
还有啊,比赛的时候是进行了文件头检验的,所以要加个文件头,把auto_prepend_file=xxx
换行,比如
//.user.ini
GIF89a
auto_prepend_file=xxx
它不像.htaccess
,特别注重每行内容和格式
参考文章
https://wooyun.js.org/drops/user.ini文件构成的PHP后门.html?tdsourcetag=s_pcqq_aiomsg
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2018-06-13 “百度杯”CTF比赛 九月场 YeserCMS