1. 从一道“送分题”说起:为什么你的文件上传总失败?
我记得刚开始玩CTF的时候,遇到文件上传类的题目,总觉得思路很简单:不就是找个上传点,传个木马或者一句话,然后拿权限嘛。结果实战中,十次有八次,文件刚传上去就被系统无情地拦截,返回一个冷冰冰的“文件类型不允许”。那时候真是百思不得其解,明明我改了个.jpg的后缀,怎么服务器还能认出来我传的是个PHP脚本?
后来踩坑踩多了才明白,很多安全检查机制,尤其是稍微上点心的系统,根本不会只看你文件的后缀名。它们会直接“扒开”文件,去看文件最开头的几个字节——也就是我们常说的文件头(File Header)或者魔数(Magic Number)。这几个字节就像是文件的“身份证号”,系统通过它来判断文件的真实格式。你给一个PHP文件强行套上个.jpg的马甲,但它的“身份证”上写的还是“PHP”,安检员一眼就能识破。
这就像你去参加一个化装舞会,虽然你戴上了蜘蛛侠的面具(改了后缀名),但一开口说话,声音还是你自己(文件头没变),熟悉你的人立刻就能认出来。文件头检测,就是那个听你声音的“熟人”。
所以,在CTF比赛或者实际的渗透测试中,文件头检测绕过是一项非常基础但又极其关键的技巧。它不复杂,但如果你不知道,就会在第一步被卡住,后面的所有高级利用都无从谈起。今天,我就结合自己打过的一些比赛和做过的项目,来详细拆解一下这个技术,保证你看完就能上手,下次遇到这类题目能稳稳拿下。
2. 文件头到底是什么?一图看懂文件“身份证”
说了半天文件头,它到底长啥样?我们直接看例子最直观。你可以用任何一款十六进制编辑器(比如Windows上的WinHex,或者跨平台的HxD)打开一个文件,看看它的前几个字节。
这里我列举几个最常见的,你几乎一定会遇到的:
| 文件格式 | 文件头(十六进制) | ASCII字符表示(部分) |
|---|---|---|
| JPEG 图像 | FF D8 FF E0 |
ÿØÿà |
| PNG 图像 | 89 50 4E 47 0D 0A 1A 0A |
.PNG.... |
| GIF 图像 | 47 49 46 38 39 61 |
GIF89a |
| ZIP 压缩包 | 50 4B 03 04 |
PK.. |
| RAR 压缩包 | 52 61 72 21 1A 07 00 |
Rar!... |
| PDF 文档 | 25 50 44 46 2D |
%PDF- |
| Windows 可执行文件(EXE)< |

1957

被折叠的 条评论
为什么被折叠?



