.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过.htaccess文件,可以改变所在文件夹和子文件下的php.ini配置。
在CTF赛题中,如果能够上传或者写入一个.htaccess,就可以做到绕过WAF、文件包含等操作,笔者之前参加比赛时看到过.htaccess文件的利用,于是将各种用法总结出来分享给大家,希望有所帮助。
![1d0d6806704d2699e898eeed0cf78caa.gif](https://i-blog.csdnimg.cn/blog_migrate/f4d59fe2829d568fbd79d908c9df7a2c.gif)
本文是 i 春秋论坛作家「kawhi」表哥原创的技术文章分享,公众号旨在为大家提供更多的学习方法与技能技巧,文章仅供学习参考。
.htaccess文件是默认开启的,如果没有启动.htaccess文件的话,需要修改配置文件httpd.conf中的以下两点:
把AllowOverride None修改为:AllowOverride All;
把LoadModule rewrite_module modules/mod_rewrite.so这句话前面的#去掉。
.htaccess任意文件解析
在CTF中.htaccess文件最常用的地方就是文件上传题目,如果题目中使用的是黑名单机制,即限制上传php,pthml,pht等后缀,我们可以使用.htaccess文件重新配置当前文件的解析后缀,为其他后缀绕过导致其他后缀的文件被解析为php,就可以导致远程代码执行。
AddType
比如在upload-labs的第四关就可以使用这种方法绕过,首先是限制了php的后缀,如图所示shell.php不允许上传。
但是题目并没有限制.htaccess文件的上传,可以上传一个.htaccess文件内容如下:
AddType application/x-httpd-php .jpg
AddType可以指示文件管理系统,对指定后缀文件以选定的文件类型解析,整句话的作用就是让jpg格式的文件解析为php文件。
上传完.htaccess文件之后再上传一个写入一句话木马的shell.jpg文件,尝试连接蚁剑。
发现已经成功连接上了,说明我们上传的.htaccess文件已经成功让jpg格式的文件解析为php了。
AddHandler
除了AddType之外还有AddHandler,我们想将txt文件后缀解析为php运行,可以在.htaccess中写下以下两行的其中一行。
AddHandler php5-script .txt
AddHandler php7-script .txt
意思是指定扩展名为.php 的文件应被php5-srcipt/php7-srcipt处理器来处理。
可以看到写入前后的对比,后者成功把txt文件解析为php文件。
一般这种可以配合着其他的语句来使用,比如说[de1ctf 2020]Check in的这道题,过滤了如下黑名单:
perl|pyth|ph|auto|curl|base|>|rm|ruby|openssl|war|lua|msf|xter|telnet
我们可以上传一个.htaccess内容如下,主要让txt文件解析为php文件,再把flag包含进来。
AddHandler p\hp5-script .txt
p\hp_value au\to_append_file /flag
再上传一个1.txt就能加载/flag内容。不过这里涉及到了.htaccess的换行绕过和文件包含,下面都会提到。
SetHandler
.htaccess文件解析还有另外一种常见写法就是利用SetHandler,文件内容如下:
SetHandler application/x-httpd-php
这样所有文件都会当成php来解析,如果要指定某一个类型文件的话,可以写:
"shell.jpg">
SetHandler application/x-httpd-php
将shell.jpg解析为php文件,同时这里可以使用正则匹配文件比如:
SetHandler application/x-httpd-php
就是匹配所有的.ph开头的后缀文件。
SetHandler还有一种用法就是在.htaccess写入:
SetHandler server-status
然后再访问http://ip/server-status即可查看所有访问本站的记录,[de1ctf 2020]Check in这道题的官方wp中提到了这种方式去获取信息。
.htaccess的一些绕过
绕过关键字
像上面的upload-labs的第四关内容中如果过滤了application关键字,因为.htaccess支持换行编写,我们可以使用反斜杠换行绕过的方法,如:
AddType appli\cation/x-httpd-php .jpg
绕过exif_imagetype函数
exif_imagetype( ) 的作用是读取一个图像的第一个字节并检查其签名。
比如[SUCTF 2019]EasyWeb这道题就有这个函数,关键代码如下:
$tmp_name = $_FILES["file"]["tmp_name"];
if(!exif_imagetype($tmp_name)) die("^_^");
要注意的是通常我们会在上传文件中加上gif的文件头GIF89a去绕过,但是.htaccess文件用这种方法虽然能上传成功,但是无法生效。我们可以在.htaccess文件前面加上:
#define 4c11f3876d494218ff327e3ca6ac824f_width xxx(大小)
#define 4c11f3876d494218ff327e3ca6ac824f_height xxx(大小)
这里的原理其实是伪造为xbm文件,xbm文件是一种图片格式的文件。
在php的官方文档中,exif_imagetype( )是可以支持xbm类型的文件的。
绕过拼接字符
比如近期的一道题目,其中部分代码如下:
file_put_contents($filename, $content . "\nHello, world");
这一题的思路是利用.htaccess文件把恶意代码包含进index.php里面,但是在变量$content后面拼接了一个"\nHello, world",这样的话会不符合.htaccess文件的语法,导致服务器报一个500错误,这时候我们可以使用反斜杠先把\n转义,再在加入的恶意代码前面加上一个#注释掉后面的内容,这样的话就可以绕过"\nHello, world",从而使得.htaccess符合语法。
最终payload结果如下:
php_value auto_prepend_fil\
e .htaccess
#<?php system('cat /fla'.'g');?>\&filename=.htaccess
这里要注意的是在传参的时候都是要url编码的。
.htaccess的常见用法
首先了解一下php_value和php_flag:
php_value:设定指定的值,但不能设定布尔值;
php_flag:用来设定布尔值的配置指令。
这两个可以用来设置指令的值,使得在Apache配置文件内部修改PHP的配置,那么这些指令有哪些呢,比如说auto_prepend_file,display_errors等等,具体的话参考官方给出的:php.ini 配置选项列表
当然上面说的这两个都是可以用于.htaccess中的,同样功能的还有php_admin_value和php_admin_flag,但是这两个无法用于.htaccess中。
下面介绍两个最常见的用法:
特殊编码绕过
如果对文件内容进行过滤了,同时版本php7已经抛弃了