upload-labs-master闯关笔记
pass 01(前端检测绕过)
首先先了解文件上传的前端检测,前端检测即在文件开始正式上传之前,利用如js脚本对文件名进行白名单或黑名单过滤,符合规则即向服务器上传,不符合则拒绝上传
前端检测文件上传通常有两种绕过方式
1.直接浏览器禁用js,再传shell到服务器
2.上传正常的文件后缀名(jpg .png之类的) 再用bp抓包改成.php
pass 01用两种方法分别尝试

这里用户上传文件,前端js checkfile函数会对文件后缀进行检测

上传.php提示违规,禁用一下js


提示消失,复制一下图片链接,直接访问

成功上传phpinfo
方法二 bp抓包改后缀

先上传正常后缀名的文件,里面是php代码,再改成.php

成功访问

后端验证
后端验证即服务器验证,文件上传到服务器后,再进行校验匹配文件是否符合规则,符合则保留,不符合就删除
MIME
即多用途互联网邮件扩展 它是当前广泛应用的一种电子邮件技术规范
MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。官方的
MIME类型大全 https://www.w3school.com.cn/media/media_mimeref.asp
pass 02(content-type头的白名单检测)

查看源码得知这里对content-type头进行检测 当文件上传时利用 MIME 类型匹配文件类型时候符合要求,符合则通过不符合再拒绝
这里先上传php文件

更改content-type头
application/octet-stream改为白名单中的ct头即可,image/png image/gif image/jpg均可
成功访问

pass 03(利用apache特性更改后缀名绕过黑名单检测)
pass 02为白名单检测,该关为黑名单检测

可以看到这里限制了asp .aspx .php .jsp文件的上传
这里绕过黑名单限制利用了apache服务器的特性

php php3 php5 phtml 都会当做php解析执行
常用于绕过的后缀还有php4 php2 php1 html htm pHp pHp5 pHp4 等
这里因为我的apache版本问题,不能复现
pass 04(.htaccess配置文件解析)

几乎过滤了所有后缀,该关需要用.htaccess解析
该关利用apache一个配置文件的解析
.htaccess文件是apache独有的配置文件
它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:
网页301重定向、
自定义404错误页面、
改变文件扩展名、
允许/阻止特定的用户或者目录的访问
禁止目录列表、
配置默认文档等功能
该关需要进行一些apache配置
1.要打开mod_rewrite模块
phpstudy软件界面——>其他选项菜单——PHP扩展及设置——Apache扩展——rewrite_module模块
2.AllowOverride All。
其他选项菜单——打开配置文件——httpd.conf 文件
搜索查找AllowOverride None,然后把AllowOverride None修改为 AllowOverride All,完成后保存
完成以上配置后
创建.htaccess文件
<FilesMatch "pass4"> Sethandler application/x-httpd-php </FilesMatch >
这样 服务器会把文件名包含pass4的文件 当做php解析执行
创建一个pass4.jpg
文件里写phpinfo的内容, 成功上传图片后访问图片,通过.htaccess文件即可解析php代码

pass 05(.user.ini配置文件解析)

写死了所有后缀,包括.htaccess文件
这里需要用.user.ini配置文件解析
.user.ini的使用范围比.htaccess更广
不管服务器是 nginx/apache/IIS,当使用 CGI/
FastCGI 来解析 php 时,php 会优先搜索目录下所有的.ini 文件,并应用其中的配置。
类似于 apache 的.htaccess,但语法与.htacces 不同,语法跟 php.ini 一致
创建一个 .user.ini文件
auto_prepend_file=pass5.jpg
pass5.jpg依旧写phpinfo

user.ini的作用 使所有的php文件都自动包含pass5.jpg,这样,pass5.jpg中的php代码能够正常解析
pass 06 (大小写绕过)

可以看到这里没有进行大小写转换
可以用大小写后缀进行绕过
原理
Windows 系统下,对于文件名中的大小写不敏感。例如:test.php 和 TeSt.PHP 是一
样的
Linux 系统下,对于文件名中的大小写敏感。例如:test.php 和 TesT.php 就是不一样
的
这里将后缀改为.PHP即可

成功访问
pass 07(利用空格和.绕过黑名单检测)

这里没有用trim()去除空格
在Windows 系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除空格。从而绕过黑名单
bp抓包,文件名加空格即可
方法二
依旧是利用Windows特性,在文件名后缀后加上字符. 利用windows特性,会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过
pass 08(点号绕过)
可以利用前一关的方法二进行点号绕过
pass 09(::$DATA绕过)

源码这里未对::$DATA进行处理,可以利用这一点
在windows系统下 文件名+::$DATA会把它之后的数据当作数据流处理,不会检测后缀名,且保持之前的文件名
如 phpinfo.php::$DATA windows会去除末尾的::$DATA变为phpinfo.php
bp抓包,将文件的后缀名php后加上::DATA$,放包,成功访问

pass 10(拼接绕过)

观察源码,注意这里路径拼接时用的是file_name而不是file_ext
即文件名只进行了两次操作
第一次用trim()函数进行首尾去空,第二次用deldot删除文件名末尾的点
构造payload如下
test.php. .
首先利用win特性去除最后一个.变为test.php.+空格
然后trim()去掉最后的空格
变为test.php.
然后deldot删除最后一个.
至此成功绕过黑名单检测
pass 11(双写绕过)

这里用str_irreplace对文件名中出现在黑名单中的后缀替换为空,但是仅仅进行了依次替换,所以可以用双写进行简单绕过
payload .pphphp
pass 12(白名单 get型00截断)

使用白名单限制上传文件的类型,但是文件的保存路径即save_path可控
这里可以用php的00截断过关
条件
需要 php 的版本号低于 5.3.29,且 magic_quotes_gpc 为关闭状态
操作
设置上传路径为 upload/phpinfo.php%00 ,添加 phpinfo.php%00 内
容为了控制路径,上传文件后缀为白名单即可 例:test.jpg,test.jpg里的内容写phpinfo,保存后为
/upload/phpinfo.php%00test.jpg,但服务端读取到%00 时会自动结束,将test.jpg文件
中的内容保存至 phpinfo.php 中
pass 13(白名单post型00截断)
与前关类似,只不过保存路径变为了post传参
get方式传参会自动解码,而post传参不会
所以要对%00手动编码

pass 14(文件头检测绕过)

查看源码,发现这里对文件头进行了检测
方法一
添加gif图像的文件头
如图

上传后利用文件包含漏洞即可
这里添加GIF89a的文件头才能被识别为gif文件,否则会上传失败
方法二(图片马)
用notepad制作一个php图片马,在文件最后加上phpinfo即可

结合文件包含漏洞,成功访问phpinfo

pass15 16和14类似,都是对文件头进行检测,只不过用的函数不同,绕过方法一样,都是利用图片马
pass 17(文件检测及二次渲染)
二次渲染:即文件上传到服务器后,服务器会对图片进行二次处理(格式,尺寸等)服务器会利用我们提供的图片生成一个新的图片,在这个处理的过程中,图片马中的php代码可能被清除

查看源码,该关检测了ct头,后缀名,以及二次渲染
方法一(仅对gif文件有效)
先上传一个正常的gif文件
将上传后的文件下载下来(这时的gif已经经过服务器处理)
将渲染前的gif与渲染后的gif进行对比(使用beyond compare)

如图,在未被渲染的地方插入phpinfo信息
上传修改后的gif
利用文件包含成功访问

经尝试,该方法只能用于gif png和jpg不能使用
方法2
对于png图片,绕过方法要复杂点
这里直接使用别人的脚本生成一张能够绕过二次渲染的png图片马
<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
0x66, 0x44, 0x50, 0x33);
$img = imagecreatetruecolor(32, 32);
for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y];
$g = $p[$y+1];
$b = $p[$y+2];
$color = imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img, round($y / 3), 0, $color);
}
imagepng($img,'./17.png');
?>
直接运行脚本
将得到的图片上传,传参

pass 18

这里无论文件是什么后缀名,先上传到服务器,如果后缀名不符合规则, 再用unlink删除,可以利用这个时间差进行条件竞争
payload <?php fputs(fopen('phpinfo.php','w'),'<?php phpinfo();?>');
?>
该payload会在upload目录下生成一个phpinfo.php文件
在bp中设置为一直上传

浏览器访问phpinfo.php

成功访问
pass19
同前关类似,不过是图片马的条件竞争
参考文章 https://blog.csdn.net/MCTSOG/article/details/123342344
浙公网安备 33010602011771号