pikachu之xxe
一、什么是xxe?
XXE即“xml external entity injection”即“xml外部实体注入漏洞”。
攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题。
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。
现在很多语言里对应的解析xml的函数默认是禁止解析xml外部实体内容的
就如在php中,对于xml的解析用的是libxml,在libxml版本>=2.9.0时默认是禁止解析xml外部实体内容的。
在本次案例中,为了漏洞复现,手动指定LIBXML_NOENT选项开启了xml实体注入。
XML是可扩展标记语言,灵活性很强,跨平台,经常被用来做配置文件,用来进行数据的传输和存储。同HTML很像都是树形结构,但功能不同。
知识补充:
xml可以外部引用实体,外用可支持多种协议,但是不同语言支持的协议不同(也有一些通用协议):
![]()
php支持的协议示例:
![]()
php://filter 是一种元封装器,设计用于数据流打开时的筛选过滤应用 data://同样类似于php://input,可以让用户来控制输入流 php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行 phar://xxx.png/shell.php解压缩包的一个函数,不管后缀是什么,都会当作压缩包来解压
二、靶场测试
之前输入payload多次测试,但是没能成功,浪费了好长时间,之后看了大佬的文章才豁然开朗。
原因是php5.5以后,有一些php包没有安装,如php55-php-xml
和php55-php-fpm
,安装了就好了。
为了复现漏洞,换了php5.4版本
测试payload1:
当时用file协议没有成功,用php协议成功了。
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php">
]>
<x>&f;</x>

测试payload2:
<?xml version = "1.0"?>
<!DOCTYPE note [
<!ENTITY hacker "ESHLkangi">
]>
<name>&hacker;</name>