漏洞位置在index.php 279行左右,
这里对删除的文件名没有任何限制,导致了可以进行目录跳转,从而删除其他目录的文件,即任意文件
private static function deleteFileThemePluginAction() { if (! wCMS::$loggedIn) { return; } if (isset($_REQUEST['deleteFile']) || isset($_REQUEST['deleteTheme']) || isset($_REQUEST['deletePlugin']) && isset($_REQUEST['token'])) { if (hash_equals($_REQUEST['token'], wCMS::generateToken())) { $deleteList = [ [__DIR__.'/files', 'deleteFile'], [__DIR__.'/themes', 'deleteTheme'], [__DIR__.'/plugins', 'deletePlugin'], ]; foreach($deleteList as $entry) { list($folder, $request) = $entry; $filename = isset($_REQUEST[$request]) ? trim($_REQUEST[$request]) : false; if (!$filename || empty($filename)) { continue; } if ($filename == wCMS::get('config', 'theme')) { wCMS::alert('danger', 'Cannot delete currently active theme.'); wCMS::redirect(); continue; } if (file_exists("{$folder}/{$filename}")) { wCMS::recursiveDelete("{$folder}/{$filename}"); wCMS::alert('success', "Deleted {$filename}."); wCMS::redirect(); } } } } }
这里filename直接进行request,并且没有任何限制,因此可以使用../来进行目录的跳转
后面跟进recursiveDelete这个函数,
位于index.php 585行
private static function recursiveDelete($file) { if (is_dir($file)) { $list = glob($file . '*', GLOB_MARK); foreach ($list as $dir) { wCMS::recursiveDelete($dir); } rmdir($file); } elseif (is_file($file)) { unlink($file); } }
这里的file既可以是目录,也可以是单独的文件,这里都有判断,但是页面功能为删除file目录下的文件,通过修改文件名这个参数,从而可以达到任意文件删除
下面给出利用过程(poc)
cms给出的文件上传功能,所有上传文件都在这个file目录下
deleteFile参数没有任何限制,导致可以跨目录删除
新建了一个test.txt文件用作测试,将上面的deleteFile参数改为../test.txt,然后抓包放行
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论