第一关:

可以看到这里的上传的验证是javascript验证的,也就是前台认证,但是我们可以利用后台验证绕过。
步骤:
1、上传一个2.png
2、抓包将2.png修改为2.php

然后看看是否成功上传

upload目录是这个靶机上传的文件的存放目录,所以上传的东西都会在这里,所以看有没有成功上传的话可以直接来这里看,或者去访问一下http://xxx.xxx.xxx/upload/文件名,如我刚刚上传的2.php就是这个链接
http://127.0.0.1/upload/upload/2.php

第二关:

所谓文件类型就是上传文件的时候请求中的Content-Type,如下

这关的代码逻辑就是,如果上传的文件类型是image/jpeg或image/png或image/gif就可以上传。那么只要上传一个php文件,然后把文件类型修改为image/jpeg即可上传


成功上传~
第三关:
此关就是后台禁止
php、jsp、asp、aspx这四个文件上传
这关的代码比较长,我就直接贴出来了~
1 | $is_upload = false; |
2 | $msg = null; |
3 | if (isset($_POST['submit'])) { |
4 | if (file_exists(UPLOAD_PATH)) { |
5 | $deny_ext = array('.asp','.aspx','.php','.jsp'); |
6 | $file_name = trim($_FILES['upload_file']['name']); |
7 | $file_name = deldot($file_name);//删除文件名末尾的点 |
8 | $file_ext = strrchr($file_name, '.'); // 获取文件名的后缀(就是获取.后面的内容) |
9 | $file_ext = strtolower($file_ext); //转换为小写 |
10 | $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA |
11 | $file_ext = trim($file_ext); //收尾去空 |
12 | |
13 | if(!in_array($file_ext, $deny_ext)) { // 如果$file_ext的值不在$deny_ext列表里,即进入条件 |
14 | $temp_file = $_FILES['upload_file']['tmp_name']; |
15 | $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext; |
16 | if (move_uploaded_file($temp_file,$img_path)) { |
17 | $is_upload = true; |
18 | } else { |
19 | $msg = '上传出错!'; |
20 | } |
21 | } else { |
22 | $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!'; |
23 | } |
24 | } else { |
25 | $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; |
26 | } |
27 | } |
既然不能上传php,那么我们可以上传.php3(在某些环境下php3也是当php解析,介绍文章:https://www.cnblogs.com/natian-ws/p/7265806.html)

然后看看是否上传了

可以看到是上传了的,但是为什么名字会那么长呢?
可以看看代码中第15行
1 | $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext; |
这个$img_path就是上传后的文件的地址,UPDATE_PATH就是上传目录(upload),data("YmdHis")就是当前时间的年月日时分秒,rand(1000,9999)就是在0000到9999中随机抽数字,$file_ext就是上传的文件的后缀,所以拼接起来就是这么长的名字。
那么我们上传了这个文件后,看不到他的名字,我们就可以爆破当前时间的年月日时分秒,然后后面几个随机数字爆破,这里不演示了,直接打开看看php3是否和php效果一样~
第四关
这一关坏得很,因为他把全部后缀都加入黑名单了,代码如下
1 | $is_upload = false; |
2 | $msg = null; |
3 | if (isset($_POST['submit'])) { |
4 | if (file_exists(UPLOAD_PATH)) { |
5 | $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"); |
6 | $file_name = trim($_FILES['upload_file']['name']); |
7 | $file_name = deldot($file_name);//删除文件名末尾的点 |
8 | $file_ext = strrchr($file_name, '.'); |
9 | $file_ext = strtolower($file_ext); //转换为小写 |
10 | $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA |
11 | $file_ext = trim($file_ext); //收尾去空 |
12 | |
13 | if (!in_array($file_ext, $deny_ext)) { |
14 | $temp_file = $_FILES['upload_file']['tmp_name']; |
15 | $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext; |
16 | if (move_uploaded_file($temp_file, $img_path)) { |
17 | $is_upload = true; |
18 | } else { |
19 | $msg = '上传出错!'; |
20 | } |
21 | } else { |
22 | $msg = '此文件不允许上传!'; |
23 | } |
24 | } else { |
25 | $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; |
26 | } |
27 | } |
可以看到限制了很多后缀,但是我们可以上传.htaccess文件,然后在里面写
1 | SetHandler application/x-httpd-php |
这个意思是把这个目录的所以文件当php解析,但是这个也是有环境限制的,只能在apache用,因为.htaccess是apache的配置文件
第五关
这一关代码如下
1 | $is_upload = false; |
2 | $msg = null; |
3 | if (isset($_POST['submit'])) { |
4 | if (file_exists(UPLOAD_PATH)) { |
5 | $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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",".htaccess"); |
6 | $file_name = trim($_FILES['upload_file']['name']); |
7 | $file_name = deldot($file_name);//删除文件名末尾的点 |
8 | $file_ext = strrchr($file_name, '.'); |
9 | $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA |
10 | $file_ext = trim($file_ext); //首尾去空 |
11 | |
12 | if (!in_array($file_ext, $deny_ext)) { |
13 | $temp_file = $_FILES['upload_file']['tmp_name']; |
14 | $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext; |
15 | if (move_uploaded_file($temp_file, $img_path)) { |
16 | $is_upload = true; |
17 | } else { |
18 | $msg = '上传出错!'; |
19 | } |
20 | } else { |
21 | $msg = '此文件类型不允许上传!'; |
22 | } |
23 | } else { |
24 | $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; |
25 | } |
26 | } |
这一段大概意思就是上传的文件后缀名不允许出现在$deny_ext里,但是我们可以通过上传Php来绕过~ 他这里限制了php不能上传 但是并没有将其全转换成小写 所以可以用大写绕过

第六关

这一关也是黑名单策略,然后把.htaccess文件也限制了,但是我们可以用php空格绕过,如下

第七关

这一关还是黑名单策略,因为这里没有把.删除,所以可以上传.php.绕过(原理是window会把文件后缀后面的.删除,比如上传1.php....会变成1.php这是window的特性)

第八关

还是黑名单,但是我们还是可以利用window的特性绕过,上传一个.php::$DATA后缀类型,上传后会变成.php

第九关

还是黑名单策略,但是我们可以利用only_free.php. .来绕过,因为第7行会删除末尾的点就变成了only_free.php.空格,然后第11行会把后面的空格去掉,就变成了only_free.php.然后经过window的特性,会变成only_free.php,如图

第十关

先看到第8行,代码意思是:把$file_name中的$deny_ext替换为空,意思就是如果我上传的文件名是1.php而php在$deny_ext列表里,然后就会把php替换为空,变成1.,但是这里有个逻辑缺陷。如上传一个1.pphphp他会把php去掉,如图
,然后就变成了1.php成功绕过,如图

第十一关
暂空
第十二关
暂空
第十三关
这一关比较奇特,不用上传php文件,只要能成功上传图片即可,而上传图片的前提是这个图片必须为图片马,何为图片马呢? 就是一个能正常显示,但是图片本身是带有恶意的代码的,详细可看如下链接
http://gv7.me/articles/2017/picture-trojan-horse-making-method/
这里上传的话上传一个only_free.jpg,然后内容是
1 | GIF98a |
2 | |
3 | |
4 | phpinfo(); |
5 | |
6 | |
GIF98a是图片头,这样子表示这个是GIF图片,然后看上传结果

第十四关

看到这里的第四行是获取$filename的图片类型,依旧可以用GIF98a来绕过
