upload-labs 靶场全解(全)
2023-12-5 14:24:34 Author: www.freebuf.com(查看原文) 阅读量:3 收藏

前提条件:

1.文件能够成功上传到服务器

2.攻击者能够知道文件的上传路径

Pass-01( 前端验证)

三种方法解决思路

1.禁用客户端JavaScript弹窗

1701756511_656ebe5fb4c491cfcc41a.png!small?1701756514715

2.通过burp抓包,修改后缀名

3.f12删除return filecheck()代码

步骤:

通过上传一个.php格式的脚本会出现弹窗,那么做此题的出发点可以从客户端的方式绕过入手。

1701756519_656ebe6770beef618f751.png!small?1701756522397

修改前端代码:将javascript弹窗关掉

1701756526_656ebe6ecc870e9e97417.png!small?1701756529876

将弹窗和检查代码的函数删除掉,那么此时上传的.php脚本文件就是可以上传到服务器的(如果不删除 return checkfile()函数,.php脚本是可以上传的但是不会上传到服务器,不满足为文件上传的条件,所以是失败的)

1701756534_656ebe7612f87bdb78600.png!small?1701756537096

可以看到.php脚本文件上传成功,检查服务器目录

1.服务器后台能够看到

1701756541_656ebe7db3a947fceb0a0.png!small?1701756544816

2.直接访问图片的所在路径

(1)右键图片

1701756549_656ebe8512b5dc56b1d48.png!small?1701756552241

(2)通过前端代码同样也会显示相对路径

1701756557_656ebe8de66707af41faa.png!small?1701756561132

(3)burpsuite抓包演示

3.浏览器访问路径查看信息

1701756571_656ebe9bedd6425b8c273.png!small?1701756575044

出现白色页面是正常情况,因为你的web服务器无法正常去显示一个含有“木马”的php脚本,所以就用到密码接收的方式

1701756579_656ebea365c9072ebecb4.png!small?1701756582664

以上重要信息全部显示

最后便是用蚁剑去获取文件路径

测试成功,代表实验成功

1701756586_656ebeaa993aae0344ac0.png!small?1701756589609

Pass-02(MIME验证)

没有弹窗,显示以下红字的错误提示信息

1701756595_656ebeb3c714c16666ed5.png!small?1701756598859

两种方法:第一种是上传php文件,改Content-Type,第二种是上传合法后缀文件,改文件后缀。

法一:

改Content-Type:

1701756603_656ebebb1bbe685368aa5.png!small?1701756606724

repeater之后可以看到右侧画面

验证:不断的放包直到火狐页面也会显示如右图样式

1701756612_656ebec48e7b68bf7c3e8.png!small?1701756615889

服务器下显示脚本上传成功

1701756620_656ebecc28870eb837fe7.png!small?1701756623334

法二:更改文件后缀

burp开启拦截,然后另外一边将shell.php更改为,shell.png,然后点击上传,完事burp中就会获取如下的包,更改文件后缀为.php

1701756626_656ebed2c441204163c7e.png!small?1701756629869

服务器的后台显示方才上传的脚本文件

1701756633_656ebed9d537618cf94c1.png!small?1701756636900

Pass-03(黑名单验证,特殊后缀名)

黑名单策略---在服务器上不允许特定后缀的文件上传(PHP, asp, jsp)

php环境可以尝试的后缀php1,php2,php3,php4.php5,phtmI, pht

1701756643_656ebee30d7632c3836e8.png!small?1701756646070

需要修改Apache的httpd.conf有配置代码

AddType application/x-httpd-php .php3 .php4 .phtml .phps .php5 .pht

将#去掉

1701756652_656ebeec2c9b4eef0c0e6.png!small?1701756655139

1701756657_656ebef1bc0294ddc3ac7.png!small?1701756660951

蚁剑连接即可

这是源码当中的黑名单

$deny_ext = array('.asp','.aspx','.php','.jsp');

Pass-04(.htaccess)

这一关我们可以看到禁止上传文件可太多了,几乎完全屏蔽

源码黑名单

$deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini");

1701756667_656ebefbc48c4b50d7c83.png!small?1701756670768

1.但是.htaccess还是没有过滤,可以重写文件解析规则绕过,上传一个.htaccess,这个文件内容的意思是告诉apache当遇到qianxun.jpg文件时,按照php去解析,文件内容如下:

<FilesMatch "xxx.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

我们再创建一个php测试文件xxx.php

分别将.htaccess文件和xxx.jpg文件上传

AddType application/x-httpd-php .jpg

1701756680_656ebf08edb0f2d0c7017.png!small?1701756683869

1701756692_656ebf143ef4f2298f794.png!small?1701756695133

如图所示,已经上传服务器成功

1701756708_656ebf24ee52c8c3a3251.png!small?1701756711838

用浏览器访问xxx.jpg:

1701756715_656ebf2b846994602508f.png!small?1701756718535

如图所示,xxx.jpg被成功解析

Pass-05(黑名单验证,.user.ini.)

这关多过滤了个.htaccess

$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");

创建一个.user.ini文件并把它上传

1701756726_656ebf3694d32d16d465f.png!small?1701756729477

.user.ini文件里的意思是:所有的php文件都自动包含666.jpg文件。.user.ini相当于一个用户自定义的php.ini

1701756737_656ebf418ae88718c1446.png!small?1701756740413

修改php-ini配置文件

把这里的300秒(即默认等5分钟)改为10

1701756746_656ebf4a2e9b0b30ab2fc.png!small?1701756749228

修改后保存php.ini文件并重启phpstudy

前提:在服务器上有一个456.php当中含有“一句话木马”文件,然后访问此php文件即可

1701756754_656ebf5240dbd52052edd.jpg!small?1701756757585

Pass-06 (黑名单绕过,大小写绕过)

滤掉.htaccess和.ini。但是没有使用strtolower()函数,可以使用大小写绕过黑名单

把.php 格式改为 .Php 上传上去之后,就会自动解析为.php

strtolower() 函数把字符串转换为小写

1701756763_656ebf5bb99d7a7ae4def.png!small?1701756766695

右键获取图片链接

1701756770_656ebf62b69304b13a1e1.png!small?1701756773790

参数获取phpinfo

1701756779_656ebf6b2c804563b8969.png!small?1701756782605

连接蚁剑

1701756786_656ebf72198ad8f5e7d96.png!small?1701756789626

Pass-07(黑名单验证,空格绕过)

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

1701756802_656ebf824989fe6981ed8.png!small?1701756805473

正常显示

1701756809_656ebf89322ca1d50bb90.png!small?1701756812495

Pass-08 (黑名单验证,点号绕过)

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

1701756826_656ebf9a623170dfe7ab8.png!small?1701756829404

1701756833_656ebfa1408a3bdee9a86.png!small?1701756836205

测试蚁剑连接

1701756840_656ebfa8557c5468fe8d5.png!small?1701756843416

Pass-09(黑名单,特殊字符::$DATA绕过)

1701756420_656ebe04e940276374dbf.png!small?1701756423938

连接蚁剑,不能使用::$DATA

1701756863_656ebfbfe8d509516eeaa.png!small?1701756866995

Pass-10(黑名单 点 空格 点

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

使用shell.php. . 的方式绕过 (点 空格 点)

1701756878_656ebfcedb32429e321d1.png!small?1701756882101

1701756885_656ebfd513435e3c2dfb8.png!small?1701756888423

Pass-11(双写绕过)

提示信息:

1701756895_656ebfdf9061cff3e59e3.png!small?1701756898511

源码要求(str_ireplace())函数将黑名单中的文件后缀名进行了替换为空

1701756907_656ebfeb00fc0919b9abb.png!small?1701756910529

在burp中更改文件后缀名

1701756922_656ebffa091f0533715db.png!small?1701756925242

在靶机中的效果,后缀名一律没有

1701756929_656ec001600797121963c.png!small?1701756932364

str_ireplace() 函数不区分大小写,大小写绕过不适用,因此使用双写绕过

1701756936_656ec008e057e5bcdb17f.png!small?1701756940193

成功被传入

1701756944_656ec0103b3958289189e.png!small?1701756947251

连接蚁剑成功,php文件成功被解析

1701756950_656ec01660a2bfecba28d.png!small?1701756953539

Pass-12 (白名单绕过 00截断GET型)

源码:

只能上传jpg,png,gif图片的方式

用GET的方式传参,要求是:随机数+时间参数 +.+可控的类型,保证传入的参数可控

1701756963_656ec023e69190fa51f59.png!small?1701756967295

本体绕过方式:

apache版本调至5.2.17
magic_quotes_gpc=off

将php后缀改为服务器允许上传的文件后缀(png,gif,jpg),将123.php后的内容忽略掉,使用web.php.png文件中的内容上传到123.php中

原理:(参考:https://blog.csdn.net/weixin_47598409/article/details/115050869

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

1701756974_656ec02e4e28b9cabf863.png!small?1701756977692

右键访问图片链接,可以看到文件成功被解析

1701756982_656ec03641a18455c8e95.png!small?1701756985546

注意:连接蚁剑要将中间的字母数字都混杂内容清理掉,然后便可成功连接

1701756990_656ec03e51805e7a99d8d.png!small?1701756993566

Pass-13 (白名单绕过,post 00截断)

只允许上传.jpg|.png|.gif类型文件!认定为白名单验证

和PASS-12类似

1701756999_656ec0470be0fd8f2a8d3.png!small?1701757002167

本题绕过

apache版本调至5.2.17
magic_quotes_gpc=off

传参方式为POST,使用0x00进行截断,对数据进行0x00截断绕过

上传shell.php用BP抓包

上传的是一个php文件,首先要抓包更改它的后缀名来绕过白名单验证

提示:1701757006_656ec04e6364ba0357f27.png!small?1701757009264

因为源码告诉我们它的保存路径是拼接的,所以我们直接可以在可控的部分直接输入文件名,并且用%00截断来截断后面那些多余的内容

POST不会对%00进行解码

修改URL,进行解码

1701757013_656ec0555bc66ee9ffdb6.png!small?1701757016427

将其红框内容删除

1701757020_656ec05ca613627d16a19.png!small?1701757023547

访问后发现,php文件能够被浏览器解析

1701757027_656ec06321a24eb4c6168.png!small?1701757030223

连接蚁剑成功

1701757037_656ec06d0cccd1f4a003d.png!small?1701757040180

本来要做14关的,莫名其妙的弄错了,制作了个简易的图片马,然后自己还请记住了是文件包含的格式就构造了URL,不过此方法是适用于13关的

图片马,就是在图片中隐藏一句话木马。
在cmd命令行中,此操作是在随便目录下完成的,当是要参与制作的图片和一句话木马文件要处于同一个目录下。


首先love.png是一张普通的图片(随便截取一张),php.php存储的一句话木马(当然也可以写在其他类型的文件中),lovelove.png是生成的文件。

copy php.php/b + love.png lovelove.png
#其中b代表二进制文件,a代表assci

1701757049_656ec0791dd38c5a9edb1.png!small?1701757051981

将生成的lovelove.png上传,传输成功,不过可以看到此时图片马是无法被浏览器解析的

1701757056_656ec0803e9ac68d43193.png!small?1701757059527

不过构造的URL可以根据访问的页面,看到是可以被成功解析了

http://192.168.200.71/uploadlabs/include.php?file=/upload/7420230928033352.png

1701757064_656ec088521a81fc50535.png!small?1701757068550

cmd连接

1701757072_656ec090751e08c97916b.png!small?1701757075619

连接蚁剑

1701757079_656ec097f084ed05c7839.png!small?1701757083129

Pass-14(首次制作图片马)

1701757086_656ec09eefa7c81c0fef6.png!small?1701757089999

在文件头部添加图片格式:

GIF的文件头为GIF89a,png的文件头为PNG。

随便截取一张图片

添加文件头

末尾写上一句话

1701757097_656ec0a9a62b92f5ca4ed.png!small?1701757101185

成功上传之后,右键图片链接,然后用文件包含漏洞打开图片,被成功解析

1701757106_656ec0b274f18225ffa9e.png!small?1701757110984

Pass-15(getimagesize)

1701756456_656ebe28019c2ae4635b1.png!small?1701756459547

getimagesize函数意思是:对目标文件的16进制去进行读取文件头的几个字符串是不是符合图片的要求

这关用第14关的图片马就可以实现,将含有一句话的木马放到图片中,然后将文件头此换成要求的三种图片的头格式

上传成功

1701757119_656ec0bf4342588202d0b.png!small?1701757122745

可以被成功解析

1701757128_656ec0c82841f1d3f95b4.png!small?1701757132101

Pass-16(exif_imagetype)

exif_imagetype()读取一个图像的第一个字节并检查其后缀名。需要在phpstudy的扩展种开启php.exif选项

做法和上一关同,不再赘述!

Pass-17(二次渲染)

提示信息

1701757151_656ec0df25c22e5f7413b.png!small?1701757154373

要求图片格式为JPG(后续还有代码要求格式为GIF,PNG 不在赘述)

1701757159_656ec0e7aa9761d2124fb.png!small?1701757163111

move_uploaded_file($tmpname,$target_path)此函数附近有逻辑错误

1701757167_656ec0ef824e1624a4999.png!small?1701757170989

不过本题是考察的图片马,制作图片马(理由上一几关的方式,文件包含以下)

1701757176_656ec0f83db1e9a33bd28.png!small?1701757180653

不过webshell获取不了,从上传的目录上看,上传之后的一句话没有了

1701757191_656ec1072f084172eeb62.png!small?1701757194206

1701757197_656ec10d1269de6113d4b.png!small?1701757200275

二次渲染后的一句话消失了。那么经过观察,看到从此处前后是不变的

1701757210_656ec11a3c87c156fead2.png!small?1701757214157

用010Editorr打开,尝试蒋一句话插到此位置

1701757222_656ec1260e708b551d1ef.png!small?1701757226442

然后蚁剑连接

1701757230_656ec12ec27ce3ad792a3.png!small?1701757236030

Pass-18(条件竞争)

提示信息

1701757242_656ec13aa26bb77de973e.png!small?1701757245821

使用move_uploaded_file()函数,将上传的文件保存到服务器,再进行判断是否是jpg、png、gif中的一种类型,如果在数组中就保存重命名,如果不在根据unlink()就直接删除

代码他是先将图片上传上去,才开始进行判断后缀名、二次渲染。如果在上传上去的一瞬间访问这个文件,那他就不能对这个文件删除、二次渲染。这就相当于我们打开了一个文件,然后再去删除这个文件,就会提示这个文件在另一程序中打开无法删除。

$is_upload = false;
$msg = null;

if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_name = $_FILES['upload_file']['name'];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_ext = substr($file_name,strrpos($file_name,".")+1);
    $upload_file = UPLOAD_PATH . '/' . $file_name;

    if(move_uploaded_file($temp_file, $upload_file)){
        if(in_array($file_ext,$ext_arr)){
             $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
             rename($upload_file, $img_path);
             $is_upload = true;
        }else{
            $msg = "只允许上传.jpg|.png|.gif类型文件!";
            unlink($upload_file);
        }
    }else{
        $msg = '上传出错!';
    }
}

抓数据包,上传,发送到Intruder模块下

1701757254_656ec1466ba108b888d1c.png!small?1701757257558

clear

1701757267_656ec1534ec73896a7e68.png!small?1701757270942

将payload类型设为空,意思是不断地上传空的payload

1701757274_656ec15aa5acde755422f.png!small?1701757278330

调大线程

1701757284_656ec16413f020d453ee8.png!small

1701757296_656ec1708c4ed0692ec63.png!small?1701757299694

开始实施

1701757309_656ec17d306ae62c4905d.png!small?1701757313135

1701757315_656ec1832f264cca69b98.png!small?1701757318839

值得注意的是,真实环境下一般没有源码,需要自己逐个尝试,不过就此看来,是白名单限制居多。

Pass-19(条件竞争)

此关上传路径存在问题,建议修改,进入到19关修改后重启即可

1701757327_656ec18fb8c33ff1f8093.png!small?1701757331465

源码说的是服务器将文件后缀跟白名单做对比,然后检查了文件大小以及文件是否已经存在。

文件上传之后又对其进行了重命名,这关只能上传图片马了。要让图片马能够执行还要配合文件包含或者解析析漏洞,和之前几关类似通过文件包含去访问该图片马。

1701757339_656ec19b5404fc57890d5.png!small?1701757342392

然后还是使用上一关的做法,本关我废了很大劲,线程调的巨大也没反应就不附图了,我把参考的大佬链接放到后边。

Pass-20

提示信息

1701757348_656ec1a493ab1a715181b.png!small?1701757352857

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

1701757359_656ec1afc7467b017d62b.png!small?1701757362832

修改upload-19.jpg 修改为upload-19.php/.

1701757365_656ec1b5aa56236ff7eca.png!small?1701757369194

复制图片链接,输入连接密码

1701757373_656ec1bdb9e97fb0eb57a.png!small?1701757377122

1701757386_656ec1ca95d75e005e9b3.png!small?1701757389687

Pass-21

此关不是在我理解的范畴内,后续还需要多钻研,多总结!


文章来源: https://www.freebuf.com/articles/web/385709.html
如有侵权请联系:admin#unsafe.sh