CTF中.htaccess文件的利用
.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过.htaccess文件可以在所在文件夹和子文件下改变php.ini的配置。
在CTF的题目中,如果能够上传或者写入一个.htaccess,我们就可以做到比如说绕过WAF,以及文件包含等操作,因为之前打羊城杯看到.htaccess的文件的利用,就想把我自己之前遇到过的各种用法总结一下。
.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已经抛弃了