准备阶段
upload-labs下载地址:https://github.com/c0ny1/upload-labs
推荐使用php-5.2.17版本,使用其他版本可能会导致页面报错。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190803114735115.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70)
提示: upload-labs目录下需要手动建一个名为upload的文件夹,用于存放以后上传的文件。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190803115527455.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70)
Pass-01
JS验证绕过
直接上传php文件,提示只能上传jpg,png,gif
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190803120020853.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70)
可以直接右击网页查看到源码
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201007192946275.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
绕过方法:
方法一:把源码复制下来,然后建一个.html文件,把代码粘贴进去,把最下面 js 验证的相关代码删掉,给 form 表单添加一个属性 action ,值为我们要上传到的网址,这样我们就可以用自己写的代码向目标网页上传文件了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190803120921269.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70)
然后打开这个HTML文件(由于缺少css代码,所以界面可能不太美观,不过不影响功能)直接上传.php文件就可以了。
方法二:复制 js代码到控制台,然后修改上传文件的类型,然后执行,再上传 .php 文件就可以了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190803122726201.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70)
不过这种方法是一次性的,下次上传前需要再次执行
方法三:以.jpg后缀上传,然后再抓包,修改后缀
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201007193847392.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
Pass-02
content-type验证绕过
提示说只检查MIME
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201004194146253.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
修改文件的MIME即可绕过
先把以.jpg后缀上传,然后抓包,修改后缀为.php,放包
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201007194715683.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
最后访问
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201007194812101.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
Pass-03
黑名单绕过
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201004200505527.jpg#pic_center)
提示不能上传.asp,.aspx,.php,.jsp后缀文件,但我们可以上传php5(2,3,4),phtml,phps,pht都行
由于我搭建upload-labs时用的是phpstudy,所以无法解析以上后缀
其他扩展名的部分绕过方法:
Php: php5(2,3,4) phtml phps等
Asp: asa cer cdx
Aspx: ashx asmx ascx
Jsp: jspx jspf
Pass-04
.htaccess绕过
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201004202133538.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
黑名单几乎过滤了所有能上传的后缀,但却没有过滤.htaccess文件
先上传一个.htaccess文件,内容如下:
SetHandler application/x-httpd-php
然后再上传我们的图片马,这时所有的图片都会服务器被当成php文件来解析
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201004203548501.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
Pass-05
大小写绕过
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201007200936924.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
这次的黑名单不仅过滤了几乎所有能上传的文件,还过滤了.htaccess,但是这次没有对后缀统一大小,我们可以把后缀改为.PHP,.pHP等进行绕过
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201007201429627.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
Pass-06
空格绕过
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201007201832898.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
还是之前的黑名单,而且这次还统一了大小写,但是没有对后缀名进行去空处理,因此可以利用windows的命名规则,在后缀名加空格进行绕过
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201004205945572.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
Pass-07
点绕过
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201007202328145.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
跟前几关一样,但是这次没有对后缀名的”.”进行处理,我们可以利用windows特性,让其自动去掉后缀名中最后的”.”,然后绕过:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201007203308998.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
最后访问eval.php
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201007203408882.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
Pass-08
::$DATA
绕过
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201007203930804.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
一样的黑名单,但这次没有过滤::$DATA
::$DATA
的有关知识:在windows+php的环境下,如果文件为:文件名+"::$DATA
",::$DATA
之后的数据会被当成文件流处理,不仅不会检测文件的后缀名,还会保持"::$DATA
"之前的文件名不变。
因此在文件名后加"::$DATA
"就可进行绕过
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201007210003380.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
Pass-09
点+空格+点绕过
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020101117344525.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
经过审计发现,代码先是删除了文件名末尾的点,又去除了文件名前后的空格。所以我们可以通过构造文件名+点+空格+点(eval.php. .
)的形式来进行绕过,经过程序过滤后变成eval.php.
,又利用windows的特性自动去除后缀中最后的点即可绕过。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011174337156.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
Pass-10
双写后缀名绕过
先上传一个正常的php文件,发现后缀名被替换为空
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011175333725.jpg#pic_center)
查看源码
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020101117490595.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
可以看出str_ireplace()方法把文件后缀替换成了空,直接双写后缀名(eval.pphphp)即可绕过
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020101117573322.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
Pass-11
%00截断上传(get型)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020101118014220.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
这次是白名单,而且是用$img_path
函数进行拼接的,所以可以使用%00进行截断上传
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011182027263.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
然后访问eval.php
![在这里插入图片描述](https://img-blog.csdnimg.cn/202010111821474.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
提示
使用%00截断的条件
(1)php版本要小于5.3.4
(2)要将php-ini配置文件中的magic_quotes_gpc的值设置为Off
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011182538786.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
Pass-12
%00截断上传(post型)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011184342206.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
这关也是%00截断上传,但与11不同的是这里传送save_path时用的是post方法,由于post不会像get对%00进行自动解码,所以需要我们对其进行手动解码。
(1)第一种方法是对%00进行urldecode的操作,选中%00然后右击,然后依次选择/convert selection/URL/URL-decode
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011185338521.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
解码后貌似什么都没有,但截断的效果还是有的,直接发包即可绕过
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011185504814.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
(2)第二种方法是在eval.php后面打一个空格,别的字符也行,主要是为了占位,然后再在hex里找到eval.php后面的的那个字符的16进制码(20)然后改成%00对应的16进制码00
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011192655256.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
最后访问eval.php
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011193412226.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
Pass-13
图片马(1)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011194558877.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
代码会根据文件的前两个字节来判断文件的类型,先制作图片马,新建文件eval.gif,内容如下:
GIF89a //gif文件标识头
<?php phpinfo();?>
然后抓包上传修改后缀
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020101119572227.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
虽然上传成功,但文件名已被更改,不过好在内容没有被感染
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011195848206.jpg#pic_center)
接下来要想利用的话就需要结合文件包含漏洞了,为了展示效果,我在/upload/目录下简单建一个有包含漏洞的文件include.php,内容如下:
<?php
$filein = $_GET['file'];
include($filein);
?>
访问/upload/include.php?file=文件名
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011202011435.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
Pass-14
图片马(2)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011202611751.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
这里用getimagesize函数来获取文件类型,不过还可以用刚才的方法进行绕过
getimagesize函数:
getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE并产生一条 E_WARNING 级的错误信息。
其实构造完图片马后不用抓包直接上传也行,内容也不会被感染
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011203703381.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
访问
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011203917805.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
Pass-15
图片马(3)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011204211443.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
这里用了exif_imagetype()来判断上传的文件是否为图片,不过还可以用上面的eval.gif进行绕过
Pass-16
图片马(4)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011205412618.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
这次虽然检测了后缀名,content-type,并且还用imagecreatefromgif判断文件是否为图片,但是还可以用前几关的方法直接上传eval.gif进行绕过
eval.gif内容如下:
GIF89a
<?php phpinfo();?>
直接上传即可
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011210307166.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
访问
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011210510949.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
Pass-17
条件竞争(1)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011212125365.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
文件上传到服务器后先被rename重命名,再被unlink删除,因此需要通过条件竞争的方式在文件被unlink删除之前,访问到我们的马。
我们先把eval.php的内容改为:
<?php fputs(fopen('shell.php','w'),'<?php phpinfo();?>'); ?>
然后用burp不断的向其发包,只要eval.php被访问到,就会在目录下写入木马shell.php
具体做法:
先抓包
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011220339540.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
然后Send to lntruder,并且进行以下的设置:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011220950212.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011221003479.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011221009262.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
最后start attack,然后不停地刷新http://127.0.0.1/upload-labs/upload/eval.php
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011221551601.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
只要eval.php被访问到,目录下就会有shell.php
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020101122154460.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
Pass-18
条件竞争(2)
//index.php
$is_upload = false;
$msg = null;
if (isset($_POST['submit']))
{
require_once("./myupload.php");
$imgFileName =time();
$u = new MyUpload($_FILES['upload_file']['name'], $_FILES['upload_file']['tmp_name'], $_FILES['upload_file']['size'],$imgFileName);
$status_code = $u->upload($UPLOAD_ADDR);
switch ($status_code) {
case 1:
$is_upload = true;
$img_path = $u->cls_upload_dir . $u->cls_file_rename_to;
break;
case 2:
$msg = '文件已经被上传,但没有重命名。';
break;
case -1:
$msg = '这个文件不能上传到服务器的临时文件存储目录。';
break;
case -2:
$msg = '上传失败,上传目录不可写。';
break;
case -3:
$msg = '上传失败,无法上传该类型文件。';
break;
case -4:
$msg = '上传失败,上传的文件过大。';
break;
case -5:
$msg = '上传失败,服务器已经存在相同名称文件。';
break;
case -6:
$msg = '文件无法上传,文件不能复制到目标目录。';
break;
default:
$msg = '未知错误!';
break;
}
}
//myupload.php
class MyUpload{
......
......
......
var $cls_arr_ext_accepted = array(
".doc", ".xls", ".txt", ".pdf", ".gif", ".jpg", ".zip", ".rar", ".7z",".ppt",
".html", ".xml", ".tiff", ".jpeg", ".png" );
......
......
......
function upload( $dir ){
$ret = $this->isUploadedFile();
if( $ret != 1 ){
return $this->resultUpload( $ret );
}
$ret = $this->setDir( $dir );
if( $ret != 1 ){
return $this->resultUpload( $ret );
}
$ret = $this->checkExtension();
if( $ret != 1 ){
return $this->resultUpload( $ret );
}
$ret = $this->checkSize();
if( $ret != 1 ){
return $this->resultUpload( $ret );
}
// if flag to check if the file exists is set to 1
if( $this->cls_file_exists == 1 ){
$ret = $this->checkFileExists();
if( $ret != 1 ){
return $this->resultUpload( $ret );
}
}
// if we are here, we are ready to move the file to destination
$ret = $this->move();
if( $ret != 1 ){
return $this->resultUpload( $ret );
}
// check if we need to rename the file
if( $this->cls_rename_file == 1 ){
$ret = $this->renameFile();
if( $ret != 1 ){
return $this->resultUpload( $ret );
}
}
return $this->resultUpload( "SUCCESS" );
}
......
......
......
};
文件在上传时会先检查后缀名,然后重新命名,这里也有条件竞争,也可以用刚才的方法用burp不断的向服务器进行发包,这样会由于条件竞争,会使程序来不及重命名而上传成功。
Pass-19
%00截断上传
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011224649836.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
上传文件时可自定义文件名,move_uploaded_file()函数中有个img_path,并且还是由post参数的save_name控制的,因此可以进行上传截断
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011224957686.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
这里由于是post传参,%00需要手动解码,解码可以用前面的/convert selection/URL/URL-decode,或者修改hex里的编码
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011225444335.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)
最后访问
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201011225316521.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMwMDI4Ng==,size_16,color_FFFFFF,t_70#pic_center)