.htaccess和.user.ini文件的妙用

.htaccess

httpd-conf是Apache的系统配置文件,一个全局的配置文件,对整个web服务起作用;而.htaccess也是Apache的配置文件,不过相当于一个局部配置文件,只对该文件所在目录下的文件起作用。

实例

在绕过文件上传的限制中,通常在Apache全局配置文件httpd.conf中有这样一条配置:

1
AddType application/x-httpd-php .php .phtml

在这里插入图片描述

这条配置的意思就是将.php、.phtml文件后缀的文件当做php文件执行,如果开启了这条配置,就可以上传.phtml文件在执行php代码,这也就是为什么在文件上传时可以尝试上传.phtml,不过在高版本中这条配置默认是关闭的,也就是只能解析.php文件后缀。

或者这条配置:

1
SetHandler application/x-httpd-php

将所有文件都解析为php文件。

通常全局文件我们都是不可更改的,而Apache还有一个局部配置文件.htaccess,这个配置文件只对该目录所在的web目录起作用,例如:我们在www目录下有一个.htaccess配置文件,配置内容为 AddType application/x-httpd-php .jpg ,将jpg文件当做PHP文件解析。这样就可以直接解析jpg后缀的webshell。

1
2
3
4
5
// .htaccess
AddType application/x-httpd-php .jpg

// 1.jpg
<?php phpinfo();?>

访问1.jpg,当做PHP解析。

局限

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

.user.ini

那么什么是.user.ini?

这得从php.ini说起了。php.ini是php默认的配置文件,其中包括了很多php的配置,这些配置中,又分为几种:PHP_INI_SYSTEMPHP_INI_PERDIRPHP_INI_ALLPHP_INI_USER。 在此可以查看:php.net/manual/zh/i… 这几种模式有什么区别?看看官方的解释:

在这里插入图片描述

其中就提到了,模式为PHP_INI_USER的配置项,可以在ini_set()函数中设置、注册表中设置,再就是.user.ini中设置。 这里就提到了.user.ini,那么这是个什么配置文件?那么官方文档在这里又解释了:

除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。

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

这里就很清楚了,.user.ini实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置。(上面表格中没有提到的PHP_INI_PERDIR也可以在.user.ini中设置)

实际上,除了PHP_INI_SYSTEM以外的模式(包括PHP_INI_ALL)都是可以通过.user.ini来设置的。

而且,和php.ini不同的是,.user.ini是一个能被动态加载的ini文件。也就是说我修改了.user.ini后,不需要重启服务器中间件,只需要等待user_ini.cache_ttl所设置的时间(默认为300秒),即可被重新加载。

然后我们看到php.ini中的配置项,可惜我沮丧地发现,只要稍微敏感的配置项,都是PHP_INI_SYSTEM模式的(甚至是php.ini only的),包括disable_functionsextension_direnable_dl等。 不过,我们可以很容易地借助.user.ini文件来构造一个“后门”。

Php配置项中有两个比较有意思的项(下图第一、四个):

在这里插入图片描述

auto_append_fileauto_prepend_file,点开看看什么意思:

在这里插入图片描述

指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中:

1
auto_prepend_file=1.png

总结:

在哪些情况下可以用到这个姿势? 比如,某网站限制不允许上传.php文件,你便可以上传一个.user.ini,再上传一个图片马,包含起来进行getshell。不过前提是含有.user.ini的文件夹下需要有正常的php文件,否则也不能包含了。 再比如,你只是想隐藏个后门,这个方式是最方便的。

实例

利用php上文配置项中有两个配置可以起到一些作用

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

在这里插入图片描述

在这里插入图片描述

这两个配置项的作用相当于一个文件包含,比如

1
2
3
4
5
6
7
// .user.ini
auto_prepend_file = 1.jpg

// 1.jpg
<?php phpinfo();?>

// 11.php

也就是在一个目录下有.user.ini这个配置文件,配置内容为上,有1.jpg,同时该目录下还需要有.php后缀的文件,auto_prepend_file = 1.jpg 这个配置的意思就是在当前目录下的.php文件包含1.jpg这个图片,在此处相当于在11.php文件头插入了 require('1.jpg') 这条语句,也就是说相当于文件包含。
另一条配置包含在文件尾,如果遇到了exit语句的话就会失效。

.user.ini使用范围很广,不仅限于Apache服务器,同样适用于Nginx服务器,只要服务器启用了fastcgi模式(通常非线程安全模式使用的就是fastcgi模式)。

局限

在.user.ini中使用这条配置的使用也说了是在同目录下的其他.php文件中包含配置中所指定的文件,也就是说需要该目录下存在.php文件,通常在文件上传中,一般是专门有一个目录用来存在图片,可能小概率会存在.php 文件。

但是有时可以使用 ../ 来将文件上传到其他目录,达到一个利用的效果。

参考:

https://www.cnblogs.com/hmbb/p/9689436.html

https://juejin.cn/post/6844903571876478989

user.ini

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2021-2023 Wh1tecell
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~