一、为什么改扩展名骗不过系统?
一般来说:文件后缀(扩展名)决定“谁去打开”,魔数(文件签名)决定“能不能打开”。两者不一致时,去打开的那个程序会发现自己读不懂文件内容,所以必然打不开。
| 层面 | 依据 | 作用 |
|---|---|---|
| 文件系统层 | 扩展名 | 决定默认打开方式、图标显示 |
| 应用程序层 | 文件签名(Magic Number) | 实际解析文件内容 |
举例:
(1)在"SHA-256"的视角下,Hash是取自文件内容本身来决定的而非涵盖了文件名、扩展名等。
System metadataresidesoutsidethe file and can be alteredwithout impacting the contents of the file. Hashing the file hashes itscontents,not informationaboutthe file. That is, you only hash what’s stored inside the file, not its system metadata1.
系统元数据位于文件外部,可以在不影响文件内容的情况下进行更改。哈希文件会哈希其内容,而不是有关文件的信息。也就是说,您只对文件中存储的内容进行哈希运算,而不是对其系统元数据进行哈希运算。
(2)直击二进制,其同属于FF D8为SOI,FF D9为EOI,所以直接改扩展名是不会影响其本质内部实质二进制。
(3)以Linux环境下,使用file命令获取文件的MIME类型
file -b --mime-type,直接获取MIME类型。
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式2。
(4)Windows通过应用打开文件3,且需要看他能不能在这个情况下解析
- [1]不能这么解析出来的
[2]点击查看还可询问,这取决于软件是在查看扩展名后看不看实际魔数之间是否有冲突
- 原图
JPG扩展名被改为png
- 在软件过后,最后被检测并转换为是
JPG FILE
- 原图
二、文件签名
| 用途 | 说明 |
|---|---|
| 安全 | 检测扩展名伪造的文件 |
| 取证 | 从损坏的存储中恢复文件 |
| 验证 | 确保上传的文件与预期类型匹配 |
| 兼容性 | 确定打开文件的正确应用程序 |
常见文件签名
| 格式 | 扩展名 | 十六进制签名 | 偏移 | MIME 类型 | 风险等级 |
|---|---|---|---|---|---|
| PNG | .png | 89 50 4E 47 0D 0A 1A 0A | 0x00 | image/png | 低 |
| JPEG | .jpg, .jpeg | FF D8 | 0x00 | image/jpeg | 低 |
defis_jpg(file_path:str)->bool:JPG_SIGNATURE=bytes([0xFF,0xD8])withopen(file_path,"rb")asf:returnf.read(2)==JPG_SIGNATUREA Hash of It | Ball in your Court ↩︎
MIME 多用途互联网邮件扩展类型 ↩︎
https://www.quora.com/How-does-Windows-know-which-application-to-use-to-open-a-file ↩︎