upload-labs文件上传漏洞(Pass-01~Pass-21)

目录

pass-1(js前端绕过)

pass-2(MiMe绕过)

pass-3(黑名单绕过)

pass-04(.htaccess文件上传)

pass-05

pass-06(大小写绕过)

pass-07(空格绕过)

pass-08(windows特性加点绕过)

pass-09(::$DATA绕过)

pass-10(点空点绕过)

pass-11(双写绕过)

pass-12(GET请求00截断)

pass-13(POST请求00截断)

pass-14(头文件绕过、图片码绕过、文件包含)

pass-15(头文件绕过、图片码绕过、文件包含)

pass-16(头文件绕过、图片码绕过、文件包含)

pass-17(二次渲染)

pass-18(条件竞争)

pass-19(中间件解析漏洞&条件竞争)

pass-20(%00截断)

pass-21(MIME、数组、/绕过)


pass-1(js前端绕过)

源码:

由于是直接对上传的文件进行判断,只允许.jpg|.png|.gif,上传文件后,substring()函数会提取文件后缀名,由indexOf()处理返回指定的字符串值在字符串中首次出现的位置,然后进行比较,不符合或没有找到则返还 -1

从源码判断出只是在提交时,对后缀名进行检测然后上传至后台

1.上传一句话

<?php phpinfo();?>  

2.burpsuite抓包,修改后缀,将. jpg 改为.php

访问1.php

pass-2(MiMe绕过)

源码:

1.上传一句话

2.bp抓包,修改content-type

MiMe是什么?一串简单的字符串组成的初期标识了邮件e-mail的附件的类型,后来在html文件中可以使用属性表示,当文件上传后,content-type会标记文件类型,简单来说当我们上传一个1.php文件的时候,content-type会自动将我们这个文件类型标识为application/octet-stream,不匹配时上传失败,这里仅允许content-type为image/jpeg,image/png,image/gif属性的通过

将content-type标识的application/octet-stream修改为image/jpeg

上传后访问

MiMe常见的绕过格式

pass-3(黑名单绕过)

源码:

过滤大写绕过,过滤php、asp等为后缀的文件,只是对文件名进行了限制,但是上传文件后,会更改文件名为当前时间

1.上传一句话

2.bp抓包,更改文件后缀

注意:在phpstudy下apache服务下,默认配置文件无法解析以.pthml,.php5等等为后缀的文件,不更改的话服务器无法解析

修改步骤

进入phpstudy的根目录→找到apache文件夹→打开conf→更改httpd.conf配置文件

更改AllowOverride为All

修改默认值#AddType application/x-httpd-php

AddType application/x-httpd-php .php .phtml .php5 .pht

访问

pass-04(.htaccess文件上传)

源码:

过滤大小写绕过,phtml,php5等等

1.先上传.htaccess文件

2.再上传1.jpg

.htaccess文件全称Hypertext Access(超文本入口),提供了针对目录改变配置的方法,通过修改此配置文件,可以帮我们实现自定义错误页面、更改扩展名、使用其他文件作为index文件等等

先上传一个.htaccess文件

SetHandler application/x-httpd-php //所有上传的文件都会当成php来解析  

再上传一个1.jpg,被当成php解析

访问

pass-05

(注:更新后的upload-labs又在第四关后插入第五关,原第五关改为第六关,第六关改为第七关,第七关改为第八关,以此类推)

源码:

方法一:

过滤phtml,php5等等,禁止上传.htaccess文件

1.过滤不严谨,没有过滤Php1,上传1.Php1

方法二:

点绕过

上传文件:1.php. .

访问

pass-06(大小写绕过)

过滤phtml,php5等等,禁止上传.htaccess文件

1.过滤不严谨,没有对大小写严格过滤,上传1.Php

访问

pass-07(空格绕过)

源码:

没有对后缀去空处理,没有对大小写进行转换,因此可以在后缀名加空格绕过

1.上传一句话1.Php

2.bp抓包,在filename的文件名1.Php后增加一个空格

访问

pass-08(windows特性加点绕过)

源码:

没有对后缀名"."进行处理,利用windows特性,会自动去掉后缀名中最后的".",可在后缀名中加"."绕过

1.上传1.php

2.bp抓包,将后缀修改为1.php.

访问

pass-09(::$DATA绕过)

源码:

在window的时候如果文件名+'::$DATA'会把::$DATA之后的数据当成文件流处理,不会检测后缀名。且保留::$DATA之前的文件名。利用windows特性,可在后缀名中加::$DATA绕过

访问

pass-10(点空点绕过)

源码:

代码先去除文件名最后的'.',去除文件名前后的空格,第15行和之前不太一样,路径拼接的是处理后的文件名,导致可以利用1.php. .(点+空格+点)绕过

访问

pass-11(双写绕过)

源码:

str_ireplace函数:替换字符串中的一些字符(不区分大小写)。

语法:str_ireplace(find,replace,string)

find:规定查找的值。

replace:规定替换 find 中的值的值

string:规定被搜索的字符串

如:

        <?php echo str_ireplace("WORLD","Shanghai","Hello world!"); ?>

输出:

                Hello Shanghai!

1.双写绕过,上传一个1.pphphp

2.bp抓包

访问

pass-12(GET请求00截断)

源码:

入手点在substr函数,返回白名单后进行拼接,如果将后缀名改为.php再利用%00截断后面的内容,即可执行一句话

$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

当以GET方式提交请求的时候,数据会在url内暴露出来,以?分割,多个参数之间用&连接

1.上传文件

2.bp抓包,添加%00

访问

注意:

截断条件:php版本小于5.3.4,magic_quotes_gpc为NO

更改php版本

勾选magic_quotes_gpc

pass-13(POST请求00截断)

源码:

$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext; 

以POST方式提交请求的时,数据不会在url内暴露出来,会放置在http包的包体中,以二进制流的方式传输,所以需要在二进制中进行修改增加%00

注:有些人的bp是新版,界面上可能并没有找到可以直接修改二进制的Hex

首先做个标记

然后从右拉栏里找到

将2b修改为00即可

上传文件

访问

pass-14(头文件绕过、图片码绕过、文件包含)

源码:

ction getReailFileType($filename){ $file = fopen($filename, "rb"); $bin = fread($file, 2); fclose($file); $strInfo = @unpack("C2chars", $bin);

检测是否为真实图片格式,fread读取前两个字符的数量然后做检查

1.制作图片码,上传文件

2.bp抓包获取文件路径

3.利用文件包含漏洞执行

构造图片码

copy 1.jpg /b + 1.php /a ganyu.jpg

上传图片

利用文件包含访问

pass-15(头文件绕过、图片码绕过、文件包含)

源码:

getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE

将测定 GIF,JPG,PNG等等 图像文件的大小并返回图像的尺寸以及文件类型

1.修改一句话,上传文件

2.bp抓包获取文件路径

3.利用文件包含漏洞访问

常见的文件头

截包,将1.php修改为1.jpg,修改content-type为image/jpeg,然后重放

如果直接访问图片,作为php进行解析,需要利用文件包含访问

payload:127.0.0.1/upload/include.php?file=upload/7220211007162015.gif

 

或者制作图片码代替头文件绕过

copy 1.jpg /b + 1.php /a ganyu.jpg

pass-16(头文件绕过、图片码绕过、文件包含)

源码:

php_exif模块来判断文件类型,方法与上面两题相同

注意:需要先启用php_exif模块

pass-17(二次渲染)

源码:

当上传一个文件的时候,首先$fileext会判断是否为jpg的同时,content-type是否为image/jpeg,然后使用move_uploaded_file进行处理,成功则执行二次渲染

1.利用windows下的画图工具,然后保存为一张gif格式的图片(其他格式有的显示上传失败)

2.上传后,保存上传的图片,与原图做比较,利用winhex写入一句话

3.利用bp抓包,获取上传文件路径

4.利用文件包含读取、解析

上传成功后,右击保存上传后的文件

利用winhex,对比原图和上传图片的区别,在相同的地方写入一句话并保存,然后再上传保存的文件  

访问

pass-18(条件竞争)

源码:

move_uploaded_file()函数将上传文件临时保存,再进行判断

不断上传文件,在文件还没被删除前去读取文件。

如果上传文件1.php内容为

<?php fputs(fopen('2.php','w'),'<?php phpinfo();?>');?>

在判断1.php的时候,服务器会解析写入一个内容为

<?php phpinfo();?>

的2.php文件。这时使用BurpSuite的Intruder不断上传1.php,浏览器不断访问1.php,即可造成条件解析漏洞

1.新建一个1.php文件,写入<?php fputs(fopen('ganyu.php','w'),'<?php phpinfo();?>');?>

2.上传文件,使用bp抓包爆破

3.f5刷新2.php

上传,设置爆破选项

Start attack

不断刷新浏览器页面后,访问生成的ganyu.php

pass-19(中间件解析漏洞&条件竞争)

源码:

利用Apache的解析漏洞,不管最后后缀是什么,构造以.php.xxx结尾,就会被Apache服务器解析成php文件,配合条件竞争访问2.php

注意:这里的路径缺失'/',上传的shell路径为../uploadxxx.php或自行修改源码

访问

pass-20(%00截断)

源码:

题目多出了一个写入保存名称,注意,与GET提交不同的是,POST方式请求的时,数据不会在url内暴露出来,会放置在http包的包体中,以二进制流的方式进行传输,所以需要在二进制中进行修改增加%00

上传2.php,在上传之前,写入保存名称为upload-19.php

给upload-19.php后写入+jpg(加号只是用作标记)

将+改为00,选择+号

然后从右拉栏里找到

将2b修改为00即可

上传

访问

pass-21(MIME、数组、/绕过)

源码:

检测content-type是否存在白名单

判断save_name是否为空定义$file变量

若file不为数组,则explode('.', strtolower($file))对file进行分割

将file变为一个数组,利用end函数将file数组的最后一个单位赋值给$ext

判断$ext是否匹配白名单

将file数组的第一个元素用点拼接最后一个元素,赋值给$file_name后上传

bp抓包

1.修改content-type

2.修改POST参数为数组类型,索引[0]为upload-21.php,索引[2]为jpg|png|gif,只要第二个索引不为1,$file[count($file) - 1]就等价于$file[2-1],值为空

访问

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值