一.第一关(前端绕过)
首先准备一个php小马
<?php phpinfo();?>
这是调用phpinfo这个函数,查看php的配置信息
首先上传1.php发现
使用BP抓不到包,猜测被前端验证了,查看网页源代码
可以看到下面有一段js代码过滤了,只能传.jpg/.png/.gif,进行了白名单过滤,所以我们需要禁用前端的js代码
使用这个扩展可以禁用前端代码的执行,也可以直接按F12进入开发者模式,在按F1进入设置
这里可以禁用js代码
右键在新窗口打开,出现下面的页面就成功了
二.第二关(后端绕过)
上传1.php发现不行,看看源码
可以看到这段php代码进行了后端的验证,我们进行BP抓包
修改Content-Type: image/jpeg、image/png、image/gif(上述三种任选其一),重新发包
进来可以发现成功了,右键新窗口打开
三.第三关(后缀名绕过)
上传1.php,发现进行了黑名单过滤
在某些特定环境中某些特殊后缀仍会被当作php文件解析 php、php2、php3、php4、php5、php6、php7、pht、phtm、phtml。
看看源代码
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array('.asp','.aspx','.php','.jsp');//黑名单
$file_name = trim($_FILES['upload_file']['name']);//去掉字符串两边的空格
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //收尾去空
if(!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if (move_uploaded_file($temp_file,$img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
四.第四关(.htaccess绕过)
尝试上传4.php、4.php5、4.phtml以及各种大小写后缀均绕过失败,查看提示
发现有一个文件是没有过滤的,即上传中常用到的 .htaccess文件、
.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。
.htaccess主要的作用有:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。
.htaccess的用途范围主要针对当前目录。
.htaccess文件的内容
<FilesMatch "4.png">
SetHandler application/x-httpd-php
</FilesMatch>
在上传4.png即可,小编没尝试成功,不理解
但是还有办法 windows特性后缀xxx.php. .
上传文件之后会自动去掉后面的内容
上传成功了
五.第五关(.user.ini.绕过)
和第四关一样了
六.第六关(大小写绕过)
发现没有使用
strtolower($file_ext)
所以采用大小写绕过
大小写绕过原理:
Windows系统下,对于文件名中的大小写不敏感。例如:test.php和TeSt.PHP是一样的。
Linux系统下,对于文件名中的大小写敏感。例如:test.php和 TesT.php就是不一样的。
七.第七关(空格绕过)
发现这段没有使用trim去掉空格,所以我们进行空格绕过
成功
八.第八关(.绕过)
Windows系统下,文件后缀名最后一个点会被自动去除。上传 1.php.
九.第九关(特殊字符::$DATA绕过)
补充知识:php在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名 他的目的就是不检查后缀名。
成功上传
十.第十关(黑名单)
补充知识:deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来
和第五关一样
十一.第十一关(双写绕过)
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess","ini");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = str_ireplace($deny_ext,"", $file_name);
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.$file_name;
发现他把array数组里的都给进行了替换但是只进行了一次
成功上传
十二.第十二关(get00截断)
这一关白名单,最终文件的存放位置是以拼接的方式,可以使用%00截断,但需要php版本<5.3.4
原理:php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。
上传zoe.php
用BP抓包修改参数,把upload/后面加上zoe.php%00
(即图二),下面的filename=”zoe.php”
改为zoe.png
十三.第十三关(post 00截断)
这一关白名单,文件上传路径拼接生成,而且使用了post发送的数据进行拼接,我们可以控制post数据进行0x00截断绕过白名单
补充知识:POST不会对里面的数据自动解码,需要在Hex中修改。
十四.第十四关(图片马unpack)
补充知识:
1.Png图片文件包括8字节:89 50 4E 47 0D 0A 1A 0A。即为 .PNG。
2.Jpg图片文件包括2字节:FF D8。
3.Gif图片文件包括6字节:47 49 46 38 39|37 61 。即为 GIF89(7)a。
4.Bmp图片文件包括2字节:42 4D。即为 BM。
cmd
使用 copy 777.png/b + zoe.php pass14.png
制作图片马
,上传图片马
因为上传图片马之后会被重命名图片所以下面的payload的图片名字可以在上传之后复制图片链接就可以了
构造的URL为include.php?file=upload/3420210320172751.png
十五.第十五关(getimagesize图片马)
通过使用getimagesize()检查是否为图片文件,所以还是可以用第十四关
的图片马绕过,并使用文件包含漏洞解析图片马
构造的URL为include.php?file=upload/8620210320174003.png
如果出现如下图情况代表图片马是成功解析了
十六.第十六关(exif_imagetype图片马)
和14一样
十七.第十七关(二次渲染绕过)
这一关对上传图片进行了判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,但是后端二次渲染需要找到渲染后的图片里面没有发生变化的Hex地方,添加一句话,通过文件包含漏洞执行一句话,使用蚁剑进行连接
补充知识:
二次渲染:后端重写文件内容
basename(path[,suffix]) ,没指定suffix则返回后缀名,有则不返回指定的后缀名
strrchr(string,char)函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
imagecreatefromgif():创建一块画布,并从 GIF 文件或 URL 地址载入一副图像
imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像
imagecreatefrompng():创建一块画布,并从 PNG 文件或 URL 地址载入一副图像
这里有个小提示,对于做文件上传之二次渲染建议用GIF图片,相对于简单一点
上传正常的GIF图片下载回显的图片,用010Editor编辑器进行对比两个GIF图片内容,找到相同的地方(指的是上传前和上传后,两张图片的部分Hex仍然保持不变的位置)并插入PHP一句话,上传带有PHP一句话木马的GIF图片
为了方便大家测试,这里提供一张网上某个大佬提供的GIF图片,当时我也找了很久,大家可以保存一下https://wwe.lanzoui.com/iFSwwn53jaf
利用文件包含漏洞
构造的URL为include.php?file=upload/31608.gif
十八,十九(条件竞争)
二十.第二十关
没有对上传的文件做判断,只对用户输入的文件名做判断
后缀名黑名单
上传的文件名用户可控
黑名单用于用户输入的文件后缀名进行判断
move_uploaded_file()还有这么一个特性,会忽略掉文件末尾的 /.
先准备PHP一句话木马,并把后缀名改为PNG再上传
二十一.第二十一关
upload-labs第21关分析与答案 - Ling-X5 - 博客园 (cnblogs.com)