.htaccess
基本概念
.htaccess 文件是Apache中有一种特殊的文件,其提供了针对目录改变配置的方法,即在一个特定的文档目录中放置一个包含一条或多条指令的文件,以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过 Apache 的 AllowOverride 指令来设置。
.htaccess 中有 #
单行注释符,且支持 \
拼接上下两行。
作用范围
.htaccess 文件中的配置指令作用于 .htaccess 文件所在的目录及其所有子目录,但是很重要的、需要注意的是,其上级目录也可能会有 .htaccess 文件,而指令是按查找顺序依次生效的,所以一个特定目录下的 .htaccess 文件中的指令可能会覆盖其上级目录中的 .htaccess 文件中的指令,即子目录中的指令会覆盖父目录或者主配置文件中的指令。
.htaccess 常见指令
.htaccess 可以实现网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。这里我们主要讲解几种常利用的指令。
SetHandler
SetHandler 指令可以强制所有匹配的文件被一个指定的处理器处理。
用法:
1
SetHandler handler-name|None
AddHandler
AddHandler 指令可以实现在文件扩展名与特定的处理器之间建立映射。
用法:
1
AddHandler handler-name extensive [extensive] ...
AddType
AddType 指令可以将给定的文件扩展名映射到指定的内容类型。、
- 用法:
1 | AddType media-type extensive [extensive] ... |
php_value
当使用 PHP 作为 Apache 模块时,可以用 Apache 的配置文件(例如 httpd.conf)或 .htaccess 文件中的指令来修改 PHP 的配置设定。但是需要有开启 AllowOverride Options 或 AllowOverride All 权限才可以。
php_value 指令用来设定指定的 PHP 的配置值。要清除先前设定的值,把 value 设为 none。但是 php_value 不能用来设定布尔值,如果要设定布尔值的话应该用 php_flag。
•用法:
1 | php_value name value |
php_flag
php_flag 指令用来设定布尔值类型的 PHP 配置选项。
用法:
1 | php_flag name on|off |
.htaccess 的常见利用
源码泄露
我们可以通过 .htaccess 文件的 php_flag 指令对 PHP 的 engine 配置选项进行设定,当把 engine 的值设为 off(或 0)时可以禁用一个本目录和子目录中的 PHP 解析,此时将会造成源码泄露
图片马解析
我们知道,在文件上传漏洞中经常遇到上传图片马的情况,如果目标环境开启了 .htaccess 并且上传的黑名单没有限制 .htaccess 文件的话,我们便可以先上传 .htaccess 文件,对目标环境的目录进行相应的配置,然后再上传图片,使图片的 PHP 恶意代码得以被直接解析执行。
此时,常用的的两个 .htaccess 指令如下:
•SetHandler 指令
我们可以使用 SetHandler 指令强制将所有匹配的文件被 PHP 处理器处理并解析:
1 | # 将images.png 当做 php 执行<FilesMatch "images.png"> SetHandler application/x-httpd-php</FilesMatch> |
•AddType 指令
也可以使用 AddType 指令将给定的文件扩展名映射到 PHP 的内容类型:
1 | # 将 .jpg 当做 php 文件解析AddType application/x-httpd-php .png |
文件包含
本地文件包含
在本目录或子目录中有可解析的 PHP 文件时,可以通过 php_value 来设置 auto_prepend_file 或者 auto_append_file 配置选项来让所有的 PHP 文件自动包含一些敏感文件或恶意文件(如WebShell),来触发文件包含。
下面 .htaccess 分别通过这两个配置选项来包含 /etc/passwd,并访问同目录下的 index.php文件。
•auto_prepend_file
1 | php_value auto_prepend_file /etc/passwd |
•auto_append_file
1 | php_value auto_append_file /etc/passwd |
这两个配置选项用于设置访问一个 PHP 文件时,在该 PHP 文件解析之前会先自动包含并解析的文件。如下图当我们访问 index.php 时,便会自动将 /etc/passwd 包含进来:
远程文件包含
PHP 的 allow_url_include 配置选项这个选项默认是关闭的,如果开启的话就可以进行远程包含。因为 allow_url_include 的配置范围为 PHP_INI_SYSTEM,所以无法利用 php_flag 指令在 .htaccess 文件中开启。这里为了演示,就先在 php.ini 中设置 allow_url_include 为 On。
任意代码执行
通过 PHP 伪协议
这里主要用的还是 auto_prepend_file 或 auto_append_file 这两个配置项。
条件:
•allow_url_fopen 为 On•allow_url_include 为 On•目标环境的当前目录中存在至少一个 PHP 文件
1 | php_value auto_append_file data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+或:php_value auto_append_file data://text/plian,%3c%3fphp+phpinfo()%3b%3f%3e// 如果不使用base64加密则注意需要url编码 |
通过解析 .htaccess 文件
•方法一:通过包含 .htaccess 自身
•方法二:直接将 .htaccess 文件当做 PHP文件处理
这种方法适合目标环境当前目录或子目录下没有 PHP 文件的情况下。
需要先在 .htaccess 里面设置允许访问 .htaccess 文件,否则是直接访问 .htaccess 文件是Forbidden的:
进行 XSS 攻击
通过设置 highlight_file
我们可以通过 .htaccess 文件设定 highlight.comment 选项,指定需要高亮的内容,从而进行 XSS。
自定义错误文件(可写Webshell)
error_log 可以将 PHP 运行报错的记录写到指定文件中,因此我们可以通过 .htaccess 文件设定 error_log 选项来自定义错误文件的存储路径,并以此来写入Webshell: