前言

我们知道对靶机的渗透可以提高自己对知识的掌握能力,这篇文章就对上传靶机upload-labs做一个全面的思路分析,一共21个关卡。让我们开始吧,之前也写过关于上传的专题,分别为浅谈文件上传漏洞(客户端JS检测绕过)

浅谈文件上传漏洞(其他方式绕过总结)

靶机环境搭建

Upload-Labs 环境要求

操作系统:windows、Linux

php版本:推荐5.2.17(其它版本可能会导致部分Pass无法突破)

php组件:php_gd2,php_exif(部分Pass需要开启这两个扩展)

apache:以moudel方式连接

项目地址:https://github.com/c0ny1/upload-labs

直接使用phpstudy搭建,将下载的文件放在对应的根目录即可。访问如下:

解题思路

pass-01

首先看第一关,查看提示和源码,发现是前端JS验证,而我们知道,前端验证,有和没有基本一样。



绕过也非常简单,可以浏览器直接禁用JS,先按F12,然后按F1,找到禁用JS,如下图:



然后直接上传php木马。结果如下:



这是一种方法,当然也可以直接burp抓包,修改后缀直接上传。

pass-02

看第二关,首先分析源码



分析代码,发现只是检查了content-type类型,这个也是很好绕过的,直接抓取数据包,修改类型就可以了。抓的数据包如下:



将类型改为image/jpeg,直接上传PHP木马,结果如下



木马上传成功。

pass-03

看第三关,分析源码



发现第三关是基于黑名单防护,不允许上传'.asp','.aspx','.php','.jsp'后缀的文件,这个黑名单是不全的,比如可以尝试上传.phtml .phps .php5 .pht的后缀文件,也是可以当做php脚本解析的,如果Web服务器是apache的话,也可以上传.htaccess文件,来绕过黑名单。首先尝试上传.phtml,发现上传成功,再响应包中找到上传路径。这里要注意一下,要在apache的httpd.conf中有如下配置代码

AddType application/x-httpd-php .php .phtml .phps .php5 .pht

pass-04

看第四关,分析源码



发现这里黑名单基本过滤了后缀,但是,没有.htaccess,可以上传.htaccess文件,来达到解析脚本的目的。也可以用另外的一种方法,看代码6到10行,这里是对文件后缀的一些处理,包括删除结尾的点,删除空格,全都转换成小写等,然而这么处理肯定有想不到的地方,比如构造后缀.php. .中间是一个空格(后面的第八关和第十关是同样的思路),即达到了绕过黑名单,又经过检查使得脚本木马可以解析。如下图:



访问脚本木马,成功解析

pass-05

第五关和第四关一样,只是黑名单里添加了.htaccess,所以只能使用构造后缀的方式了,四关的方法五官通用,所以这里就不详细赘述了。

pass-06

看第六关,分析源码



看第5至10行,里面的过滤没有限制大小写,所以可以尝试大小写组合绕过。比如.pHP等。尝试上传,如下图:



上传成功,脚本木马成功解析:

pass-07

看第七关,分析源码:



通过观察源码,发现没有对空格进行处理,可以直接在末尾添加空格来绕过黑名单。如下:



上传成功,成功解析。

pass-08

看第八关,分析源码:



这里的黑名单限制了所有可以解析的后缀,所以只能构造特殊后缀来绕过防护,这里去除了空格,并用strrchr函数查找指定小黑点最后一次出现,所以构造的后缀为.php. (点php点加空格),成功绕过,如下图:



上传成功,成功解析。

pass-09

看第九关,分析源码:



看第5行到第10行,源码中未过滤::$DATA,可以利用::$DATA来绕过过滤,到这里小伙伴可能就要问了,为什么::$DATA可以绕过黑名单呢?这其实是利用了windows的特性,在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名。例如:"test.php::$DATA"Windows会自动去掉末尾的::$DATA变成"test.php"。

现在抓取数据包验证。上传成功,如下图。



上传成功,成功解析。

pass-10

看第十关,分析源码



这一关和第八关类似,就比第八关多了一行,多删除了一个点,所以还是采用构造后缀的方式,这次构造的后缀为.php. .(点php点空格点)正好绕过过滤。

构造好后,上传成功



解析成功

pass-11

看第十一关,分析源码



这里的重点在第八行,这里使用了str_ireplace函数将匹配到的字符替换为空,所以绕过思路就很简单了,只需要双写就可以了,删除字符后,剩余的又重新拼接为后缀,达到绕过的目的,抓取数据包测试如下,上传成功。



访问,解析成功。

pass-12

看十二关,分析源码



分析源码我们可以知道,这里是基于白名单过滤,只允许上传'jpg','png','gif',但是这里注意第八行,上传路径是可以控制的,所以可以利用%00截断,来达到上传木马的目的。这里要注意一下,%00截断想要利用成功,php版本小于5.3.4(高版本php官方修复了这个漏洞),php的magic_quotes_gpc为OFF状态。抓取数据包,进行尝试,如下图:



访问,解析成功

pass-13

看十三关,分析源码



同样是白名单,也是上传位置可控,不过是由GET传输变为POST,还是利用%00截断。不过因为POST不会进行自动解码,所以要自己在16进制中进行修改,如下图:





上传成功,解析成功

pass-14

第十四关是上传图片马,配合解析漏洞



分析代码

function getReailFileType($filename){
$file = fopen($filename, "rb");
$bin = fread($file, 2); //只读2字节
fclose($file);
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
$fileType = '';
switch($typeCode){
case 255216:
$fileType = 'jpg';
break;
case 13780:
$fileType = 'png';
break;
case 7173:
$fileType = 'gif';
break;
default:
$fileType = 'unknown';
}
return $fileType;
} $is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_type = getReailFileType($temp_file); if($file_type == 'unknown'){
$msg = "文件未知,上传失败!";
}else{
$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上传出错!";
}
}
}

下面是文件包含的代码

include.php
<?php
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
include $file;
}else{
show_source(__file__);
}
?>

分析代码可以知道它只读2字节,只需要将木马后缀改为图片格式,内容加个图片头部,然后在返回包中找到路径,然后写在file参数后,因为file参数include的原因都会直接执行。如下:



长传成功,配合文件包含漏洞解析图片格式的木马。

pass-15

先看源码:



这里使用getimagesize()函数来验证是否是图片,这里说一下getimagesize(),这个函数功能会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求的。getimagesize()返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题。是可以被绕过的,因为图片头可以被伪造。这里伪造gif的图片头,来进行上传,如下



图片木马上传成功。

pass-16

这一关需要开启php_exif



看源码



这里使用exif_imagetype函数来检查是否是图片,这里说一下exif_imagetype(),它是读取一个图像的第一个字节并检查其签名。所以也是可以通过伪造图片头来进行绕过的。这里同样伪造gif的图片头,来进行上传,如下



上传成功

pass-17

看源码



这一关比较综合,判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染。还是按照第16关的思路走一下,看是否成功。显然失败了。



那就做一个图片木马,上传一个正常图片,抓取数据包,在图片末尾插入恶意代码,如下:



然后,进行上传操作。上传成功,如下。



因为这里进行了二次渲染,所以还没有结束,我们将上传的图片下载到本地查看。



这里发现在进行二次渲染的过程中,我们插入到图片的恶意代码被清理掉了,所以需要对比渲染前后,哪些地方没有变化,我们将恶意代码插入到那里,来绕过二次渲染。对比发现,这里渲染前后没有发生变化。



所以,我将恶意代码插入到这里,如下图:



重新上传,上传成功,再次下载到本地,发现恶意代码没有被清除,绕过了二次渲染。

pass-18

看源码



这里的代码逻辑是先将文件上传到服务器,然后判断文件后缀是否在白名单里,如果在则重命名,否则删除。这样就存在一个安全问题,那就是我同时上传多个相同文件,在它删除之前访问就可以了。也就是条件竞争问题。可以借助burp的暴力破解模块。这里复现失败了=_="。

pass-19

这里同样存在条件竞争问题,不过就是需要换成图片木马。其他和第十八关一样。

pass-20

看源码



这里发现move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过,和前面关卡的00截断类似。如下:



上传成功。

pass-21

看源码



说实话,这个代码看的我有点懵。参考网上文章一点点分析吧,首先第五行以白名单的形式检查MIME这个可以直接在数据包中修改,然后向下分析,到第十行,这里的含义是如果POST接收的save_name值为空则赋值给$_FILES['upload_file']['name'],否则是本身。接着是用explode() 函数把字符串打散为数组,然后解释一下下面涉及到的函数的含义。

end()函数将 array的内部指针移动到最后一个单元并返回其值

reset()函数将 array 的内部指针倒回到第一个单元并返回第一个数组单元的值

count() 函数计算数组中的单元数目或对象中的属性个数,这里要注意,数组下标从0开始

然后这里用end函数将接收的后缀与白名单比较,如果符合,继续执行,然后数组第一位和$file[count($file) - 1]进行拼接,产生保存文件名file_name。

所以这里采用数组绕过,save_name[0]=pass21.php, save_name[2]=jpg,$ext=jpg过白名单,reset($file)=pass21.php

$file[1]=null,这样就成功上传pass21.php.(windows多个点不影响)

抓包测试。上传成功。

结语

这篇文章对于upload-labs靶场进行了全通关思路讲解,如有错误请斧正。

上传靶机实战之upload-labs解题的更多相关文章

  1. 3. 文件上传靶机实战(附靶机跟writeup)

    upload-labs 一个帮你总结所有类型的上传漏洞的靶场 文件上传靶机下载地址:https://github.com/c0ny1/upload-labs   运行环境 操作系统:推荐windows ...

  2. FastDFS实现文件上传下载实战

    正好,淘淘商城讲这一块的时候,我又想起来当时老徐让我写过一个关于实现FastDFS实现文件上传下载的使用文档,当时结合我们的ITOO的视频系统和毕业论文系统,整理了一下,有根据网上查到的知识,总结了一 ...

  3. 上传系列:jquery.upload.js

    最近想做一个上传的总结,把自己用过的上传插件都写一写,哪天用到的时候就不用再一次的翻阅资料,现在页面上用到的上传插件,原理上都差不多,那我也就不再废话了,下面我主要记录一下几个比较常用的,由简到繁,这 ...

  4. WEB文件上传之apache common upload使用(一)

    文件上传一个经常用到的功能,它有许多中实现的方案. 页面表单 + RFC1897规范 + http协议上传 页面控件(flash/html5/activeX/applet) + RFC1897规范 + ...

  5. 文件上传靶机DVWA和upload-labs

    DVWA靶机 LOW <?php phpinfo() ?> 上传文件 Medium级别 修改Content-Type: application/octet-stream的值为jpg的格式为 ...

  6. ASP.NET 文件上传的实现(Upload)

    1.最近应项目开发的需求要实现附件的异步上传和下载. 2.上传:文件上传到指定的路径下,并返回上传文件的信息给前端界面,如:文件的图标.上传的文件名.文件的大小. 3.上传后,在前端界面上显示上传的文 ...

  7. Spring Boot 使用 ServletFileUpload上传文件失败,upload.parseRequest(request)为空

    使用Apache Commons FileUpload组件上传文件时总是返回null,调试发现ServletFileUpload对象为空,在Spring Boot中有默认的文件上传组件,在使用Serv ...

  8. Tomcat put上传漏洞_CVE2017-12615( JSP Upload Bypass/Remote Code Execution)

    CVE2017-12615漏洞复现( tomcat JSP Upload Bypass /Remote Code Execution) 一.漏洞原理 在windows服务器下,将readonly参数设 ...

  9. [PHP学习教程 - 文件]002.修改上传文件大小限制(File Upload Limit)

    引言:通常大家直装xampp之后,默认的文件上传大小应该被设定成2M左右,这个时候如果上传超过2M的东西,就会报错,让人非常尴尬.如何修改呢? 导航索引: 概念 FTP常用API FTP封装类 其他 ...

随机推荐

  1. Day01_12_Java的类型转换

    Java类型转换 实例 public class 类型转换 { public static void main(String[] args) { int i =128; byte b= (byte) ...

  2. @valid和自定义异常

    @valid和自定义异常 问题的产生: 当有很多参数需要校验时,比如name,age,email等很多参数都需要判空,或者有长度限制时,如果后端写很多if-else就有很多代码,不美观,不优雅.前端每 ...

  3. 三维 WebGIS 新玩具:OpenGlobus

    代码仓库地址:https://github.com/openglobus/openglobus 原创.@秋意正寒 目录 1 简介 2 HelloGlobus 3 在 Vite 中与 vue3 集成 4 ...

  4. 033- while循环语句

    语法 初始化语句; while(boolean表达式) { 循环体语句; 控制条件语句; } 执行过程: 只要boolean表达式里面的结果是true,就会执行while大括号里面的语句,直到bool ...

  5. *arg和**kwarg的区别

    一.*args的使用方法 *args 用来将参数打包成tuple给函数体调用 例子一: def function(*args): print(args, type(args)) function(1) ...

  6. 绕过网站WAF(图片绕过)

    当我们在渗透一个网站的时候,很多时候,会遇到下面这种情况.网站装有WAF,把我们的SQL注入语句给拦截了. 这就是网站的安全狗 此时,我们的渗透会陷入僵局.到底应该如何才能让我们的语句绕过安全狗的检查 ...

  7. HellowWorld详解

    1.随便新建一个文件夹,存放代码 2.在文件夹中新建一个Java文件 新建一个.txt文本文档-->将扩展名.txt修改为.java 注:如果创建的文本文档没有显示扩展名,则有如下方法: 方法一 ...

  8. 使用花生壳、瑞友天翼远程访问金蝶K3

    金蝶版本号 WISE15.1 瑞友6.0系列 花生壳5 金蝶软件无法通过外网直接访问 因此需要使用瑞友天翼来实现远程访问 一般来说 金蝶服务器固定了IP地址以后 通过路由器开房两个外网端口即可实现瑞友 ...

  9. Docker 部署net5程序

    1.前言 本文讲述使用docker容器部署.net5项目.实现跨平台. 部署环境:docker 容器.liunx系统.这里采用VmWare虚拟机.并采用MobaXterm工具实现终端连接linux系统 ...

  10. IntelliJ IDEA 老司机,还没用过 Stream Trace 功能?

    前言 自从 Java 8 开始,作为程序员的我们都离不开 Stream 相关功能的使用,书写起来那叫一个流畅(这个 feel--).但总是有一些时候,我们对 stream 的操作所要的结果和预期不符, ...