第一关:
可以看到这里的上传的验证是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
来绕过