Материал: Разработка программы для фиксации попыток атаки на защищаемый объект

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Листинг 3.

$user=htmlspecialchars(stripslashes($user));

$pass=htmlspecialchars(stripslashes($pass));

В Листинге 4 выполняется подключение скрипта к СУБД и выбор БД для работы.

Листинг 4.

mysql_connect($dbhost, $dbadmin, $dbpass) or die("ERROR ".mysql_errno()." ".mysql_error());

mysql_select_db($dbname) or die("ERROR ".mysql_errno()." ".mysql_error()."\n");

В этой строке выполняется подключение к СУБД используя параметры из конфигурационного файла. Затем мы выбираем для работы свою БД, так же используя параметр $dbname из конфигурационного файла. Со следующей строки, согласно Листинга 5 начинает выполнение алгоритм проверки имени пользователя и пароля, а также количества неуспешных попыток авторизации с данного ip-адреса. Сначала создаем SQL-запрос, который проверит значение поля num_logon из таблицы log_control для даного ip-адреса, которое содержит номер предыдущей неуспешной попытки авторизации. Далее с помощью функции mysql_query мы выполняем этот запрос к БД и получаем в качестве ответа объект типа «ресурс».

Листинг 5.

$sql_exist_ctrl="select num_logon from log_control where ip='".$ip."'";

$res=mysql_query($sql_exist_ctrl) or die("ERROR ".mysql_errno()." ".mysql_error()."\n");

$rows=mysql_num_rows($res);

Затем в переменную $rows мы при помощи функции mysql_num_rows помещаем число строк в полученном от БД ответе, преследуя при этом следующую цель: если число строк возвращенных в ответ на запрос окажется равным нулю, это будет означать первую попытку авторизации. В Листинге 6 приведена сама проверка возвращенного результата:

Листинг 6.

if($rows==0)

{

$sql_begin_ctrl="insert into log_control set time='".$timevisit."', ip='".$ip."', num_logon=".$i;_query($sql_begin_ctrl) or die ("ERROR ".mysql_errno()." ".mysql_error()."\n");

}

Если запрос на авторизацию первый, создаем SQL-запрос к БД который выполнит вставку данных (ip-адрес и дата/время) о текущем подключении в таблицу log_control и присвоит полю num_logon номер попытки, равный нулю. Затем мы выполняем этот запрос при помощи функции mysql_query. Иначе, если этот ip-адрес уже есть в таблице log_control, что означает имеющиеся предыдущие ошибки авторизации, мы получаем в переменную $i количество неуспешных попыток для данного ip-адреса, как в Листинге 7.

Листинг 7.

{

$array=mysql_fetch_array($res);

$i=$array[0];

}

Теперь пришло время проверки правильности логина и пароля введенных пользователем. Для этого составляется SQL-запрос и выполняется посредством функции mysql_query с проверкой на успешное выполнение запроса. Затем проверяем возвращенный функцией результат. Сначала посчитаем число возвращенных строк. Эти действия приведены в Листинге 8.

Листинг 8.

$sql_autoriz="select id from users where user='".$user."' and pass='".$pass."'";

$res=mysql_query($sql_autoriz) or die("ERROR ".mysql_errno()." ".mysql_error()."\n");

$rows=mysql_num_rows($res);

Число строк может быть равно нулю или больше. Если равно нулю, это означает, что пара логин / пароль была неверна. Я сначала отработаю удачную авторизацию. Код приведен Листинге 9.

Листинг 9.($rows>0)

{

$sql_end_ctrl="delete from log_control where ip='".$ip."'";_query($sql_end_ctrl);($user)

{"admin" :_redirect("#"869107.files/image008.jpg">

Рисунок 8. Вывод результата запроса через вложенный цикл.

Рассмотрим последний файл autorized.php, реализующий функциональность личной страницы пользователя. Он представляет собой обычный HTML-документ, с вставкой php-кода. Код приведен в Листинге 14.

Листинг 14.

<?php"<font color=red>".strtoupper($_GET['user'])."</font>";

?>

Здесь вся функциональность заключается в выводе большими красными буквами имени пользователя в приветствии. В случае большого количества пользователей реального ресурса было бы уместно создать в БД таблицы хранящие индивидуальные данные каждого пользователя и «вытаскивать» их при выводе страницы ориентируясь по полученному в глобальном массиве ($_GET['user']) имени пользователя, реализовав эти функции в данном файле.

РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

Руководство пользователя в данном случае очень несложно, т. к. функциональность реализуется автоматически, без активного участия пользователя. Рекомендации предназначены только для администратора. Разобьем использование системы на шаги и рассмотрим их последовательно.

Итак, Шаг 1. Набираем в адресной строке браузера URL или ip-адрес ресурса, в соответствии с Рисунком 9. И попадаем на страницу авторизации, в соответствии с Рисунком 10.

Рисунок 9. Набор URL в адресной строке.

Рисунок 10. Страница авторизации пользователя.

Шаг 2. Вводим имя пользователя и пароль, в соответствии с Рисунком 11.

Рисунок 11. Ввод логина и пароля.

Шаг 3. Попадаем на страницу администратора, в соответствии с Рисунком 12.

Рисунок 12. Страница администратора информационного ресурса.

Шаг 4. Для просмотра списка зафикисрованных данных о потенциально-опасных соединениях нажимаем кнопку «See» в верхнем правом углу интерфейса, в соответствии с Рисунком 13.

Рисунок 13. Вывод сведений о попытках атаки.

ЗАКЛЮЧЕНИЕ

В данной курсовой работе решены задачи разработки программы для фиксации атак на защищаемый объект.

В процессе создания курсовой работы, был разработан и реализован алгоритм решения поставленной задачи. Программа как и было намечено, реализована на языке программирования PHP, с использованием языка разметки гипертекста HTML, используемым для создания графического интерфейса пользователя GUI. В качестве платформы программного комплекса использована связка Linux + Apache + MySQL + PHP. Полученные в результате проведенной работы результаты соответствуют поставленным задачам. Написано приложение выполняющее запись о потенциально-опасных соединениях, коими в рамках решаемой задачи были признаны каждая 3-я не успешная попытка авторизации выполненная подряд. Запись помещается в таблицу БД для долговременного хранения и просмотра администратором системы в любой момент.

Исходя из вышесказанного можно говорить о успешном достижении целей курсовой работы.

ПРИЛОЖЕНИЕ А.

ЛИСТИНГ ПРОГРАММЫ.

Листинг 1.1. Файл index.php

<?php

/**********************************************************

* главная страница проекта - страница авторизации                  *

**********************************************************/

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Добро пожаловать на страницу авторизации</title>

</head>

<body><center>

<form name="login" action="logger.php" method="POST">

<table name="body" width="100%" height="100%">

<tr valign="center" align="center"><td bgcolor="bbbbff">

<table name="border">

<tr><td>

<table name="form">

<tr><td colspan="2" align="center"><h1><font color="222222">ВХОД</font></h1></td></tr>

<tr><td colspan="2" align="center"><h6>

<?php

//Вставка отслеживающая наличие переменной fail указывающей на

//ошибку авторизации.

if($_GET['fail'])

echo "<font color='red'>Ошибка авторизации!</font>";

else echo "&nbsp";

?>

</h6></td></tr>

<tr><td>&nbsp;Login&nbsp;&nbsp;</td><td><input type="text" name="user">&nbsp;</td></tr>

<tr><td>&nbsp;Password</td><td><input type="password" name="passwd">&nbsp;</td></tr>

<tr><td colspan="2" align="center"><h6>&nbsp;</h6></td></tr>

<tr><td><h6>&nbsp;<a href="index.php">Регистрация</a></h6></td><td align="right"><h6><a href="index.php">Забыли пароль?</a>&nbsp;</h6></td></tr>

<tr><td colspan="2" align="center"><h6>&nbsp;</h6></td></tr>

<tr align="center" valign="center"><td colspan="2"><h1><input type="submit" name="go" value="Logon"></h1></td></tr>

</table>

</td></tr>

</table>

</td></tr>

</table>

</form>

</center></body>

</html>

<?php

/*****************************************************

* файл выполняющий основную работу по выявлению *

* и логированию попыток взлома перебором *

*****************************************************/_once './config.php';($_POST['go'])

{

$i=0;

$rows=0;

$flag=$_POST['go'];

$user=$_POST['user'];

$pass=$_POST['passwd'];

$timevisit=date('Y-m-d H-i-s');

$ip=$_SERVER['REMOTE_ADDR'];

$server_ip=$_SERVER['SERVER_ADDR'];

//Обработка функциями удаления HTML-тегов (для исключения возможности

//написания скриптов на JavaScript и Visual Basic) и обратных слешей

//(для исключения возможности написания скриптов на Perl).

$user=htmlspecialchars(stripslashes($user));

$pass=htmlspecialchars(stripslashes($pass));

//Подключение к БД_connect($dbhost, $dbadmin, $dbpass) or die("ERROR ".mysql_errno()." ".mysql_error());_select_db($dbname) or die("ERROR ".mysql_errno()." ".mysql_error()."\n");

//Проверка на наличие данного ip в контрольной таблице

$sql_exist_ctrl="select num_logon from log_control where ip='".$ip."'";

$res=mysql_query($sql_exist_ctrl) or die("ERROR ".mysql_errno()." ".mysql_error()."\n");

$rows=mysql_num_rows($res);($rows==0) //если ip не записан

{

//Вставка нового ip в контрольную таблицу

$sql_begin_ctrl="insert into log_control set time='".$timevisit."', ip='".$ip."', num_logon=".$i;_query($sql_begin_ctrl) or die ("ERROR ".mysql_errno()." ".mysql_error()."\n");

}

else //если ip уже есть в таблице

{

$array=mysql_fetch_array($res); //получаем номер текущей попытки авторизации

$i=$array[0];

}

//проверяем правильность пары логин-пароль

$sql_autoriz="select id from users where user='".$user."' and pass='".$pass."'";

$res=mysql_query($sql_autoriz) or die("ERROR ".mysql_errno()." ".mysql_error()."\n");

$rows=mysql_num_rows($res);($rows>0) //если логин-пароль верны

{

//удаляем записи из контр.таблицы

$sql_end_ctrl="delete from log_control where ip='".$ip."'";

mysql_query($sql_end_ctrl); ($user)

{

case "admin" :

http_redirect("#"869107.files/image014.gif">