浅学XXE
什么是XXE?
XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。
什么是XML?
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
XML有什么特点
- XML仅仅是纯文本,他不会做任何事情。
- XML可以自己发明标签(允许定义自己的标签和文档结构)
- XML 无所不在。XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。
既然XML是纯文本为什么还会产生注入呢
原本xml本身是没有任何作用,但是在PHP里有一个函数叫做simplexml_load_string
,他的作用是把xml转化为对象。
PHP 中的simplexml_load_file()
函数 ,用于加载 XML 文件并返回一个 SimpleXMLElement 对象,这样你就可以轻松地操作 XML 数据了。
XML与HTML的区别
- XML被设计用来传输和存储数据。
- HTML被设计用来显示数据。
为什么使用 DTD?
通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
您还可以使用 DTD 来验证您自身的数据。
DTD实体
- 内部实体声明:
<!ENTITY 实体名称 "实体的值"> ex:<!ENTITY eviltest "eviltest">
- 外部实体声明:
<!ENTITY 实体名称 SYSTEM "UR">
怎么构造外部实体注入?
直接通过DTD外部实体声明
通过DTD文档引入外部DTD文档,再引入外部实体声明
通过DTD外部实体声明引入外部实体声明
XML外部实体攻击又是什么
XML 外部实体注入简称XXE,有了XML实体,关键字SYSTEM会令XML解析器从URI中读取内容,并允许它在XML文档中被替换。因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。 简单来说,攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件)。
XXE支持那些协议呢
- file:可用 file://文件地址,来读取文件
- http:可以访问 HTTP(S) 网址
- FTP:访问 FTP
- PHP:访问各个 输入/输出 流
- zlib:压缩流
- data:数据
- glob:查找匹配的文件格式路径
- expect:处理交互式的流,可用来执行命令,但需要先安装相应插件
为什么要进行base64编码
为了防止一些特殊字符对我们产生影响
靶场
全剧搜simplexml_load_string
$postArr = $GLOBALS['HTTP_RAW_POST_DATA'];
接收HTTP中原始的POST数据,并将其存入$postArr
变量中
然后,使用simplexml_load_string
函数将$postArr
中的数据转换为SimpleXMLElement
对象,并将其存储在$postObj
变量中。
修改源文件,看看能否访问到这个页面
靶场中
使用bp抓包,将构造的xml语句上传,同时将传参方式改为post
同时,根据/api/notify.php
得到conn/conn.php
的相对路径
使用靶场给的xml文件
1 | <?php |
登录数据库
admin密码由md5加密