pass-1 js绕过

使用js在本地对文件进行校验
image

解决方法1:浏览器禁用js可实现绕过
解决方法2:bp抓包
image

将jpg改为php就可实现绕过
image

解决方案3:将网页下载下,删除过滤的js,在form提交表单中添加action属性,将其发送给原本应该正常发送的地址(查看请求头的URL)。这种方案可以解决一些判断文件以及提交文件都用js,从而导致无法抓包的问题

pass-2:MIME检验

if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif'))
校验代码判断文件的type类型是否为jpg/png/gif三种格式之一
绕过方法1:先将php后缀改为jpg/png/gif三种其中之一,然后抓包改为php
绕过方法2:直接上传php文件,然后抓包修改数据包中Content-Type类型
image

pass-3:黑名单绕过

这一关提示
image

查看校验代码
image

绕过方法1:双写::\(D::\)DATAATA
校验代码只校验一次::$DATA所以可以双写绕过
image

::\(DATA是window系统特有文件流,::\)DATA可以绕过对文件上传的安全检查,image.php::$DATA上传以后在服务器会存储为image.php
绕过方法2:扩展名绕过
使用php5/php4/phtml等扩展名进行绕过
注:扩展名绕过需要在phpsstudy中的http.conf增加
image

版本太新的phpstudy即使添加了也不能上传成功,建议使用版本较早的版本
image

pass-4:.htaccess绕过

黑名单限制增加,但没有限制.htaccess
image

.htaccess 是一个 Apache Web 服务器的配置文件
名字内带有jpg的文件都以php格式解析
image

先上传.htaccess文件,在上传shell
upload-labs writeup-小白菜博客
image

pass-5 .user.ini绕过

.user.ini是一个配置文件,用于设置PHP运行环境中的各种配置设置。
.user.ini配置 使其自动包含shell.jpg文件到每个PHP文件的开头。
auto_prepend_file=shell.jpg
shell.jpg
<?php phpinfo();?>
先上传.user.ini再上传shell.jpg

pass-6:大小写绕过

校验代码相比之前少了,转换小写,搭建平台window对大小写不敏感
image

绕过方法1:大小写绕过
image

绕过方法2:双写::$DATA
image

pass-7 空格绕过

少了trim函数
image

直接后面添加空格进行绕过
image

pass-8 点绕过

没有使用函数deldot,在window中点和空格都是不被允许的
upload-labs writeup-小白菜博客
image

pass-9 ::$DATA绕过

直接::$DATA绕过
upload-labs writeup-小白菜博客
image

pass-10 点空格点绕过

image

这一关主要针对deldot函数进行绕过,deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来
遇到deldot()函数可以在后缀名后加入". .",这就是点空格点绕过,空格负责将deldot()停止,然后会被trim函数删除,但是会剩下一个点,上传到服务器,点也会被删除
image

pass-11:双写绕过

代码先创建一个黑名单,然后接收上传文件的后缀名,去除黑名单内的字符,但只进行了一次绕过,所以可以进行双写绕过
upload-labs writeup-小白菜博客
image

pass-12 %00截断

00截断条件:
php版本小于5.3.4
php的magic_quotes_gpc为OFF状态
服务器版本
image

审计代码
image

上传路径可控,使用get传参那就可以使用%00截断
image

pass-13 0x00截断

与12关代码大同小异,唯一不同的就是传递的存储路径由get改为post
image

get传参会经过编码,post不会,所以使用0x00截断
截断需要在十六进制中将传递的名字后面写为00
image

或者直接写%00然后对其进行url编码
image

pass-14 文件包含

getReailFileType函数读取文件前两个字节判断是否为jpg,png,gif其中之一
image

判断上传文件是否满足要求,满足则随机命名存入文件夹
image

制作图片马,直接在图片后插入
image

文件包含漏洞,接收get传入的file参数
image

访问url:include.php?file=upload/4620230414113629.png
image

pass-15 getimagesize()+ 文件包含

与十四关大同小异,只是换成getimagesize()来检查文件
getimagesize()函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息
image

直接上传图片马,然后访问url:include.php?file=upload/图片命名.jpg
image

pass-16 exif_imagetype()+文件包含

需要开启php_exif模块,否则会界面无法显示
image

exif_imagetype()函数:读取一个图像的第一个字节并检查其签名,如果发现恰当的签名返回一个对应的常量,否则返回false。返回值和getimagesize()返回值的数组中的索引2的值是一样的,但本函数快的多。
直接用之前图片马即可
image

pass-17 二次渲染+文件包含

代码使用imagecreatefromjpeg函数对图片进行渲染
image

我们可以先上传一个gif图片然后下载渲染过后的gif,二者使用010进行对比,查看有哪些地方是不会被渲染所更改的
image

然后在不会被渲染的地方添加phpinfo
image

成功上传
image

pass-18 条件竞争

根据代码可以看出,先将上传文件放到目录下,然后再进行条件判断,不满足白名单则删除
image

可以使用burp爆破模块,进行爆破,然后再不断访问上传脚本,只要访问到,就会打断代码删除文件的操作
upload-labs writeup-小白菜博客
upload-labs writeup-小白菜博客
不断访问
image

pass-19 条件竞争+apache未知扩展名解析漏洞

本关代码有点小问题,需要修改myupload.php
image

代码审计可知,跟18关大致类型一致,不过限制更加严格一些,思路是相同的,在文件被上传但还未重命名的时候访问
这是可以上传的后缀名单,这样就可以使用apache未知扩展名解析漏洞,遇到无法解析的后缀就往前挪一个
image

上传shell.php.7z
image

burp爆破
image

不断刷新访问
image

pass-20 move_uploaded_file()特性利用

代码审计可知先将文件上传然后判断传递的保存名称是否存在黑名单,不存在就将其移动到指定目录
image

由于代码没有对其进行严格的限制绕过,所以之前的大小写,空格,点,::$DATA均可以实现绕过,但由于之前关卡都考过,所以这肯定不是作者重点
move_uploaded_file()特性,会忽略掉文件末尾的 /.
image

上传后直接访问即可
image

pass-21 逻辑数组绕过

代码将上传文件名分割为数组形式然后进行判断
upload-labs writeup-小白菜博客
image

修改为数组形式上传
upload-labs writeup-小白菜博客
image