对htaccess的认识只停留在文件上传黑名单的绕过,还是得好好学习一下。

htaccess简介

概念

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

概述来说,htaccess 文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

作用范围

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

配置

通常情况下,Apache是默认启用 .htaccess 的,但是为了以防万一,请检查一下自己站点的配置文件,如 httpd.conf,是否有这行:

1
AllowOverride All

这行允许重写配置文件。也就是如果能够从 .htaccess 加载配置文件,那么就以 .htaccess 为配置文件对其所在目录进行配置。

功能

.htaccess简介
通过功能,顺便认识一下语法

htaccess访问控制(Allow/Deny)

Order命令

为了限制用户访问一些关键目录,.htaccess可以提供目录访问限制。你只需要在要限制的目录中,加入如下.htaccess文件:

1
deny from all

这会限制所有用户通过浏览器访问该目录,允许指定IP地址的访问:

1
2
Order Allow,Deny
Allow from 192.168.0.0/16

Order命令是一个难点,也是配置apache的基础,它决定了Apache处理访问规则的顺序。

  • 通过Allow,Deny参数,Apache首先找到并应用Allow命令,然后应用Deny命令,以阻止所有访问。
  • 通过Deny,Allow参数,Apache首先找到并应用Deny命令,然后应用Allow命令,以允许所有访问。

然后我在本地尝试发现如下配置,也限制了192.168.0.0/16网段主机的访问,去掉 Deny from All 则可以访问

1
2
3
Order Allow,Deny
Deny from All
Allow from 192.168.0.0/16

过滤域名或网络主机(Allow/Deny)

下例可以限制所有含有“domain.com”的网络主机访问网站:

1
2
3
Order Allow,Deny
Allow from all
Deny from .*domain\.com.*

禁止访问指定文件(Files)

Files命令可以用于过滤指定文件:

1
2
3
4
<Files test.php>
order allow,deny
deny from all
</Files>

禁止访问指定文件类型(FilesMatch)

下面的代码将限制访问所有.log和.exe文件:

1
2
3
4
<FilesMatch ".(log|exe)$">
Order allow,deny
Deny from all
</FilesMatch>

我们还可以通过Files命令描述文件类型,但是需要在命令后面加一个波浪线(~),该符号启用Files命令的正则表达解析功能:

1
2
3
4
5
<Files ~ "^.*\.([Ll][Oo][Gg])|([eE][xX][eE])">
Order allow,deny
Deny from all
Satisfy All
</Files>

有以下几点需要注意:

  • Files之后的波浪线用于开启“正则表达式”分析。请注意,这是个过时的用法,Apache更推荐使用<FilesMatch>指令
  • 正则表达式必须在双引号之间,有关htaccess的正则表达式用法,请查阅本站《.htaccess正则表达式》一文。
  • 双引号中的“管道符”(|)用于将两种文件类型(.log和.exe)分开,相当于逻辑“或”
  • Order命令必须嵌在Files节(Section)中,否则将会应用到所有文件
  • Satisfy All表示必须同时满足主机级别(Allow/Denay)和用户级别(Require)的限制,All是默认值,该行可以省略。

高级访问控制(Rewrite)

还可以通过运用Rewrite实现更强大的访问控制
详情可看:http://lesca.me/archives/htaccess-rewrite.html#access_control

开启mod_rewrite

1
sudo a2enmod rewrite

需要注意点:

  • FollowSymlinks必须启用,这是rewrite引擎的安全需求。
  • 通常FollowSymlinks在Apache的主配置文件中就已经启用了,所以通常可以省略。
  • RewriteEngine命令用于启用rewrite引擎
  • IfModule命令用于判断Apache是否安装了mod_rewrite模块,之后笔者会省略该命令,但不代表这是个好习惯
  • mod_rewrite会处理所有提交给Apache的URL请求,并与之后的规则进行匹配

密码保护与验证

配置.htaccess

1
2
3
4
AuthType Basic
AuthName "restricted area"
AuthUserFile /var/www/passwd
require valid-user

这个配置文件可以保护.htaccess所在的整个目录,简单说明下参数:

  • AuthType:验证类型为基本类型,密码以明文方式传输到服务器上
  • AuthName:验证提示,会出现在验证对话框中
  • AuthUserFile:验证配置文件,用于匹配用户名与密码,该密码是加密保存的
  • require valid-user:只有在AuthUserFile中出现的用户才可以通过验证

    生成htpasses文件

    如何生成passwd文件呢?我们通过htpasswd命令生成密码文件:
    1
    htpasswd -c /var/www/passwd
    它会提示你输入密码,并确认。之后将密码文件passwd保存在/var/www/目录下

对文件进行密码保护

保护与.htaccess在同一目录下的文件secure.php:

1
2
3
4
5
6
7
# password-protect single file
<Files secure.php>
AuthType Basic
AuthName "Prompt"
AuthUserFile /var/www/passwd
Require valid-user
</Files>

保护.htaccess所在目录下的多个文件:

1
2
3
4
5
6
7
# password-protect multiple files
<FilesMatch "^(execute|index|secure|insanity|biscuit)*$">
AuthType basic
AuthName "Development"
AuthUserFile /var/www/passwd
Require valid-user
</FilesMatch>

对指定IP进行密码保护

仅允许IP地址为192.168.10.5的主机直接访问该目录,其他IP需要验证。

1
2
3
4
5
6
AuthType Basic
AuthName "Personal"
AuthUserFile /var/www/passwd
Require valid-user
Allow from 192.168.10.5
Satisfy Any

目录浏览与主页

启用目录浏览

1
Options All +Indexes

禁用目录浏览

1
Options All -Indexes

我们还可以通过IndexIgnore指令来禁用目录浏览。

1
IndexIgnore *

通过IndexIgnore指令,我们可以禁止对指定类型的文件浏览:

1
IndexIgnore *.wmv *.mp4 *.avi *.etc

自定义目录浏览

如果你希望Apache在展示你的WEB目录时看起来与众不同,那么你需要启用FancyIndexing选项:

1
2
3
<IfModule mod_autoindex.c>
IndexOptions FancyIndexing
</ifModule>

通过这个选项,你可以实现自定义图标、添加文件类型描述、按日期排序等。

配置目录主页文件

即使启用了目录浏览,Apache未必会展示该目录的内容,因为该目录可能存在像index.htm这样的默认主页文件。Apache会有限展示主页文件,我们可以通过.htaccess设置:

1
DirectoryIndex index.html index.php index.htm

配置错误页面

如果Apache遇到错误,就会输出错误页面。配置自定义的错误页面,也许可以挽留即将离开的用户。

1
2
3
4
5
# custom error documents
ErrorDocument 401 /err/401.php
ErrorDocument 403 /err/403.php
ErrorDocument 404 /err/404.php
ErrorDocument 500 /err/500.php

重定向

old_dir 重新定向到 new_dir, 也可以定向到其他 WEB 站点目录

1
Redirect /old_dir/ http://www.yourdomain.com/new_dir/index.html

参考文章:

深究.htaccess的原理,和用户利用其恶意篡改服务器配值导致的深层安全问题
借github上韩国师傅的一个源码实例再次理解.htaccess的功效
PHP htaccess injection cheat sheet
.htaccess简介
.htaccess 详解
Apache .htaccess Guide, Tutorials and Articles
.htaccess利用与Bypass方式总结
Apache中.htaccess文件利用的总结与新思路拓展