摘要: XXE(外部实体注入)是XML注入的一种,普通的XML注入利用面比较狭窄,如果有的话也是逻辑类漏洞。XXE扩大了攻击面。

1|00x01概述

XXE(外部实体注入)是XML注入的一种,普通的XML注入利用面比较狭窄,如果有的话也是逻辑类漏洞。XXE扩大了攻击面。

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

防御方法:禁用外部实体(PHP:可以将libxml_disable_entity_loader设置为TRUE来禁用外部实体)

2|00x02 XML基础知识

2|12.1 XML基本结构

1.png

DTD 的作用:1. 定义元素(其实就是对应 XML 中的标签);2. 定义实体(对应XML 标签中的内容)

假如 DTD 位于 XML 源文件的外部,那么可以通过引用【外部文档说明】的方式,效果同上:

2.png

2|22.2 两种外部文档说明(DTD)

  1、 当引用的DTD文件是本地文件的时候,用SYSTEM标识,并写上”DTD的文件路径”,如下:

    <!DOCTYPE 根元素 SYSTEM "DTD文件路径">

  2、 如果引用的DTD文件是一个公共文件时,采用PUBLIC标识,如下:

    <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">

2|32.3 四种实体声明(ENTITY)

1.  内部实体声明

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

image.png

2.  外部实体声明

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

image.png

上述两种均为引用实体,主要在XML文档中被应用,引用方式:&实体名称; 末尾要带上分号,这个引用将直接转变成实体内容。

3.  参数实体声明

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

<!ENTITY % 实体名称 SYSTEM "URI/URL"> 

image.png

参数实体,被DTD文件自身使用 ,引用方式为:%实体名称。和通用实体一样,参数实体也可以外部引用。

允许包含外部实体,就可能存在XXE 攻击。

外部引用可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:


4.  公共实体声明

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

3|00x03 XXE漏洞

3|13.1 实验1(有回显)


测试demo:

image.png

【利用1】读取本地文件

image.png

【利用2】读取含特殊字符的本地文件

如果文件中含有特殊字符,如&,<,>,",'等,通过上述方法会报错,需要借助CDATA,CDATA节中的所有字符都会被当做元素字符数据的常量部分,而不是 xml标记。

image.png

http://192.168.220.143:8888/zhan/XXE-K/evil.dtd:

image.png

【利用3】内网ip探测

image.png

注:根据响应的时间的长短判断ip是否存在,可以通过burp重放遍历端口

【利用4】内网端口探测

image.png

注:根据响应的时间的长短判断端口是否开放,可以通过burp重放遍历端口;如果有报错,可以直接探测出banner信息。

【利用5】内网系统源码探测

image.png

注:审计源码,进一步发现内网系统漏洞(如sql注入),则可通过blind xxe进行注入

其他:通过jar协议上传文件;通过ftp协议结合 CRLF 注入攻击SMTP服务器

3|23.2 实验2(无回显)

测试demo:

image.png

【利用1】外带数据读取文件

image.png

http://127.0.0.1:8888/zhan/XXE-K/evil2.dtd:

image.png

8.png

  参考链接:

一篇文章带你深入理解漏洞之 XXE 漏洞

歪?我想要一个XXE

转载于:https://www.cnblogs.com/flokz/p/xxe.html

上一篇:Scanner Router...
下一篇:webgoat http ...