XXE 外部实体注入
1. XML简介
原理
XML是一个可扩展标记语言,用做存储标记数据,定义数据类型。
主要目的是要在不同的机器之间进行通信的数据规范
XML的根元素和子元素允许用户自定义。一个标签用于描述一段数据。
###为什么需要XML
- 两个程序间进行数据通信
- 给一台服务器,做一个配置文件,当服务器程序启动时,去读取它应当监听的端口号,还有连接数据库的用户名和密码
XML的应用
-
解决了程序间数据传输的问题
-
XML可以做配置文件
XML文件做配置文件可以说非常普遍,比如我们的Tomcat服务器的server.xml,web.xml。再比如我们的structs中的structs-config.xml文件,和hibernate的hibernate.cfg.xml等等。
-
XML可以充当小型的数据库
XML文件可以做小型数据库,也是不错的选择,我们程序中可能用到一些经常要人工配置的数据,如果放在数据库中读取不合适(因为这会增加维护数据库的工作),则可以考虑直接用XML来做小型数据库。这种方式直接读取文件显然要比读数据库快。比如msn中保存用户聊天记录就是用XML文件。
DTD 文档类型定义
DTD是用来规范和约束XML的书写
定义实体:就是为一段内容指定一个名称,使用时通过这个名称就可以引用其所代表的的内容。
基本格式:
<!ELEMENT NAME CONTENT>
实例:
<!ELEMENT 班级 (学生+)>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
编写XML文件引入DTD文件
<?xml version="1.0" encoding="utf-8"?>
<!--引入dtd文件,约束这个xml-->
<!DOCTYPE 班级 SYSTEM "myClass.dtd">
<班级>
<学生>
<名字>周小星</名字>
<年龄>23</年龄>
<介绍>学习刻苦</介绍>
</学生>
<学生>
<名字>林晓</名字>
<年龄>25</年龄>
<介绍>是一个好学生</介绍>
</学生>
</班级>
2. XXE原理
程序在解析XML时,解析了XML中的外部实体引用。
攻击者可以利用外部实体读取任意文件,进行内网探测,执行远程代码和拒绝服务攻击
XXE危害
- 敏感信息泄露
- 可以探测主机的存活,端口的开放
XXE注入点
- URL输入框
- 登录框
实例
http://10.10.10.30/xml/example1.php?xml=这个位置填写的是XML标签
构造攻击POC,读取/etc/passwd文件
http://10.10.10.30/xml/example1.php?xml= ]>123&xxebbsjl;
上述payload证明了,XML引用了DTD