upload-labs通关wp

发布于 2021-12-20  1901 次阅读


upload-labs(每一关方法不止一种)

1-21关upload.md

下载后将.txt后缀删掉即可

第一关(前端验证)2003

about:config

法一:改前端

image-20211025094154692

删掉onsubmit=""中的内容即可正常上传木马,然后蚁剑连接即可

法二:抓包改后缀名

Upload-labs 1-21关 靶场通关攻略(全网最全最完整)_晚安這個未知的世界-CSDN博客

第二关(MIME-扩展名验证)2003

抓包content-type:image/png

第三关(黑名单验证)2003

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

apache配置文件上面这个语句#去掉

如果没有这句话建议用phpstudy2014版本

phtml过

第四关(黑名单验证,.htaccess)2003

编辑一个.htaccess文件内容为

<FilesMatch "2.jpg">

SetHandler application/x-httpd-php

</FilesMatch>

然后上传一个有GIF89a头的2.jpg的图片马即可

相关知识

  • .htaccess文件(或者”分布式配置文件”),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。 启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变。例如,需要使用.config ,则可以在服务器配置文件中按以下方法配置:AccessFileName .config 。 它里面有这样一段代码:AllowOverride None,如果我们把None改成All image-20211026115955250

第五关(黑名单验证,.user.ini)小皮

创建一个.user.ini文件并把它上传,内容为auto_prepend_file=2.jpg

上传并访问2.jpg(一句话木马)

等待300秒访问readme.php

相关知识

image-20211026193100440

  • 引发 .user.ini 解析漏洞需要三个前提条件:服务器脚本语言为PHP

    服务器使用CGI/FastCGI模式

    上传目录下要有可执行的php文件

  • user.ini : 自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的 INI 文件。此类文件仅被 CGI/FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果使用 Apache,则用 .htaccess 文件有同样效果。

    除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。

    在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。

    两个新的 INI 指令,user_ini.filename 和 user_ini.cache_ttl 控制着用户 INI 文件的使用。

    user_ini.filename 设定了 PHP 会在每个目录下搜寻的文件名;如果设定为空字符串则 PHP 不会搜寻。默认值是 .user.ini。

    user_ini.cache_ttl 控制着重新读取用户 INI 文件的间隔时间。默认是 300 秒(5 分钟)。 image-20211026193650455

    CGI从这里看

第六关(黑名单验证,大小写绕过)2003

.Php过

第七关(黑名单验证,空格绕过)

.php空格 过

相关知识

  • 这一关黑名单,没有使用trim()去除空格,可以使用空格绕过黑名单

    抓包,修改上传一句话木马文件名2.php (注意这里有个空格)

    image-20211026195123050

第八关(黑名单验证,点号绕过)

.php.过

相关知识

  • image-20211026210241977

  • 这一关黑名单,没有使用deldot()过滤文件名末尾的,可以使用文件名后加.进行绕过

    抓包,修改上传一句话木马文件名2.php.(注意这里有个点)

第九关(黑名单验证,特殊字符::$DATA绕过)

.php::$DATA过

连接的时候不加::$DATA

相关知识

  • 这一关黑名单,没有对::D A T A 进 行 处 理 , 可 以 使 用 : : DATA进行处理,可以使用::DATA进行处理,可以使用::DATA绕过黑名单

  • 补充知识:php在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名 他的目的就是不检查后缀名。

  • image-20211026214226998

第十关(黑名单)

.php. .过

相关知识

  • 这一关黑名单,最后上传路径直接使用文件名进行拼接,而且只对文件名进行 filename = deldot (file_name = deldot(file_name)

  • deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来

    上传zoe.php 然后用bp改后缀加点空格点(即文件名为.php. .)

image-20211027081406433

第十一关(黑名单验证,双写绕过)

.pphphp过

相关知识

  • 这一关黑名单,使用str_ireplace()函数寻找文件名中存在的黑名单字符串,将它替换成空(即将它删掉),可以使用双写绕过黑名单

  • str_ireplace(find,replace,string,count) 函数替换字符串中的一些字符(不区分大小写)

  • image-20211027081551606

第十二关(get00截断)我没复现成功

uplaod/2.php%00

访问2.php即可

相关知识

  • %00截断,因为上传后他的值会自动拼接上后面的 2.jpg 就变成了这样 11.php%002.jpg 当防护端检测的时候,发现后缀是2.jpg,于是就没有进行拦截,11.php后面的%002.jpg因为%00就都不生效,所以最后上传上去的就是11.php,为什么后面是7720210825092924.jpg而不是2.jpg是因为源代码有些随机文件名的规则。我们进行检测的时候直接访问这个地址,把php后面的都去掉:http://127.0.0.1/upload-labs-master/upload/11.php

  • image-20211027104007789

  • 原理

    php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。

  • strrpos(string,find[,start]) 函数查找字符串在另一字符串中最后一次出现的位置(区分大小写)。

  • substr(string,start[,length])函数返回字符串的一部分(从start开始 [,长度为length])

  • magic_quotes_gpc 着重偏向数据库方面,是为了防止sql注入,但magic_quotes_gpc开启还会对$REQUEST, $GET,$POST,$COOKIE 输入的内容进行过滤

  • move_uploaded_file(file,newloc) file必需。规定要移动的文件      newloc必需。规定文件的新位置。
    本函数检查并确保由 file 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 newloc 指定的文件。
    
    如果 file 不是合法的上传文件,不会出现任何操作,move_uploaded_file() 将返回 false。
    
    如果 file 是合法的上传文件,但出于某些原因无法移动,不会出现任何操作,move_uploaded_file() 将返回 false,此外还会发出一条警告。
    
    这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。
  • $img_path = $_GET['save_path']             get传参
  • 这一关白名单,最终文件的存放位置是以拼接的方式,可以使用%00截断,但需要php版本<5.3.4,并且magic_quotes_gpc关闭。

image-20211027104227949

第十三关(post%00截断)我没复现成功

upload/2.php+

在hex中+2b改成00进行截断过

连接2.php即可

相关知识

  • image-20211027110949457

  • image-20211027111031672

改成00

  • $img_path = $_POST['save_path']             post传参
  • 这一关白名单,文件上传路径拼接生成,而且使用了post发送的数据进行拼接,我们可以控制post数据进行0x00截断绕过白名单

    补充知识:POST不会对里面的数据自动解码,需要在Hex中修改。

第十四关(图片马)

上传一个图片马

点击文件包含漏洞

image-20211027112324069

文件包含刚刚上传的即可

include.php?file=upload/9620211027112123.gif

相关知识

  • 图片马制作copy 1.jpg/b+1.php/a 123.jpg

第十五关(图片马getimagesize)

上传一个图片马

点击文件包含漏洞

image-20211027112324069

文件包含刚刚上传的即可

include.php?file=upload/9620211027112123.gif

相关知识

  • 通过使用getimagesize()检查是否为图片文件,所以还是可以用第十四关的图片马绕过,并使用文件包含漏洞解析图片马

第十六关(exif_imagetype图片马)

这一关需要开启php_exif

上传一个图片马

点击文件包含漏洞

image-20211027112324069

文件包含刚刚上传的即可

include.php?file=upload/9620211027112123.gif

相关知识

  • exif_imagetype()读取一个图像的第一个字节并检查其后缀名。 返回值与getimage()函数返回的索引2相同,但是速度比getimage快得多。需要开启php_exif模块

第十七关(二次渲染绕过)

上传一个真正的图片马

点击文件包含漏洞

image-20211027112324069

文件包含刚刚上传的即可

include.php?file=upload/9620211027112123.gif

相关知识

  • 这一关对上传图片进行了判断了后缀名content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,但是后端二次渲染需要找到渲染后的图片里面没有发生变化的Hex地方,添加一句话,通过文件包含漏洞执行一句话,使用蚁剑进行连接

  • 二次渲染:后端重写文件内容

  • basename(path[,suffix]) ,没指定suffix则返回后缀名,有则不返回指定的后缀名

  • strrchr(string,char)函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。

  • imagecreatefromgif():创建一块画布,并从 GIF 文件或 URL 地址载入一副图像

  • imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像

  • imagecreatefrompng():创建一块画布,并从 PNG 文件或 URL 地址载入一副图像

  • 上传正常的GIF图片下载回显的图片,用010Editor编辑器进行对比两个GIF图片内容,找到相同的地方(指的是上传前和上传后,两张图片的部分Hex仍然保持不变的位置)并插入PHP一句话,上传带有PHP一句话木马的GIF图片

第十八关(条件竞争一)

从源码来看,服务器先是将上传的文件保存下来,然后将文件的后缀名同白名单对比,如果是jpg、png、gif中的一种,就将文件进行重命名。如果不符合的话,unlink()函数就会删除该文件。删除需要时间,只要上传大于删除的速度就可以访问,用造木马的马。

1.发送一个造马的马,bp抓包,发到测试器中(没有负载,无限重复,45线程)

2.访问这个造马的马,bp抓包,发到测试器中(没有负载,无限重复,50线程)

3.当2回显200时关闭攻击,上一个目录下有shell.php文件

4.连接即可

相关知识

  • 条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生。

  • unlink() 函数删除文件

  • 先是 $ret = $this->move();,进行了一次文件保存,然后再 $ret = $this->renameFile();,进行了一次更改文件名,所以可以用条件竞争来进行绕过

  • 造马的马<?php fputs(fopen('../shell.php','w'),'<?php @eval($_POST["cmd"])?>');?>

  • image-20211027143329287

  • image-20211027143353248

第十九关(条件竞争二)

需要在图片马没有被重命名之前访问它。要让图片马能够执行还要配合其他漏洞,比如文件包含,apache解析漏洞等。

可以是重命名条件竞争,或者直接利用文件包含过

相关知识

  • 从源码来看的话,服务器先是将文件后缀跟白名单做了对比,然后检查了文件大小以及文件是否已经存在。文件上传之后又对其进行了重命名。

    这么看来的话,php是不能上传了,只能上传图片马了,而且需要在图片马没有被重命名之前访问它。要让图片马能够执行还要配合其他漏洞,比如文件包含,apache解析漏洞等。

  • 这个靶场的作者的某种原因可能有误,上传的图片路径不是放在upload文件夹下,所以我们要进去修改一下第19关的代码文件

    19关的myupload.php改成这个

    image-20211027144603355

    刷新页面即可

第二十关(黑名单./重命名)

上传图片马

upload-19.jpg改成upload-19.php/.即可

相关知识

  • move_uploaded_file()有这么一个特性,会忽略掉文件末尾的 /.

  • 没有对上传的文件做判断,只对用户输入的文件名做判断 后缀名黑名单 上传的文件名用户可控 黑名单用于用户输入的文件后缀名进行判断 move_uploaded_file()还有这么一个特性,会忽略掉文件末尾的 /.

    先准备PHP一句话木马,并把后缀名改为PNG再上传

  • image-20211027160540892

第二十一关(文件名分割)我没复现成功

我们需要做的是 修改content-type

修改POST参数为数组类型,索引[0]为upload-20.php,索引[2]为jpg|png|gif

只要第二个索引不为1,$file[count($file) - 1]就等价于$file[2-1],值为空

上传图片马抓包

改后

image-20211027163346102

相关知识

  • 这一关白名单 验证过程: --> 验证上传路径是否存在 --> 验证['upload_file']的content-type是否合法(可以抓包修改) --> 判断POST参数是否为空定义$file变量(关键:构造数组绕过下一步的判断) -->判断file不是数组则使用explode('.', strtolower($file))对file进行切割,将file变为一个数组 --> 判断数组最后一个元素是否合法 --> 数组第一位和$file[count($file) - 1]进行拼接,产生保存文件名file_name --> 上传文件

  • explode(separator,string[,limit]) 函数,使用一个字符串分割另一个字符串,并返回由字符串组成的数组。

  • end(array)函数,输出数组中的当前元素和最后一个元素的值。

  • reset(array)函数,把数组的内部指针指向第一个元素,并返回这个元素的值

  • count(array)函数,计算数组中的单元数目,或对象中的属性个数

  • upload-labs(12-21)通关教程_墨子辰的博客-CSDN博客

子夜不哭
最后更新于 2021-12-20