当前位置: 首页 > news >正文

upload-labs通关练习---更新到15关

目录

环境搭建

第一关

方法一 修改文件类型

方法二 前端禁用JS绕过

第二关

方法一 修改Content-Type类型

方法二 修改上传文件类型

第三关

第四关

第五关

方法一 Windows大小写绕过

方法二 利用.user.ini

第六关

第七关

第八关

第九关

第十关

第十一关

第十二关

第十三关

第十四关

第十五关


环境搭建

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

靶场链接:https://github.com/c0ny1/upload-labs/releases/tag/0.1

具体搭建参考过程如所示:https://blog.csdn.net/2302_80946742/article/details/137714313?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-137714313-blog-135903159.235^v43^pc_blog_bottom_relevance_base5&spm=1001.2101.3001.4242.1&utm_relevant_index=3

第一关

方法一 修改文件类型

该关卡是通过前端验证,前端验证通过之后再上传文件,上传文件的过程不进行过滤。所以我们可以先将PHP文件改为PNG,绕过前端JS验证,通过之后使用BurpSuite抓取上传文件的数据包,并将文件类型改为PHP继续上传。

先准备一句话木马如下,文件类型PNG

此后尝试上传文件,并且通过后台BurpSuite抓取上传文件的数据包,并将其进行修改。

对回显的图片右键可以获取图片地址,之后可以通过一些链接工具进行连接测试。由于是在本地搭建,通过查看路径发现文件已经上传成功。

方法二 前端禁用JS绕过

在游览器按F12打开页面审查,找到设置里面Disable JavaScript点击禁用。之后就可以上传PHP文件。

第二关

MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。

MIME 的组成结构非常简单,由类型与子类型两个字符串中间用 / 分隔而组成,不允许有空格。type 表示可以被分多个子类的独立类别,subtype 表示细分后的每个类型。MIME类型对大小写不敏感,但是传统写法都是小写。

这一关不再进行前端验证,通过查看提供的源码,我们发现他是一个在服务端对数据包的MIME进行验证,并且发现只对文件的Content-Type类型有限制:`if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {`:检查上传的文件是否为 JPEG、PNG 或 GIF 格式的图像文件。如果不是这些格式,会提示用户文件类型不正确并要求重新上传。

方法一 修改Content-Type类型

我们可以上传PHP文件,之后通过BurpSuite抓取上传文件的数据包,将Content-Type类型改为image/jpeg、image/png、image/gif(三种任选其一),重新发包。

方法二 修改上传文件类型

我们可以上传图片文件,之后通过BurpSuite抓取上传文件的数据包,将文件的后缀改为PHP即可。

第三关

通过直接上传PHP文件返回发现会提示黑名单,即扩展名检测机制,后端利用$_FILES()和strrchr()获取文件名后缀。由于是黑名单限制且名单不完整,其实可以采用一些方法绕过。比如在某些特定环境中某些特殊后缀仍会被当作php文件解析的扩展名有:php、php2、php3、php4、php5、php6、php7、pht、phtm、phtml

通过分析源代码我们发现,代码修改了文件名称,生成一个新的文件路径,包括上传路径、当前时间戳和随机数以及文件后缀,以确保文件名的唯一性。但是由于可以直接在前端获取文件名称,所以这一步并没有对后续操作进行限制。

第四关

通过直接上传PHP文件返回发现会提示黑名单,即扩展名检测机制,和第三关不一样的是基本上限制了所有可用的文件类型。但是还有一种文件类型可以利用,即.htaccess文件。

.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。.htaccess主要的作用有:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。.htaccess的用途范围主要针对当前目录。并且该文件的优先级比较高,甚至高于Apache的主要配置文件(httpd-conf)

创建.htaccess文件代码如下,这个代码的作用是,如果当前目录下有.png的文件,就会被解析为.php,成功上传。

<FilesMatch ".png">
SetHandler application/x-httpd-php
</FilesMatch>

再上传一个一句话木马,文件名为 test.png,依旧访问 test.png,但其会以 PHP形式显示

第五关

通过查看源码发现依然是黑名单过滤,但是过滤的文件类型更加齐全,不能使用.htaccess文件。由于本机环境是在Windows下进行的,所以此时就可以尝试使用大小写绕过限制上传文件,或者是使用`.user.ini配置文件。

方法一 Windows大小写绕过

通过分析源码发现和之前几关相比,少了一段代码$file_ext = strtolower($file_ext); //转换为小写在这行代码中,strtolower函数被用于将变量$file_ext所包含的字符串转化为全小写。所以可以修改PHP文件的后缀大小写从而实现绕过。大小写绕过原理:

 Windows系统下,对于文件名中的大小写不敏感。例如:test.php和test.PHP是一样的。Linux系统下,对于文件名中的大小写敏感。例如:test.php和 test.PHP就是不一样的。

方法二 利用.user.ini

它比.htaccess 用的更广,不管服务器是 nginx/apache/IIS,当使用 CGI/FastCGI 来解析 php 时,php 会优先搜索目录下所有的.ini 文件,并应用其中的配置。作用:特定用于用户或者特定目录的配置文件,通常位于Web应用程序的根目录下。类似于 apache 的.htaccess,但语法与.htacces 不同,语法跟php.ini一致,并且.user.ini先级较高。内容如下:auto_prepend_file=test.png

再上传一个内容为 php 一句话脚本,命名为 test.png。.user.ini文件作用:所有的 php 文件都自动包含 test.png文件。.user.ini相当于一个用户自定义的 php.ini。但是由于当前环境不符合该条件,所以该方法不能进行测试。

注意应用前提是:

  • 版本选择最好大于5.3.0,最好是7.x的版本;

  • 并且Server API 为CGI/FastCGI;

  • .user.ini可以生效,并且该目录下有PHP文件;

第六关

分析源代码我们发现,相比于之前的代码,次出少了部分内容$file_ext = trim($file_ext); //首尾去空并没有对文件后缀名进行首尾去空的操作。这一行代码使用了PHP的trim函数对变量$file_ext所存储的字符串进行处理。trim函数的作用是去除字符串首尾的空白字符(包括空格、换行符、制表符等),所以这里可以通过对文件后缀名末尾进行添加空格的方式来进行绕过。

Windows 系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除空格。从而绕过黑名单。

所以可以通过BurpSuite抓取上传文件的数据包,通过在文件名称后面添加空格来绕过判断。

第七关

通过对比前几关的源码,发现少了$file_name = deldot($file_name);//删除文件名末尾的点。该代码主要是去除文件名后面的点。并且windows等系统默认删除文件后缀的.和空格,没有过滤点

因为代码是通过拼接合成文件,使用$file_ext = strrchr($file_name, '.');,通过查找文件名中最后一个点来获取文件后缀。并且之后对文件后缀进行大写转小写。之后随机文件名称 + 修改后的后缀拼接文件名称。所以我们可以通过BurpSuite抓取上传文件的数据包,在filename最后面添加.来将文件名称33.php改为33.php.。此时文件名称为33.php,文件后缀为空。

第八关

通过分析源码,发现与之前相比发现少了对上传的文件后缀名为做去::$DATA 处理的过程,上传到服务器的文件在Windows中会自动去掉::$DATA。

利用Windows特性

  • 在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名。

  • 例如:"phpinfo.php::$DATA"Windows会自动去掉末尾的::$DATA变成"phpinfo.php"

所以可以通过BurpSuite抓取上传文件的数据包,在filename最后面添加::$DATA来绕过检查文件后缀名称。

第九关

通过分析代码发现,将文件名进行过滤操作后,将文件名拼接在路径后面,所以需要绕过前面的首尾去空以及去点。

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");$file_name = trim($_FILES['upload_file']['name']);$file_name = deldot($file_name);//删除文件名末尾的点$file_ext = strrchr($file_name, '.');$file_ext = strtolower($file_ext); //转换为小写$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA$file_ext = trim($file_ext); //首尾去空if (!in_array($file_ext, $deny_ext)) {$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH.'/'.$file_name;if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true;} else {$msg = '上传出错!';}} else {$msg = '此文件类型不允许上传!';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}

代码首先获取文件全称,之后通过deldot函数删除文件末尾出现的点,之后会基于.进行分割获取文件后缀。并且将后缀转小写、去除字符串::$DATA、首位去除空格。完成一系列操作之后会将文件名称存储到upload文件夹下。它只去掉一次空格,举个例:测试.php. . 最后代码执行完后变成 测试.php.。所以可以构建$file_name=33.php,即通过BurpSuite抓取上传文件的数据包,修改文件名称格式为点+php+点+空格+点

第十关

通过分析代码发现$file_name = str_ireplace($deny_ext,"", $file_name);,利用str_ireplace()将文件名中符合黑名单的字符串替换成空。但是只替换了一次,所以可以尝试双写后缀绕过。

注意str_ireplace()函数一下特点:

  • 该函数必须遵循下列规则:

    • 如果搜索的字符串是一个数组,那么它将返回一个数组。

    • 如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换。

    • 如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换

    • 如果是对一个数组进行查找,但只对一个字符串进行替换,那么替代字符串将对所有查找到的值起作用

    注释:该函数不区分大小写。请使用 str_replace()函数来执行区分大小写的搜索。

基于以上规则修改文件类型,将原本33.php,修改为33.pphphp,进行测试。

第十一关

通过分析代码发现$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;:定义上传文件的目标路径,通过获取 URL 参数中的保存路径($_GET['save_path']),并结合随机数、当前时间戳和文件后缀名生成唯一的文件名,所以可以通过控制文件路径,将其截断,将图片中的PHP代码存入其中。

通过BurpSuite抓取上传文件的数据包,修改设置save_path参数内容为upload/test.php%00 ,添加test.php%00内容为了控制路径,上传文件后缀为白名单即可,上传一个文件后缀问白名单中的后缀的PHP文件。保存后为/upload/test.php%00*****.png,但服务端读取到%00时会自动结束,将文件内容保存至test.php中。

PS:需要 php 的版本号低于 5.3.29,且 magic_quotes_gpc 为关闭状态。

第十二关

该关卡依然使用白名单限制上传文件类型,但上传文件的存放路径可控,但因为是 POST 型,需要在 16 进制中修改,因为 POST 不会像 GET 那样对%00 进行自动解码。

第十三关

分析代码getReailFileType()函数

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){...}:根据文件类型代码判断文件类型,并设置相应的文件类型字符串。
return $fileType;:返回文件类型。

通过读文件的前 2 个字节,检测上传文件二进制的头信息,判断文件类型,利用010 Editor变写图片内容为一句话木马从而绕过检测。并且后端会根据判断得到的文件类型重命名上传文件,之后通过文件包含漏洞进行连接。

常见图片文件二进制:Png图片文件包括8字节:89 50 4E 47 0D 0A 1A 0A。即为 .PNGJpg图片文件包括2字节:FF D8。Gif图片文件包括6字节:47 49 46 38 39|37 61 。即为 GIF89(7)a。Bmp图片文件包括2字节:42 4D。即为 BM

可以使用010 Editor查看图片马的内容

将这个文件上传到服务器之后,通过利用文件包含漏洞去包含这个图片文件以便于执行PHP代码。

第十四关

通过分析代码发现,代码首先定义了允许的图像文件类型扩展名的字符串 $types。然后通过 file_exists 函数检查文件是否存在。如果存在,使用 getimagesize 函数获取文件的图像相关信息(如宽度、高度、图像类型等),接着通过 image_type_to_extension 函数将获取到的图像类型转换为对应的文件扩展名。最后通过 stripos 函数检查转换后的扩展名是否在允许的类型字符串中,如果是则返回该扩展名,否则返回 false。如果文件不存在,也直接返回 false

图片马可以通过cmd直接制作命令格式为:copy logo.jpg/b+test.php/a test.pnglogo.jpg为任意图片;test.php 插入的木马文件;test.jpg 生成的图片木马

之后在网页直接上传文件,利用文件包含漏洞进行包含图片,并且通过蚁剑连接。

第十五关

分析代码发现与之前的相比exif_imagetype()读取一个图像的第一个字节并检查其后缀名。返回值与getimage()函数返回的索引2相同,但是速度比getimage快,并且判断更加严格。


http://www.mrgr.cn/news/71212.html

相关文章:

  • Unity解决滑动条的value值的滑动条消失问题
  • Qt 自动根据编译的dll或exe 将相关dll文件复制到目标文件夹
  • 《基于卷积神经网络的星图弱小目标检测》论文精读
  • 局域网共享文件夹实现两台Windows电脑之间传输文件
  • rtthread学习笔记系列--18 信号 SIGNAL
  • IntelliJ IDEA 优化设置
  • 【Conda】Windows下conda的安装并在终端运行
  • 第三百二十节 Java线程教程 - Java线程中断、Java Volatile变量
  • 3349、检测相邻递增子数组 Ⅰ
  • golang如何实现sse
  • 一文熟悉redis安装和字符串基本操作
  • 37 string类关键函数的模拟实现
  • 【网络安全渗透测试零基础入门】之Vulnhub靶场PWNOS: 2.0 多种渗透方法,收藏这一篇就够了!
  • FAS在数据库环境中应用详解
  • 逻辑数据编织平台现代企业数据管理和分析的理想选择
  • SQL面试题——奔驰面试题
  • 创业铁盘论
  • 超级计算机挑战人类智力,谁才是最后赢家?
  • 发社交动态,小心它泄露了你的隐私——不只是地理位置,还有眼神中倒影成像
  • 百度世界2024:AI应用的浪潮时刻
  • Docker--Docker是什么和对Docker的了解
  • 为什么管道符|无法写入txt
  • 【GPTs】Email Responder Pro:高效生成专业回复邮件
  • 局域网桥接只能单向ping问题,arp无法建立
  • 【缓存策略】你知道 Write Through(直写)这个缓存策略吗?
  • 1.vue环境搭建