CTFHUB-技能树-Web题-文件上传(前端验证—MIME绕过、00截断、00截断-双写后缀)

文章讲述了在Web开发中,前端验证如何被MIME绕过,包括00截断和双写后缀的技巧,展示了通过修改Content-Type、利用C语言解析特性以及绕过黑名单策略来上传恶意文件的过程。通过实例解析和工具使用,详细展示了攻击者如何利用这些漏洞获取控制权。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CTFHUB-技能树-Web题-文件上传(前端验证—MIME绕过、00截断、00截断-双写后缀)

前端验证—MIME绕过
有关MIME

web服务器使用MIME来说明发送数据的种类, web客户端使用MIME来说明希望接收到的数据种类

MIME的作用

使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件。

简单来说就是一种校验机制,当文件进行上传的时候对文件的Content-Type进行校验,如果是白名单中所允许的类型则能够成功上传,如果不是则无法上传。

解题时有很多种思路

方法一

直接上传木马文件,把mime类型改为前端可验证的

方法二

也就是直接传入前端可验证文件,抓包修改为PHP脚本文件

题目解析

既然是Content-Type验证,就需要进行抓包

依旧上传php一句话木马文件,并抓包

这里,修改Content-Type字段的值为image/jpeg(也可以是别类型)

在这里插入图片描述

放包,发现上传成功
在这里插入图片描述

访问一下,发现执行成功
在这里插入图片描述

用蚁剑进行连接,寻找flag即可

在这里插入图片描述

html中发现flag

在这里插入图片描述

MIME绕过—00截断
关于00截断

截断原理:
0x00是字符串的结束标识符,攻击者可以利用手动添加字符串标识符的方式来将后面的内容进行截断,而后面的内容又可以帮助我们绕过检测。
00截断的限制条件:
PHP<5.3.29,且GPC关闭

参考链接:http://www.admintony.com/%E5%85%B3%E4%BA%8E%E4%B8%8A%E4%BC%A0%E4%B8%AD%E7%9A%8400%E6%88%AA%E6%96%AD%E5%88%86%E6%9E%90.html
00截断有限制,php版本得低于5.3,并且GPC得关闭,一般在url上。
两种方法,%00和0x00,后台读取是遇到%00就会停止。
举个例子,url中输入的是upload/post.php%00.jpg,那么后台读取到是upload/post.php,就实现了绕后目的。
————————————————
参考链接:https://blog.youkuaiyun.com/m0_52432374/article/details/113850458

00截断简单来说,就是由于php解释器是由C语言编写的,所以遵循C语言解析文件时遇到ascll码0时停止解析,而%00表示ascll码中的0,所以php解释器在解析文件时遇到%00就会默认文件名已经解析结束,所以我们可以利用这一原理进行上传。

题目解析

这里直接上传php一句话木马文件,不可行,显示文件类型不匹配

在这里插入图片描述

查看源代码发现,设置了白名单

在这里插入图片描述

根据提示,我们使用00截断进行绕过。

首先使用bp抓包

我们找到文件名,在文件名后面,在POST请求后面,都加上我们的截断(让他后面的代码不在执行。),1.php%00;.jpg

在这里插入图片描述

放包,上传成功

在这里插入图片描述

虽然这次页面没有提示我们的文件存放在哪里,但是根据之前的题目。我们可以判断出我们上传的文件摆放在upload目录下面。我们直接访问/upload/1.php,发现代码执行成功

在这里插入图片描述

然后我们使用蚁剑进行连接一句话木马,寻找flag

在这里插入图片描述

MIME绕过—00截断-双写后缀
关于双写

双写后缀绕过,这里适用于前后端都对文件的扩展名做了限制。我们可以通过双写文件的扩展名,达到绕过的目的。例如:xxx.php=>xxx.pphphp.

用于只将文件后缀名,例如"php"字符串过滤的场合; 
例如:上传时将Burpsuite截获的数据包中文件名【evil.php】改为【evil.pphphp】,那么过滤了第一个"php"字符串"后,开头的'p'和结尾的'hp'就组合又形成了【php】。
题目解析

先规矩的上传一个php文件,发现上传成功

在这里插入图片描述

但文件后缀名被过滤了(原先我的文件名字是1.php)

查看源代码,发现使用了黑名单机制

在这里插入图片描述

如果是文件名被过滤,我们就可以直接利用双写来绕过。我们回到我们的文件,将后缀进行两次写入,使用双写后缀绕过。

两种方法:

在上传前,将后缀名改为pphphp

在上传时,用bp抓包,将filename文件名改为1.pphphp

注意,双写一定要在php里面在写一个php,不能两个php连着写,不然两个php都会被识别,两个都会被过滤掉

这里使用bp抓包的方法

将filename文件名改为1.pphphp

在这里插入图片描述

放包,上传成功

在这里插入图片描述

访问,发现代码执行

在这里插入图片描述

使用蚁剑连接,寻找flag

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

### 什么是00截断及其安全漏洞 #### 基本概念 00截断是一种常见的Web安全漏洞利用技术,主要发生在文件上传过程中。当服务器解析文件名或文件内容时遇到`NULL`字符(即`\x00`),可能会错误地将其视为字符串结束标志,从而忽略后续的内容[^3]。 #### POST方式下的00截断绕过 在POST请求中实现00截断绕过的原理在于,在提交的文件名字段中插入一个`%00`字符。由于某些编程语言或框架会将此字符解释为字符串终止符,因此服务器可能只处理到该字符之前的部分,而忽略了实际的扩展名或其他验证逻辑。例如,如果原始文件名为`test.php.jpg`并附加了`%00`,则最终保存的文件可能是`test.php`,允许执行恶意脚本[^1]。 以下是使用Burp Suite工具进行数据抓包与改包的一个简单示例: ```http POST /upload HTTP/1.1 Host: example.com Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="file"; filename="test.php.jpg%00" Content-Type: image/jpeg <?php echo shell_exec($_GET['cmd']); ?> ------WebKitFormBoundary7MA4YWxkTrZu0gW-- ``` #### GET方式下的00截断绕过 对于GET请求中的00截断,则通常涉及URL参数传递的情况。攻击者可以通过构造特殊的请求路径或者查询字符串来嵌入`%00`字符,试图欺骗应用程序接受非法输入作为合法资源访问的一部分[^2]。 同样以Burp为例展示如何操作此类场景: ```http GET http://example.com/upload?filename=test.php.jpg%00 HTTP/1.1 Host: example.com ``` 这里假设服务端未正确过滤掉百分号编码形式的零字节(`%00`),那么即使前端做了初步校验也可能失败。 #### 防御措施建议 为了防止因00截断引发的安全隐患,可以从以下几个方面着手加强保护机制: - **严格检查上传文件的名字**:移除任何不必要的特殊字符包括但不限于空格、反斜杠以及最重要的null byte(\x00)[^1]. - **限定可接收的MIME类型** 和 扩展列表 :仅允许特定类型的文档被上载至服务器目录下 [^2]. - 使用专门设计用于抵御各种注入威胁的技术手段比如白名单匹配算法而非黑名单排除法;另外考虑部署额外层如云防火墙(Cloud WAF) 来拦截可疑流量模式 .
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

python炒粉

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

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

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

打赏作者

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

抵扣说明:

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

余额充值