文件.htaccess的利用

.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: