当前位置:   article > 正文

upload-labs 通关_upload-labs黑白名单绕过

upload-labs黑白名单绕过

PASS-01(JS绕过) 

1.如果单纯用1.php来用burp抓包是抓不到包的(因为文件并未上传到服务器就被拦截下来了)

2.所以需要先把1.php的后缀改为1.jpg 先绕过前端js验证,来抓到包

3.然后将jpg修改为php即可绕过

绕过成功

PASS-02

1.查看提示可以看到是对数据的MIME进行检查(MIME是验证文件的类型),即思路为用burp抓包后修改文件的类型

2.这里我上传的是11.php

3.修改content-type里面的内容 (content-type表示的就是文件类型) 查看源码可以看出 允许上传jpeg/png/gif格式的类型

4.即把content-type里面的内容改为上述的这三种格式其中一个即可。

5.如图,然后点击forward即可(forward点完后注意要把抓包关了要不然显示不出来),随后右键打开此图片即可。

PASS-03

1.先上传文件后查看提示

2.查看源码,后发现发现是黑名单验证,禁止上传这四种后缀的文件

3.黑名单规则不严谨,在某些特定环境中某些特殊后缀仍然可以被当作php文件去执行。

例如:php1,php2.........

4.这里使用php2。

发现上传成功.

PASS-04

(我试了几次后发现并没有显示phpinfo的内容)!!!!!!!!!

1.查看关卡源码发现发现黑名单比第三关多了很多,这些后缀都无法上传

 2.这时候就需要用到.htaccess

补充htaccess:htaccess文件时Apache服务的器的一个配置文件。这个文件可以不用获得root权限,就可以更改这个目录下的所有文件配置。那么说明只要创建一个.htaccess文件,并且写入php的配置,上传到这个服务器上,那么这个.htaccess所在的目录下的所有文件的配置就会修改转换成php的解析格式。(htaccess只对apache服务器有效)

操作步骤

1.首先创建一个.htaccess的文件再文件中写入(SetHandler application/x-httpd-php)保存下来

2.把这个文件上传到服务器上。

3.将一句话木马文件名修改成gif/png/jpe其中格式的一种。比如2.png。

4.将一句话木马文件上传到服务器。

总结

1.这里的关键点就是htaccess文件,把所有的目录下的文件的解析方式都修改成了php。

2.所以我们第二次上传的图片为2.png “png”不在黑名单中,但是htaccess文件又把他解析成了php的格式,所以可以正常的解析

PASS-05

1.查看源码(发现仍然是黑名单验证,甚至连.htaccess文件也进行了验证),即这关可以看出很难绕过,对过滤也十分完整

绕过思路

1.发现并未对ini进行过滤,所以可以使用ini文件来绕过

2.先写.user.ini文件

3.解释含义:让我上传的文件在这个目录下的文件预先加载这个5.jpg文件,让别的php文件来包含里面的phpinfo语句。

4.先上传user.ini文件

5.再上传5.jpg文件

PASS-06

1.查看源码后发现少了大小写转换的代码

2.所以我们直接在将文件名改为Php即可

PASS-07

1.观察第七关源码发现 缺少首尾去空的代码

2.所以抓包后在文件后加个空格即可

PASS-08

1.查看源码发现少了删除文件末尾的点

2.用burp抓包后在php后加.即可

PASS-09

1.查看源码发现少了删除字符串的代码

2.用burp抓包后添加 ::$DATA 即可

PASS-10

1.分析源码

$file_name = deldot($file_name);//删除文件名末尾的点

这个deldot函数是删除文件名末尾的点(从后往前删)

eg:1.php. .(即先把文件最后的点删掉,遇到空格即停止,不会一直删下去) 

$file_ext = strrchr($file_name, '.');

获取文件的后缀即(. (.+空格)) 

$file_ext = trim($file_ext); //首尾去空

删除文件后的空格,即最后文件名为1.php.

2.绕过方法

上传5.php文件,抓包 

修改后缀(+. +) 

绕过成功

PASS-11

1.查看第源码发现,是一个黑名单验证(意思是如果上传了它这些后缀的文件,就会把后缀名删除,没了后缀名也就无法正常解析,同样也是只验证一次即把后缀名改为.pphphp,删除中间的php后缀仍然为php),后即可通过。

PASS-12(上传出错)

1.分析源码

白名单过滤

$ext_arr = array('jpg','png','gif');

 获取文件名(即你上传的如果是1.php 那么这里面存的就是1.php)

$_FILES['upload_file']['name']

搜寻这个文件名第一次出现.的位数(即1.php 出现.个数为1),然后在+1后变成2,即获取php 

strrpos($_FILES['upload_file']['name'],".")+1)

 这个substr这个函数即获取的是文件的子集,由上面两个可得,获取的是php

substr

2.绕过方法

先上传jpg文件(里面包含phpinfo语句),用burp抓包

upload/+5.php%00即可绕过

PASS-13(上传失败)

1.查看源代码后 用burp抓包后接受值变成了POST

2.但是post不会自行解码 所以要对%00进行urlcode编码

PASS-14

1.查看源码后 代码的含义

以二进制的形式打开文件

$file = fopen($filename, "rb");

只读两个字节

$bin = fread($file, 2); //只读2字节

如果转化为十进制为255216 即判断为jpg(后面同理)

  1. case 255216:
  2. $fileType = 'jpg';

2.查看提示说检查图片内容开头两个字节,所以想到用图片+php来组成一个图片马

3.新建一个5.png文件 并用记事本打开

4.在开头加两个占位符 空格字母均可

5.改好后用vscode打开(并记得拓展下载hexeditor  这样可以展现文本的二进制格式)

6.并将前两个字节改为 89 50

7.然后上传5.png 即上传成功

8.但是打开后是这样的,并未得到预期的结果(原因是因为他以png格式解析的),这时候就需要利用文件包含漏洞

9.文件包含漏洞(能够将我的png文件 以 php的形式进行解析)

10.所以打开文件包含漏洞页面后  输入这个

11.然后复制你打开的那个页面的这个

12.打开成功

13.gif jpg 的操作方法也是如此

PASS-15

1.注意第15关为了防止绕过(防止通过改前两个字节 来使他读前两个字节认为是jpg/png...) 用了

getimagesize

getimagesize()函数返回一个包含图像信息的数组。该数组的索引如下:

索引0:图像的宽度

索引1:图像的高度

索引2:图像类型的常量值(可以使用image_type_to_mime_type())函数将其转化为 MIME类型

索引3:包含图像属性的字符串,以逗号隔开(如:width=500,height=300)

如果getimagesize()函数无法读取图像信息,则返回false 否则,返回一个包含上述索引的数组。

2.图片马生成步骤

1.将gif文件 与 php文件放在一个目录中(我这里是5.jpg和5.php)

2.然后右击打开powershell

 

3.注意不能用powershell 生成图片马(powershell的bug 会显示路径错误)

4.所以打开后,输入指令 start cmd 既可以在指定目录打开cmd指令

5.然后在cmd 页面输入 copy 5.jpg/b + 5.php/a 66.jpg(这里要生成的可以随便输)

3.然后将生成的图片马 上传上去即可

4.上传上去  重复14关的操作 用 漏洞打开phpinfo 即可

效果如下

PASS-16(如何切换低版本的php+nginx 然后把php_exif打开)

1.这个函数与第15关的函数差不多,此关的函数 同样也是检查图片的类型,也可以使用图片马绕过,绕过方法与第15关一样。

exif_imagetype

PASS-17

1.注意此行代码,如果第一次验证过了,它会将你的文件进行二次渲染(更改里面的部分内容)

$im = imagecreatefromjpeg($target_path);

2.第一次先把一个图片马上传上去,然后在upload文件里面用vscode打开

未上传时,图片马为,可以看到 是有phpinfo语句的

上传后在upload上查看上传后的图片马,发现phpinfo语句没了

3.用010editor  对两者进行比较后 发现只有一部分进行了渲染,有相同的部分

观察可以发现 蓝色部分相同,所以接下来的思路就是将phpinfo语句 复制粘贴到蓝色部分中即可(尽量往后插),记得保存

4.随后按照15关的操作打开目标文件即可

PASS-18(条件竞争原理与绕过)

1.分析源码

  1. $ext_arr = array('jpg','png','gif');
  2. $file_name = $_FILES['upload_file']['name'];
  3. $temp_file = $_FILES['upload_file']['tmp_name'];
  4. $file_ext = substr($file_name,strrpos($file_name,".")+1);
  5. $upload_file = UPLOAD_PATH . '/' . $file_name;
if(move_uploaded_file($temp_file, $upload_file))

1.文件的白名单

2.文件的上传名字

3.文件上传的临时目录

4.文件上传的后缀

5.文件存放路径

6.文件移动的函数:从临时目录到指定目录(即文件先到服务器上 进行一下的代码检测)

2.绕过思路

分析可知,文件移动到服务器需要时间,才能进行以下的代码进行判断,所以可以不断的上传文件,来使服务器停留一段时间不进行文件上传到服务器上的以下判断操作(卡程序的时间差)

但是不能直接写phpinfo语句,需要一串代码能够使服务器停留的那一段时间,来足够我们打开所长传的php文件(否则无法上传成功)

小马语句:

<?php

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

?>

解释:用php fputs函数来打开文件资源“shell.php”,如果shell.php不存在的话,就会新建一个shell.php文件,并且会以写入的方式来把<?php phpinfo()?> 这句话写入shell.php文件中

从而实现我们能够访问到这个php文件一次即可。

3.绕过 过程

将55.php(里面含有小马语句)上传 并用burp抓包

右键发送到攻击模块,把占位符删掉(只需要不停的发请求就行),clear即可

在payloads模块可以改为null payloads 并点击continue indifinitely(可以不停的进行攻击)

攻击后,打开upload文件,发现会有55.php文件出现在upload中(短暂)

所以在这里,尝试一直刷新后可以发现55.php上传成功

PASS-19(待考虑)

1.审计代码,发现其先审计文件类型(后缀),再上传到服务器。(第18关是先将文件上传到服务器,再判断文件类型)

2.利用Apache解析漏洞+条件竞争绕过

apache漏洞解释:如果现在有一个文件(名字为1.php.7z),浏览器会从后往前审计,从.7z开始,如果审计不了就审计php

所以需要赶在系统对php文件进行重命名之前就要访问一句话木马(apache对.7z无法解读,往前看认为是php)

在burp抓包后,不断上传文件的同时也要不停的访问55.php.7z

PASS-20

1.分析源码,用pathinfo来获取文件的后缀(获取文件最后一个点后边的文件名的后缀)

eg:如果输入1.jpg.jkp的话 获取的是jkp

$file_ext = pathinfo($file_name,PATHINFO_EXTENSION);

2.绕过思路

文件后缀没有过滤,且源码是先分析是否合法,然后才移到服务器

  1. if(!in_array($file_ext,$deny_ext)) {
  2. $temp_file = $_FILES['upload_file']['tmp_name'];
  3. $img_path = UPLOAD_PATH . '/' .$file_name;
  4. if (move_uploaded_file($temp_file, $img_path)) {
  5. $is_upload = true;

绕过:选择文件5.php上传后, 有一个保存名称:由于分析最后一个.后的后缀,所以我们可以在后面+.+空格即可以绕过

绕过成功

PASS-21

1.分析源码:

检查MIME(即检查contentype(可以通过抓包找到))

  1. //检查MIME
  2. $allow_type = array('image/jpeg','image/png','image/gif');
  3. if(!in_array($_FILES['upload_file']['type'],$allow_type)){
  4. $msg = "禁止上传该类型文件!";

如果save_name(为空) ,就把其内容为你上传的文件名,如果不为空就为里面写的值,这里的save_name指的是 那个保存名称

$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];

如果file不是数组的话,就将文件名以.的形式将他分割成数组的形式(这样就可以避免文件后缀名加.进行绕过) ,eg:1.php 就割为了 1  php  $file[0]=1  $file[1]=php 

  1. if (!is_array($file)) {
  2. $file = explode('.', strtolower($file));
  3. }

获取数组的最后一位值 

$ext = end($file);

判断数组的最后一位值是否在白名单中 

  1. $allow_suffix = array('jpg','png','gif');
  2. if (!in_array($ext, $allow_suffix)) {
  3. $msg = "禁止上传该后缀文件!";

获取数组的第一位 

$file_name = reset($file)

count($file)获取数组中有多少元素,-1后即记录的是数组的最后一个元素 

$file[count($file) - 1];

合起来就是将第一个元素与最后一个元素进行拼接,形成一个文件名 

$file_name = reset($file) . '.' . $file[count($file) - 1];

随后即把文件上传到最终目录中。 

2.绕过思路

上传文件5.php,后在保存名称中填5.php(为了后续能够绕过),然后用burp抓包(修改content type,为了绕过mime检查)

  将save_name改成数组+[0]即可

记住要在1.php后+/或者.也行要不然会一直显示上传失败 

补充这个count函数 所记录的是数组中实际的数量,随后绕过成功 

                

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/782333
推荐阅读
相关标签
  

闽ICP备14008679号