顺手搜了一下CVE,XXE的问题还真不少。
XXE,XML External Entity (外部实体)。
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。它使用一系列的合法元素来定义文档结构。
可在xml中进行引用,&js;
// js 为dtd中声明的内部实体
]>
&js; // 通过&js;进行引用
可获取外部资源(非xml中声明的),可用于一般实体、参数实体
// DTD 定义,root为声明的外部实体
]>
&root;Hello //&root;引用
// 也可以是使用PUBLIC关键字进行定义,读取公共资源
外部是实体支持http、file等协议,具体如下:
参数实体(Parameter entities)
可在doctype声明中使用,也可以在实体定义value 中使用
%remote;
]>
test&ping;
// 其他如:
说完实体的概念,基本就能看清楚漏洞的原理了,通过外部实体(http、ftp)获取信息。
因为外部实体支持ftp协议,可以构造payload获取目录、文件信息。
具体可参考webgoat8 xxe stage 3,利用也比较简单。
]>
&root;xxe
如果没有回显,通过Bland XXE(OOB)进行利用,具体参考webgoat8 xxe stage 7
搭一个服务器(A)接收http请求发送的数据,A服务器定义attack.dtd
目标机解析包含payload的xml,外部实体读取attack.dtd,然后发送数据至获取数据。
attack.dtd
// 参数实体、外部实体,读取目标机文件
// 参数实体,实体内定义外部实体访问A服务器并发送读取的内容
">
%all;
payload:
%remote;
]>
test123---&send;
通过构造恶意实体,指数级生成超大xml文档,服务器在解析时好景资源,导致DOS。此示例及著名的Billion laughs attack。
payload:
]>
&lol9;
因为外部实体支持ftp、http等协议,所以可利用进行内网探测(服务器、端口),甚至进行账号、密码爆破。
服务器、端口探测
]>
&root;xxe
用webgoat8 xxe 的例子试一下,把webwolf当成内网机器。
左边是可访问地址,返回解析错误。
"javax.xml.bind.UnmarshalException\\n - with linked exception:
\\n[javax.xml.stream.XMLStreamException:
ParseError at [row,col]:[4,15]
\\nMessage: http:\\/\\/192.168.3.103:9091\\/WebGoat]\\r\\n\\tat com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamEx
右边端口未开放,拒绝连接,且响应时间明显会长一些。
"javax.xml.bind.UnmarshalException\\n - with linked exception:
\\n[javax.xml.stream.XMLStreamException:
ParseError at [row,col]:[4,15]\\nMessage: Connection refused: connect
针对PHP环境中安装expect扩展,通过返回报错信息、返回时间等进行判断。
payload如下,具体示例懒得搭环境了。
]>
&test;
‘ " & < > ]]>