安全矩阵

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

Web安全 | XML基本知识以及XXE漏洞(文末有靶机地址)

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-5-3 22:30:50 | 显示全部楼层 |阅读模式
本帖最后由 gclome 于 2020-5-3 22:33 编辑

原文链接:Web安全 | XML基本知识以及XXE漏洞(文末有靶机地址)

- XML注入                                          
第一次XXE漏洞
xml是可扩展标记语言(EXtensible Markup Language)的缩写。它与HTML类似同为w3c推荐标准,但是比HTML要严谨。因为它所有的标签一定要闭合。 同时它也可以用自己定义的标签,但是XML是不作为的标记语言,不像HTML,XML只是将数据结构化存储与传输。
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素
xml文档的构建模块
  • 元素
  • 属性
  • 实体
  • PCDATA
  • CDATA

1、元素元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的。

  1. <title>my blog</title>
  2. <writer>r1ght0us is best</writer>
复制代码
2、属性
  1. <img src="r1ght0us.gif" />
复制代码

3、实体
实体是用来定义普通文本的变量。实体引用是对实体的引用。

4、PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

5、CDATA
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。
DTD(文档类型定义)
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。
1、内部声明:
完整实例:
  1. <?xml version="1.0"?><!DOCTYPE note [
  2.   <!ELEMENT note (to,from,heading,body)>
  3.   <!ELEMENT to      (#PCDATA)>
  4.   <!ELEMENT from    (#PCDATA)>
  5.   <!ELEMENT heading (#PCDATA)>
  6.   <!ELEMENT body    (#PCDATA)>
  7. ]>
  8. <note>
  9.     <to>George</to>
  10.     <from>John</from>
  11.     <heading>Reminder</heading>
  12.     <body>Don't forget the meeting!</body>
  13. </note>
复制代码

2、外部声明(引用外部DTD):

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

ex:
  1. <!DOCTYPE test SYSTEM 'http://www.test.com/evil.dtd'>
复制代码
完整实例:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE note SYSTEM "note.dtd">
  3. <note>
  4.     <to>George</to>
  5.     <from>John</from>
  6.     <heading>Reminder</heading>
  7.     <body>Don't forget the meeting!</body>
  8. </note>
复制代码

而note.dtd的内容为:
  1. <!ELEMENT note (to,from,heading,body)>
  2. <!ELEMENT to (#PCDATA)>
  3. <!ELEMENT from (#PCDATA)>
  4. <!ELEMENT heading (#PCDATA)>
  5. <!ELEMENT body (#PCDATA)>


复制代码

DTD实体
DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
实体又分为一般实体和参数实体
1、一般实体的声明语法:<!ENTITY 实体名 "实体内容“>
2、引用实体的方式:&实体名;
3、参数实体只能在DTD中使用,参数实体的声明格式:
<!ENTITY % 实体名 "实体内容“>引用实体的方式:%实体名;

4、内部实体声明: ex:<!ENTITY eviltest "eviltest">
完整实例:
  1. <?xml version="1.0"?>
  2. <!DOCTYPE test [
  3. <!ENTITY writer "r1ght0us">
  4. <!ENTITY BLOG "http://r1ght0us.xyz">
  5. ]>

  6. <test>&writer;©right;</test>
复制代码


5、外部实体声明:
完整实例:
  1. <?xml version="1.0"?>
  2. <!DOCTYPE test [
  3. <!ENTITY writer SYSTEM "https://github.com/r1ght0us">
  4. <!ENTITY handsome SYSTEM "http://www.chenguanxin.com">
  5. ]>
  6. <author>&writer;©right;</author>
复制代码

6、关于XML的几个注意点:
  • 所有的XML标记必须要闭合标签
  • 所有的XML的标签对大小写敏感
  • XML的属性值必须要加引号
  • 在XML中的五个符号需要实体引用
    1. 实体引用 |符号| 中文解释
    2. <    |<|   小于号
    3. >    |>|   大于号
    4. &   |&|   和号
    5. &apos  |'|   单引号
    6. "  |"|   双引号
    复制代码

    XXE漏洞
如何构建XXE
1、直接通过DTD外部实体声明(针对有回显的情况):




下图为一个XXE-labs中的测试:





2、外部文档类型定义(DTD)文件可被用于触发OOB XXE。攻击者将.dtd文件托管在VPS上,使远程易受攻击的服务器获取该文件并执行其中的恶意命令。(不进行回显)



外部DTD的内容:



其中php是伪协议不必多说。大概说一下原理,因为实战中大部分都是不进行回显,那么我们可以让服务器主动请求攻击者的VPS。那么我们让服务器引用写在VPS的DTD然后他会将payload加载,然后带进并访问我们的VPS,然后我们的VPS查看access_log可以接受到payload返回信息:



3、端口扫描
BP中的intruder模块设置如下:

因为其连接特性,如果一个端口开放会进行很快的响应,如果未开放,会进行多次连接进行到一定次数才会显示连接失败。那么爆破可以根据其完成一次相应的时间。
由于网络延时 or 某些协议的特有的连接方式,会显示不是特别精确有一定的误差
爆破如下所示:


防御XXE漏洞
  1. php:
  2. libxml_disable_entity_loader(true);

  3. JAVA:
  4. DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
  5. dbf.setExpandEntityReferences(false);

  6. Python:
  7. from lxml import etree
  8. xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

  9. 或者是将关键词 ex:`DOCYPE,ENTITY`进行过滤。
复制代码

XXE-lab 靶机地址:

  1. https://github.com/c0ny1/xxe-lab
复制代码




回复

使用道具 举报

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

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 02:42 , Processed in 0.013827 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

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