1
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
Приветствуем вас,Гость, на форуме IFUD.WS. Обязательно рекомендуется к прочтению правила форума http://ifud.ws/threads/obnovleno-pravila-foruma.7759

CRLF атаки

Тема в разделе "Чужие", создана пользователем }{OTT@BY4, 4 янв 2013.

  1. TopicStarter Overlay
    }{OTT@BY4

    }{OTT@BY4 Гость

    Специально для Svik'а





    CRLF-injection – это довольно старый вид атак, но до сих пор актуальный. Данный вид атак представляет из себя внедрение символа переноса строки куда либо – будь то обычный текстовый файл или что то ещё. Что интересно – данному виду атак подвержены не только веб-приложения (как и SQL-инъекциям). Актуален же данный тип атак из-за того что сейчас очень большую популярность приобрели различные веб-приложения работающие не в связке с СУБД а в связке с текстовыми файлами. Ниже я рассмотрю использование данной уязвимости на двух примерах.

    1. Фальсификация записей в текстовом файле.
    Рассмотрим следующий пример – имеется чат, где весь текст общения хранится не в базе а текстовом файле. Для практики напишем небольшой скрипт(chat.php):

    Код:
    <?php
    $file=file("chat.txt");
    for ($i=0; $i<count($file); $i++){
    print nl2br($file[$i]);
    }
    ?>

    Функция nl2br() используется для замены знака переноса строки на <br />.

    Поместим его в папку chat которая будет располагаться в корне localhost.
    Далее нам нужно написать скрипт который будет заносить сообщения в chat.txt. Вот его код(post.php):

    Код:
    <?php
    $str=$_GET['name'].":".$_GET['mess']."rn";
    $file=fopen("chat.txt","a");
    fputs($file,$str);
    fclose($file);
    header('location: chat.php');
    ?>

    Скрипту передаётся 2 переменные (name и mess) и они объединяются в строку name:mess. Затем получившаяся строка заносится в файл chat.txt и происходит редирект на chat.php. Пройдите по ссылке
    Please login or register to view links all!
    Если всё ОК то Вы должны увидеть в нашем чате сообщение:
    alice:hello all!





    Если Вы снова пройдёте по указанной ссылке то увидите уже 2 сообщения
    alice:hello all!
    alice:hello all!
    А что будет, если мы к тексту сообщения добавим знак переноса строки(%0a)? Так как фильтрации у нас нет, то в файл запишется лишний знак переноса строки. Давайте попробуем после переноса строки добавить текст “admin:fuck!”:
    Please login or register to view links all!%0aadmin:fuck!
    (жирным шрифтом выделен знак переноса строки)
    Итак, что же мы видим:
    alice:hello all!
    alice:hello all!


    alice:hello all!
    admin:fuck!
    Знак переноса успешно занёсся в файл и мы смогли сфальсифицировать сообщение другого пользователя.

    2. Подделка заголовка запроса с помощью CRLF-атак.
    Если Вы внимательно изучали строение HTTP пакетов то Вы, наверное, знаете, что в конце каждой строки заголовка пакета используется знак переноса строки. На множестве движков/сайтов можно встретить такую ситуацию: есть ссылка на сайт Please login or register to view links. Но нажав на неё вы попадаете не сразу на Please login or register to view links а на ссылку типа Please login or register to view links То есть Вы попадаете на определённый скрипт, которому в качестве значения параметра передаётся URI на который Вы должны пройти. Затем происходит редирект. Большинство скриптов такого вида имеет примерно следующий код:

    Код:
    <?php
    $url=$_GET['url'];
        // Какой-то определённый код
    // который может использоваться
    // например для ведения статистики
    header('location: '.$url)
    ?>
    Функция header() работает с заголовком пакета и может свободно его формировать. В данном случает формируется поле “location”.
    Разработчики вообще почему то забывают о том что $_GET['url'] приходит от пользователя и может быть запросто сформирован не так как нужно на самом деле. Давайте напишем 2 скрипта для рассмотрения примера. Один (go.php5) будет иметь следующий код:

    Код:
    <?php
    header('location: '.$_GET['url']);
    ?>
    А второй (target.php) будет состоять из следующего кода:

    Код:
    <?php
    print $_COOKIE['hack'];
    ?>
    Зачем во втором скрипте используются cookies Вы скоро поймёте. Теперь давайте перейдём по ссылке
    Please login or register to view links
    и увидим ошибку
    Notice: Undefined index: hack in z:homelocalhostwwwtarget.php on line 3
    В этом нет ничего странного. У нас ведь действительно нет cookies с именем hack.
    Так как заголовок пакета в go.php редактируется напрямую то почему бы не добавить в url знак переноса строки и новую строку. В нашем случае Set-Cookie. Вот как должен выглядеть url:
    Please login or register to view links%0aSet-Cookie: hack=it`s good
    Как видите – после знака переноса строки идёт текст Set-Cookie: hack=it`s good. Из за того что нет никакой фильтрации заголовок формируется так как надо нам и cookies появляются. Если Вы пройдёте по этому url то увидите что за место ошибки уже высвечивается надпись it`s good.

    Надо сказать, что не со всеми версиями php пройдёт такой фокус. Как Вы, наверное, уже заметили скрипт go.php5 обрабатывается 5-ой версией php. На момент написания статьи у меня стояла версия 5.0.2 и она хорошо принимала атаки подобного рода. А вот php версии 4.4.4 начинал ругаться на то что заголовок не правильно сформирован и имеет вторую строку.
     
    • Like Like x 6
    Метки:

Поделиться этой страницей

Загрузка...