结构分析
自2000年代中期以来,办公文档(如2005年发布的 OpenOffice.org 2.0)已经被设计为一种包含文档内容的归档文件。在下图中,可以看到一个 Word 文档的结构。
从上图可以发现,这个归档文件中的所有结构是相互关联的,而这种关系是从末端开始的。
在归档文件的末尾,有一个名为中央目录记录结束标记(EOCD)的结构。该结构包含关于中央目录文件头(CDFH)大小、其偏移量以及归档文件中条目总数的信息。通过这个结构,可以定位到 CDFH。
(1)本地文件头(LFH)
位置: 位于ZIP文件的开头。
内容: 包含文件名、文件大小、CRC32校验值等信息。每个文件在ZIP文件中的数据块都从LFH开始。
作用: 描述单个文件的基本信息。
与其他部分关系: 在中央目录记录中,每个文件条目会引用它的起始偏移量
(2)中央目录文件头(CDFH)
位置: 通常在ZIP文件数据块之后,用于汇总所有文件的基本信息。
内容: 包含扩展的文件信息(如文件名、相对于LFH的偏移量); 每个文件在中央目录中都有对应的条目,条目中记录了该文件的偏移地址和属性。
(3)中央目录结束记录(EOCD)
位置: 位于ZIP文件的末尾。
内容: 包含中央目录的偏移量、大小、文件总数等信息。
作用: 作为ZIP文件的索引起点,帮助解析中央目录和LFH。
与CDFH关系: 通过偏移量定位中央目录起始位置,从而间接定位所有文件的LFH。
结构如何被攻击者操控分析
从上面的Word结构分析可知, ZIP归档文件的结构是从末尾开始构建的,同时各部分之间通过链接关联在一起。基于该原理, 下面将以三种不同的假设进行测试, 如图:
假设1
: 如果在归档文件的开头添加额外的数据,Word或归档程序是否仍能恢复并成功打开文件?
假设2
: 如果破坏各部分之间的链接并删除CDFH(中央目录文件头,且其本身不包含文件数据),Word或归档程序是否仍能恢复并成功打开文件?
假设3
: 如果破坏各部分之间的链接并删除EOCD(中央目录结束记录,这是一种关键的恢复过程部分),Word或归档程序是否仍能恢复并成功打开文件?
下面是三种假设的测试结果:
假设1: Word: 成功; ZIP: 失败(该文件不再是存档)
假设2: Word:成功; ZIP: 成功
假设3: 成功; ZIP: 成功
在对上面的假设进行检验过程中, 中间的过程记录如下:
(1) 要使Word文档达到最小恢复标准, 以下文件必不可少:
[Content_Types].xmlWord/document.xmlWord/_rels/document.xml.rels,_rels/.rels;
这些文件包含了有关元素之间关系的重要信息, 并构成Word文档所需的标准文件层次结构。
(2)本地文件头损坏的ZIP存档将仅显示文件结构, 实际文件内容将为空。
(3)如果ZIP文件的末尾部分损坏, 存档文件和Word将尝试使用替代恢复方法, 即利用完整的本地文件头。
从以上结果可以看到, Word比ZIP更能抗文件损坏。当 CDFH、EOCD 损坏,甚至添加随机字节以制造不存在的 LFH 结构时,Word 仍然可以成功恢复文件;而在第一种假设下(在文件开头添加随机字节),ZIP 则无法正常工作。