Header injection. Не понимаю как используется и, соответственно, не понимаю как защит

KhmelevskyY

Новичок
Header injection. Не понимаю как используется и, соответственно, не понимаю как защит

Здравствуйте.
Вопрос о Header injection. Делаю скрипт авторизации, при правильном вводе логин/пароля выполняю Header('Laction...'). Подсмотрел в Zend Framework, в их класс Redirector, метод setGotoUrl(). Там есть такие строки:
PHP:
$url = str_replace(array("\n", "\r"), '', $url); 
... 
if (!preg_match('|^[a-z]+://|', $url)) { 
}
Зачем-то вырезают символ перевода строки, что злоумышленник может сделать если я его не буду вырезать? Куда он должен подставлять этот символ перевода строки со своим вредоносным кодом? как вообще метод работает объясните, чтобы было понятно когда нужно защищаться и как?
Если можно какой-то тестовый примерчик, когда не фильтруется Header и что можно тогда сделать, не понимаю сам механизм атаки.
 

dr-sm

Новичок
изучай протокол HTTP.
это защита походу от ошибок в коде, преднамеренных или нет другой вопрос.
 

KhmelevskyY

Новичок
Автор оригинала: dr-sm
изучай протокол HTTP.
это защита походу от ошибок в коде, преднамеренных или нет другой вопрос.
я в курсе как работает HTTP протокол, я понимаю, что вначале передаются заголовки документа, и в конце каждого заголовка стоит символ перевода строки.
Тоесть, если я делаю что-то типа:
http://mydomain.com/?redirect=www.ya.ru
а в php скрипте, использую что-то типа
PHP:
header('location: ' . $_GET['redirect'])
то здесь по идее ясно, злоумышленник ставит символ перевода строки (%0D%0A) и дальше свой заголовок, например переслать куки. Здесь ясно, что если я не обработаю символ перевода строки, то можно переслать сколько угодно заголовков. Я правильно понимаю?

Но если я в скрипте в функции Header не использую никакую переменную GET или POST, получается мне боятся нечего? Тоесть такой скрипт безвреден:
PHP:
Header('location: ya.ru')
А если я в Header использую переменную, например, $_SERVER['REQUEST_URI'], массив $_SERVER является частью пользовательского ввода, вроде да? Как злоумышленник может изменить этот массив? Какие массивы злоумышленник может изменять, ну кроме GET и POST? Сама суть моих высказываний верна?
 

Макс

Старожил PHPClub
дырка с символом перевода строк в функциях header() и mail() была исправлена в пхп несколько лет назад. Возможно ZF поддерживает старые версии или просто забыли убрать этот код.
 

LeoKee

Новичок
Автор оригинала: Макс
дырка с символом перевода строк в функциях header() и mail() была исправлена в пхп несколько лет назад. Возможно ZF поддерживает старые версии или просто забыли убрать этот код.
про mail():
PHP:
@mail( $email, $title, $message, 
"Content-Type: text/plain; charset=UTF-8; format=flowed\nFrom: $email\nReply-To: {$emailreply}\n" );
вообщето работает
 

KhmelevskyY

Новичок
HTTP_REFERER посылается браузером. Значит 100% можно как-то подменить. А как это сделать, можете подсказать?
 

LeoKee

Новичок
Автор оригинала: KhmelevskyY
HTTP_REFERER посылается браузером. Значит 100% можно как-то подменить. А как это сделать, можете подсказать?
Не только браузером... Любыми умелыми руками можно послать заголовки тебе на сайт с нужным реферером
см curl и через сокеты
 

Макс

Старожил PHPClub
Автор оригинала: LeoKee
про mail():
PHP:
@mail( $email, $title, $message, 
"Content-Type: text/plain; charset=UTF-8; format=flowed\nFrom: $email\nReply-To: {$emailreply}\n" );
вообщето работает
баг был в том через переменную $email (первый параметр) можно было заголовки передать
 
Сверху