CTFhub文件头检查 00截断

CTFhub文件头检查 00截断

文件头检查绕过原理及方法

所有的文件都是以二进制的形式进行存储的,本质上没有差别。在每一个文件的开头实际上都有一片区域来显示这个文件的实际用法,这就是文件头标志。

常见的文件头:
注意:下面的文件头的格式是16进制的格式:

GIF:47 49 46 38 39 61
png:89 50 4E 47 0D 0A 1A 0A
JPG:FF D8 FF E0 00 10 4A 46 49 46

文件头检查绕过方法:

第一种: 把上面的文件头添加到我们的一句话木马内容最前面,达到绕过文件头检测的目的。

方法在:【文件上传绕过】——后端检测_文件头检测漏洞_【中核检测】【文件】-CSDN博客

第二种:随便找一张图片,用记事本打开然后在后面拼接一句话木马。

但是这张图片要尽量小一点,不知道为什么同样的操作,比较大的图片一直成功不了。

文件头检查wp

PixPin_2025-03-17_17-08-44

拼接

PixPin_2025-03-17_17-11-42

用010查看可以发现拼接成功了

PixPin_2025-03-17_17-12-58

然后更改后缀,之后的步骤都一样

PixPin_2025-03-17_17-13-44

PixPin_2025-03-17_17-14-08

00截断原理

在PHP 5.2版本中,存在一个严重的漏洞,即00截断漏洞。该漏洞允许恶意用户通过URL参数输入*%00*,导致后续字符被自动忽略,从而绕过文件类型的限制。

漏洞示例

例如,假设我们有一个文件上传功能,要求上传的文件必须是*.jpg格式。攻击者可以上传一个名为shell.php%00.jpg的文件。由于%00在URL编码中表示ASCII码中的空字符(NULL字符),PHP在处理文件名时会将其视为字符串的结束符,从而忽略后面的.jpg*

// 上传的文件名为 shell.php%00.jpg

1
2
3
4
5
$filename = "shell.php%00.jpg";

// PHP 5.2 解析时会将其视为 shell.php

include $filename; // 实际包含的是 shell.php

在上述代码中,PHP会将*$filename解析为shell.php*,从而执行PHP代码,而不是将其视为一个图片文件

00截断wp

上传图片码成功

PixPin_2025-03-18_20-58-01

文件上传成功后只执行了 JavaScript 弹窗 (alert()),但并没有 echo 文件的完整路径,因此浏览器端不会直接看到文件的存储路径

我们直接在蚁剑连接后面添加/upload/3.php(理想中的文件上传路径)连接失败

查看源代码

PixPin_2025-03-17_18-25-21

【CTFHub】文件上传漏洞_00截断_ctfhub00截断-CSDN博客

rand()函数显然是生成了随机数,对文件上传的路径进行了拼接

所以我们在成功上传后还是找不到文件路径已经不是3.php(3.php%00.png),依旧无法连接

思路就是用00截断字符把随机数给截断掉,

PixPin_2025-03-18_21-07-52

用用蚁剑连接这个webshell

PixPin_2025-03-17_18-34-02

(用的第一次做的截图所以显示是2.php)

找到flag

PixPin_2025-03-17_18-34-23


CTFhub文件头检查 00截断
http://example.com/2025/03/18/CTFhub文件头检查-00截断/
作者
everythingis-ok
发布于
2025年3月18日
许可协议