freeBuf
浅析.htaccess和.user.ini文件上传
2021-09-02 10:10:04

大佬请绕行,本篇全是基础基础知识,小白不易,勿喷,谢谢。

.htaccess

解析

1、 .htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
2、 概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
3、 笼统地说,.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。

工作

.htaccess文件(或者"分布式配置文件")提供了针对每个目录改变配置的方法,即在一个特定的目录中放置一个包含指令的文件,其中的指令作用于此目录及其所有子目录。
在绕过文件上传的限制中,在Apache全局配置文件中httpd.conf有这样一条配置
AddType application/x-httpd-php .php .phtml .php5 .pht .phps

图片.png
这里配置的意思就是将以.php .phtml .php5 .pht .phps为后缀的文件按php文件进行解析。

AddType application/x-httpd-php (.jpg) //将所有文件按照php文件进行解析(将jpg文件按照php文件进行解析)

我们来看一个例题来帮助理解。

[MRCTF2020]你传你*呢

经过测试
发现上传的jpg通过修改后缀名上传成功
但后台仍然无法解析我们上传的shell
故使用.htaccess文件进行一次“包含”

先上传一个.htaccess文件
内容如下

<FilesMatch "a.png">
SetHandler application/x-httpd-php

第一行的文件名为要上传的shell的文件名
第二行就是我们上面解释到的,将所有文件都按照php代码进行解析
抓包
图片.png
这里将文件类型修改为image/png
服务器会按php文件进行解析
再上传shell

图片.png

通过蚁剑连接shell
读取flag
图片.png

局限

.htaccess的配置文件只能在Apache服务器中起作用

下面介绍另一个配置文件

.user.ini

php.ini是php的全局配置文件,对整个web服务起作用,.user.ini和.htaccess都是目录的配置文件,.user.ini是用户自定义的php.ini,通常构造后门和隐藏后门。

.user.ini

自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的 INI 文件。此类文件仅被 CGI/FastCGI
SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果使用 Apache,则用 .htaccess 文件有同样效果。
官方解释:
除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER[‘DOCUMENT_ROOT’] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。
这些模式决定着一个 PHP 的指令在何时何地,是否能够被设定。手册中的每个指令都有其所属的模式。例如有些指令可以在 PHP 脚本中用 ini_set() 来设定,而有些则只能在 php.ini 或 httpd.conf 中。

图片.png
auto_prepend_file 表示加载第一个PHP代码之前执行指示(包含的)PHP文件
auto_append_file 表示加载第一个PHP代码之后执行指示(包含的)PHP文件
简单来说

auto_prepend_file = <filename>         //包含在文件头
auto_append_file = <filename>          //包含在文件尾

auto_append_file、auto_prepend_file
指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。

官方解释:

在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。

看下配置文件
图片.png
所以看出来,在.user.ini的配置文件中一些选项是可以有用户自己修改的,也就是可以自定义的,在官方文档中也解释了,每种模式可修改的途径。

图片.png
但配置文件也不是随意修改的

可识别的配置文件范围:
https://www.php.net/manual/zh/ini.list.php
https://www.php.net/manual/zh/configuration.changes.modes.php

本地测试一下
在服务器.user.ini写入

auto_prepend_file=Demo.png

在包含的文件Demo.png中写入

但这里有一个局限的点,在.user.ini 中使用这条配置的使用也说了是在同目录下的其他.php 文件中包含配置中所指定的文件,也就是说需要该目录下存在.php 文件。
所以要在目录下多存放一个echo.php
写入内容

输出成功
图片.png
当然我这里用的是autp_prepend_file包含的
所以是在结束后才加载出来
图片.png
来看一个简单的题目帮助理解吧
CTFshowweb153

抓包看到服务器不是Apache,而是Nginx

图片.png

那么上面一题中我们是用的.htaccess就无法使用了
转向.user.ini
依然用到“包含”的思想
图片.png

所以在.user.ini中我们写入内容

auto_append_file="a.txt"

其中a.txt还是我们的shell的文件名
图片.png
接着上传shell
图片.png
图片.png

综上

能够利用.user.ini的条件:

服务器脚本语言为PHP 服务器使用CGI
FastCGI模式
上传目录下要有可执行的php文件

从这里可以看到,虽然.user.ini也有限制条件,但是相比.htaccess的用于更加广泛,不仅适用于Apache,还可以在Nginx上操作。
除此之外,还可以利用.user.ini进行隐藏后门,在php目录下留下图片马。
当然这里涉及的都是基础概念和题目
本人业余兴趣选手,学业之余,喜欢看一点安全方向的内容

本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏