diff --git a/cms/lib/handlers/handler_ws.php b/cms/lib/handlers/handler_ws.php index 0cea669..458c55d 100755 --- a/cms/lib/handlers/handler_ws.php +++ b/cms/lib/handlers/handler_ws.php @@ -450,9 +450,14 @@ function _removeFileRutaSegura($ruta, $esPlugin) { $base = $pluginsDir; $real = realpath($pluginsDir . '/' . $nombre); } else { - if (strpos($ruta, "\0") !== false) return false; - $base = $raizWeb; - $real = realpath((substr($ruta, 0, 1) === '/') ? $ruta : $raizWeb . '/' . $ruta); + // Lista blanca: contenido de la web, nunca su motor ni su configuracion. + if (strpos($ruta, "\0") !== false || substr($ruta, 0, 1) === '/') return false; + $base = false; + foreach (array('cms/uploads', 'template', 'hooks', 'cache') as $permitido) { + if (strpos($ruta, $permitido . '/') === 0) { $base = realpath($raizWeb . '/' . $permitido); break; } + } + if (!$base) return false; + $real = realpath($raizWeb . '/' . $ruta); } if (!$real || $real === $base || $real === $pluginsDir || $real === $raizWeb) return false; if (strpos($real, $base . DIRECTORY_SEPARATOR) !== 0) return false;