此文章只用于学习和反思巩固文件上传漏洞知识,禁止用于做非法攻击。注意靶场是可以练习的平台,不能随意去尚未授权的网站做渗透测试!!!
上一关从源码分析可知,是一个黑名单的验证,将后缀名php、asp、jsp等等给禁用了。然后我们通过利用apache特性,如果服务器apache设置了可以使用php来解析php5、phtml、php3等后缀名的话,我们就可以上传这类的文件来绕过黑名单上传webshell。
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$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");
$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)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '此文件不允许上传!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
同上一关相比可知,这一关黑名单增加了新成员,也把php5这种类似的后缀名给禁用了。那么我们就无法利用这个apache特性进行绕过了。但是可以发现与上一关不同的是,它上传文件后没有随机更改文件名。 $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
而且此关的源码黑名单过滤只过滤了一次,像点、空格只过滤一次。我们可以考虑点空格绕过。
现在模拟上传1.php文件的黑名单验证流程,首先是删除文件末尾的点,发现没有,然后strrchr函数 。
定义:strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
如图所示
也就是从点开始查找返回到字符串结尾的所有字符。现在是验证到.php
了。然后就是防止大小写绕过,把.php所有转换为小写,然后是去除::$data,以免通过这个来绕过,最后是过滤空格再进行黑名单验证。发现.php在黑名单内,所以上传失败。
由此我们可以找到规律它的点和空格是只验证一次,那么我们多些一些会不会有不一样的验证呢?我们知道window特性,若后缀名后面是点或者空格它是会默认过滤掉变成成正常文件的。(如图所示)
创建一个1.txt文件,然后再创建1.txt.和1.txt+空格的文件看看会怎么样
发现他们会覆盖,而且如果把1.txt文件修改为1.txt.文件也是会变回1.txt文件。由此可知,若我们上传的文件是1.php.的话,是不是既能绕过黑名单上传文件,上传后又能被win系统过滤掉点,从而变成1.php文件。
这里我们写1.php.上传的话,最后的点还是会被过滤掉,和刚刚1.php没什么区别。那么试试1.php. .(点加空格加点),经过一系列过滤得到的是.php.文件,能够绕过黑名单。上传发现最后在服务器的文件是1.php了,因为被win系统过滤掉点了。(如图所示)
发现成功解析了
htaccess文件(或者分布式配置文件),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法,
即,在一个特定的文档目录中放置一个包含一个或多个指令的文件,
以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
知道原理了,由于黑名单没有过滤htaccess文件后缀名,我们可以上传一个htaccess文件,让文件所在位置的目录下文件被php解析。
1、要在apache下的httpd.conf文件更改。
启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。
打开httpd.conf文件用文本编辑器打开后,查找
复制代码代码如下:
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
改为:
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
2、好像要特定的php环境,由于我复现失败所不清楚。
正常来说访问jpg文件地址是会成功看到phpinfo页面的。这是htaccess文件内容,让其目录下所有文件都能被php解析执行。
<IfModule >
setHandler application/x-httpd-php #
</IfModule >
此关是通过点加空格或者是上传htaccess文件达到绕过,两种方法但是第二种方法有局限性,得对方服务器开了这个功能才行。此文章是小白自己为了巩固文件上传漏洞而写的,大佬路过请多指教!