点我

概述

upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在
帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式

下载地址:链接:https://pan.baidu.com/s/1Xz4u-zBcL98GboExGBT3rA?pwd=8ylh
提取码:8ylh

环境安装

将下载后的文件进行解压,放在www目录下,访问即可

null

事先准备

先准备一个123.php文件

null

Pass-01(前端校验)

当直接上传php文件时,页面进行了弹窗

null

第一种方法:浏览器禁止JS
1.对于chrome浏览器,设置--隐私设置和安全性--JavaScript

null

2.刷新页面,上传123.php文件

null

3.复制图片地址进行打开

null

第二种方法:通过抓包工具Burp,通过改后缀名的形式
1.将123.php文件修改后缀为123.jpg,即修改为允许上传的后缀名

null

2.将123.jpg修改为123.php即可

null

3.复制图片地址进行访问

null

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文件,提示为文件类型不正确

null

2.通过Burp抓取123.php的上传流量
null

3.将Content-Type类型修改为jpg文件类型
null

4.上传成功,访问图片地址
null

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后缀文件
null

2.将.php后缀修改为.php5后缀
null

3.上传成功,访问图片地址
null

提示信息
当上传的phtml没有解析时
在phpstudy中,其他选项菜单--打开配置文件--http-conf
null

将#号去掉,就可以解析phtml文件为php文件,如果想解析php3后缀文件,在后面添加即可
null

Pass-04(.htaccess文件)
知识点
.htaccess文件-->分布式配置文件
提供了针对目录改变配置的方法,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作
用于次目录及其所有子目录
.htaccess的功能:
可帮助我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封
禁特定IP地址的用户、禁止目录列表等一些功能

1.将下列指令写入txt中

AddType application/x-httpd-php .jpg
指令表示 .jpg文件会当做php来解析

利用cmd进行重命名为.htaccess
null

2.先上传.htaccess文件
null

3.将木马文件的php后缀修改为jpg后缀,进行上传,打开图片
null

Pass-05(大小写)

从给出的提示来讲,过滤了很多后缀,但是仔细观察没有过滤PHP
null
故修改文件后缀PHP,上传

null

null

Pass-06(空格)

通过观察源代码,文件上传后的大致流程为:
获取上传的文件名
删除文件名末尾的.
返回最后一次小数点出现的位置到字符串结束之间的字符
转换大小写
去除字符串::$DATA

故可以构造payload

a.php+空格
a.php+空格=>.php+空格
对于黑名单而言 a.php+空格与a.php是不一样的
但对于Windows,a.php+空格与a.php是一样的

1.上传php文件后通过burp抓包,在后缀php后面添加一个空格
null

2.访问图片地址
null

Pass-07(点)

利用strrchr()函数绕过,strrchr()函数:查找字符串在另一个字符串中最后一次出现的位置,并返回从该
位置到字符串结尾的所有字符。

1.上传php木马文件,抓包将php文件后缀处多加一个.
null

2.访问图片地址
null

Pass-08(::$DATA)

1.::$DATA Windows文件流
对于Windows而言
a.php 与a.php::$DATA 是一样的
但是对于黑名单检测来讲是不一样的

2.将PHP上传,抓包修改php文件后缀
null

3.访问图片地址后显示403
null

4.将文件后缀名::$DATA后缀删除即可
null

Pass-09(点空格点)

1.关键函数
null

大致流程

获取上传文件名
删除文件名末尾的点
返回最后一次点出现的位置到字符串结束之间的字符串
转换为小写
去除字符串::$DATA
首尾去空

构造payload

构造函数名:a.php.空格.
删除文件名末尾的点:a.php.空格
返回最后一次点出现的位置:.空格
转换小写、去除::$DATA、首尾去空: .
最后文件名为a.php.  在Windows中,文件名最后的点可以被自动忽略

2.上传文件,修改文件后缀名
null
3.访问上传后的图片地址即可

Pass-10(双写)

1.主要利用点为str_ireplace() 函数
str_ireplace() 函数:替换字符串中的一些字符(不区分大小写)
null

如果上传文件名中出现了黑名单中的后缀名就会将后缀名替换为空

2.构造payload:.phphpp --> .php

3.抓取上传的数据包,修改上传后的文件后缀名
null

4.访问上传后的图片地址
null

Pass-11(%00截断)

环境准备
php版本低于必须为5.2.x
php.ini配置中magic_quotes_gpc = Of

关键代码
null

函数:
strrpos():查找字符串在另一字符串中最后一次出现的位置
substr():返回字符串的一部分,substr(string,start,length)
in_array():搜索数组中是否存在指定的值

['name'],".")+1); //获取上传文件名的后缀名

代码大致流程:

截取上传文件的后缀名,如果符合ext_arr数组,将会把文件移动到指定目录并且进行重命名操作,如果文件的后缀名不再ext_arr数组中,会提示上传失败

url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时
就会认为读取已结束
1.抓取数据包
null

2.访问图片链接
null

3.直接访问456.php也可以
null

Pass-12(%00截断)

与Pass11大致相同,只不过是GET传参,改为了POST
URL编码==》16进制编码
GET会对URL编码(16进制)进行解码
POST并不会对16进制进行解码
可以使用burp抓包工具改16进制

1.抓取文件上传包
null

2.在Hex中修改a的16进制为00
null

3.修改后
null

4.访问图片地址
null

Pass-13(图片马)

图片马:一句话木马和图片 结合在一起

1.制作图片马
cmd命令:
null

2.以16进制方式打开890.jpg,翻到最后面
null

注意:由于图片马的使用场景问题,故只要我们上传的图片马上传成功,下载到本地后,一句话木马依
然存在,则算通关

3.上传图片马,上传成功
null

4.下载到本地Hex查看,图片马存在
null

.png-xbxaq.com/.gif的制作方式和jpg相同

Pass-14(getimagesize)

关键代码
null

getimagesize获取图像信息
1.使用上一关的图片马进行上传
null

2.关键代码
null

3.使用png-xbxaq.com图片马
null

4.上传成功
null

5.下载到本地查看是否还存在一句话木马
null

Pass-15(exif_imagetype)

关键代码
null

exif_imagetype函数:判断一个图像的类型

1.使用上一关的图片马,上传成功
null

2.下载到本地查看是否还存在一句话木马
null

Pass-16(二次渲染)

代码部分
null

二次渲染--后端重写文件内容
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行开始写
null

2.上传成功
null

3.下载图片到本地,查看下载后的hex
null

Pass-17(条件竞争)

1.关键代码
null
大致流程:先上传,再检测,重命名,不符合条件则unlink删除文件

2.先上传普通图片,获取文件路径
null

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文件并且抓取到,放到跑包模式中
null

再抓取访问1.php的包,同样放到burp跑包模式中
null

6.两个数据包同时进行null payload 跑包
null

7.访问成功
null

Pass-18(二次竞争)

关键代码
null

逻辑顺序
1、服务器先将文件与白名单作对比
2、检查大小看文件是否已经存在
3、再进行重命名
保存到重命名之间,会有一段时间差
在这段时间内,文件还是能被访问到的,并被解析执行
于Pass-16相同操作

Pass-19(黑名单检测)

关键函数
null

move_uploaded_file() 函数把上传的文件移动到新位置。
如果成功该函数返回 TRUE,如果失败则返回 FALSE。
对上传的文件,没有任何检测,但对其保存的文件名进行检测
1.构造木马文件321.php

<?php phpinfo();?>

修改后缀为jpg

2.使用.绕过,使用Burp抓取上传的数据包
null

3.访问图片地址
null

Pass-20(白名单检测)

关键代码
null

函数解析

三目运算符:(expr1) ? (expr2) : (expr3); 如果条件expr1 成立,执行expr2,否则执行expr3;
explode() 函数:把字符串打散为数组
end()函数:删除数组中最后一个值
count()函数:统计数组个数
reset()函数:将内部指针指向数组中的第一个元素,并输出

可使用 数组绕过
1.抓取数据包,改包
null

2.上传成功
null

3.访问图片地址
null

分类: 靶机

评论

-- 评论已关闭 --

目录