【upload-labs】pass-04 .htaccess绕过
1、测试流程
玩法一
先尝试上传一个php文件:
如图所示,提示此文件不允许上传。
抓包改后缀试试:
Apache解析漏洞:Apache会将不认识的后缀,如suibianxie.php.xxx.ccc、test.php.iii等从右向左解析,不认识就往左移一个,最终移到php时apache认识了就会将该文件当作php文件来解析。
如图所示上传成功,而且文件名没有改。
用浏览器去访问该文件:
发现被成功解析了。
这有点太轻松了,想换一种绕过方式,于是注释掉配置文件中的那两行:
重启apache后用浏览器重新访问该文件:
发现apache已经无法解析了,OK。
玩法二
换一种思路:
先科普一下什么是.htaccess文件?
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
.htaccess文件(或者”分布式配置文件”)提供了针对每个目录改变配置的方法,即在一个特定的目录中放置一个包含指令的文件,其中的指令作用于此目录及其所有子目录。
但是很重要的、需要注意的是,其上级目录也可能会有.htaccess文件,而指令是按查找顺序依次生效的,所以一个特定目录下的.htaccess文件中的指令可能会覆盖其上级目录中的.htaccess文件中的指令,即子目录中的指令会覆盖父目录或者主配置文件中的指令。详解
先新建一个.htaccess文件,内容如下:
<FilesMatch "qianxun.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
这个文件内容的意思是告诉apache当遇到qianxun.jpg文件时,按照php去解析。
我们再创建一个php测试文件qianxun.php:
并将文件后缀改为jpg。
分别将.htaccess文件和qianxun.jpg文件上传:
上传qianxun.jpg | 上传.htaccess文件 |
---|---|
如图所示,已经上传成功。
用浏览器访问qianxun.jpg:
如图所示,qianxun.jpg被成功解析!
注意:.htaccess文件是apache默认的文件名,所以如果后台有对上传文件强制改名的机制,那么这种方法也就失效了。
2、源码分析
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists($UPLOAD_ADDR)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".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"); //黑名单机制,过滤了好多后缀
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //收尾去空
if (!in_array($file_ext, $deny_ext)) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
$img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '此文件不允许上传!';
}
} else {
$msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
}
}
漏洞利用总结:
1、可以利用apache的解析特性,即对不认识的后缀后左移跳过尝试解析后面的后缀,此时我们可以构造qianxun.php,nnn来绕过后端检查,并使apache成功解析。
2、在后端没有对上传文件强制改名的情况下,上传一个合法后缀的木马文件,和一个精心配置的.htaccess文件,既绕过检查又使apache成功解析。