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

Discussion in 'Уязвимости' started by gena ryzhov, 30 Nov 2017.

?
  1. Да

    83.3%
  2. нет

    0 vote(s)
    0.0%
  3. Я это знал, баян!

    16.7%
  1. gena ryzhov

    gena ryzhov Member

    Joined:
    18 Dec 2013
    Messages:
    17
    Likes Received:
    7
    Reputations:
    0
    Всем добрый день!

    Суть статьи: С помощью картинки на вашем сайте(сервере), добавленной на сторонний ресурс, можно посылать GET запросы на любые сайты от имени пользователя с его Куками и правами на сайте не заметно для самого пользователя.

    Предистория

    Вчера (30.11.17) я разместил на одном сайте картинку со своего сайта, а потом подумал, хм... а почему бы мне не поменять текст в картинке в зависимости от времени суток.

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

    Потом я вспомнил про статью , которую когда-то читал
    Xss без Xss. В ней рассказывалась старая уязвимость запроса браузером произвольной страницы от имени пользователя через картинку с контролируемого сайта, которая добавляется на страницу сайта который позволяет добавлять картинки с удаленных ресурсов или в BBCode . Соответственно тогда были уязвимы все форумы, гостевые и прочие сайты, очень советую ту статью к прочтению.

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

    Какинтош:08/09/2008 - эта дыра еще актуальна?
    Thanat0z:08/09/2008 - На форуме запрещена некрофилия...


    Я подумал что уязвимость закрыта, соответственно когда читал первый раз не стал проверять

    эту уязвимость, но....

    Эксперимент

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

    КАРТИНКА - https://pp.userapi.com/c840128/v840128570/4ae3c/inYX3oKpKIM.jpg

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


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

    Подитог

    Благодаря данной уязвимости можно посылать 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($_GET['url'])) {
    header( "Location: ".htmlspecialchars($_GET['url']) );
    }
    else {
    header( "Location: http://site.ru/page/" );
    }

    exit;

    ?>
    3. Эти файлы поместить в отдельную директорию на сайте? в примере у меня будет /imagex/.

    Все готово, дальше можно делать ссылки на картинку в виде любого названия файла.


    Примеры адресов картинок:

    http://site.ru/imagex/test.gif

    http://site.ru/imagex/counter.jpg
    http://site.ru/imagex/avatar_forum.png



    и т.д.... Суть в том, что название картинки никак не влияет на результат, все равно будет запрошен наш скрипт, который сделает редирект!

    Всем спасибо за прочтение!

    P.S Не судите строго...




     
    #1 gena ryzhov, 30 Nov 2017
    Last edited: 30 Nov 2017
    trolex likes this.
  2. trolex

    trolex Well-Known Member

    Joined:
    6 Dec 2009
    Messages:
    592
    Likes Received:
    1,392
    Reputations:
    6
    а как её закроешь? это надо чтобы производители браузеров среагировали, им нормально, никаких стандартов не нарушает, сейчас везде для действий на сайтах нужен хэш, либо методом пост отправляется, либо хэш в параметре гет, не знаю что там за сайт ты откопал где отправка сообщения методом гет без хэша, что то мне кажется никаких более менее посещаемых сайтов таких остаться не должно,
    и некоторые сайты уже при добавлении картинки грузят её к себе на сервер,
    но правда это можно применить не только к совершению действий от имени пользователя, а например к тому же получению ип, и прочему....
    ну в общем не спроста на античат так сложно добавить картинки с внешних сайтов, как видишь твоя не добавилась, возможно есть какой то белый список сайтов фотохостингов