Инъекционные атаки SQL

Сегодня я расскажу тебе об инъекционных атаках SQL. Это достаточно распространенный и опасный тип атак Я готов поспорить, что 7 из 10 читателей данной статьи не знают что это такое.

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

Скрипт будет проще некуда, он будет состоять из двух файлов:

1)temp.htm – это обычная html форма состоящая из двух текстовых полей и кнопки submit, которая передает методом POST данные на файл temp.php.Вот его код:

Листинг 1. temp.htm
<html><body>
<form method=post action="temp.php">
<input type="text" name="login">
<input type="text" name="pass">
<input type="submit">
</form>
</body></html>

 

2)

Листинг 1. temp.php

<?php
include('database.php');
$login=$_POST['login'];
$pass=$_POST['pass'];
echo $login;
echo $pass;
$query="SELECT * FROM users WHERE login='$login' and pass='$pass'";
$result=mysql_query($query) or die(mysql_error());
$rows=mysql_num_rows($result);
If($rows ==0)
{
echo 'ACCES DENIED!';
exit();
}
$array=mysql_fetch_array($result);
Echo $array['balans'];
?>

 


Я не буду рассказывать о содержании файла database.php, скажу только что это обычный в своем роде скрипт соединения с БД. Итак начинаем разбирать код файла…

В этом скрипте мы получаем из суперглобального массива $_POST значения переданные нам методом POST от какой-то формы(два текстовых поля и кнопка ‘ОТПРАВИТЬ’ в нашем случае). Затем мы ищем в таблице users запись у которой текст в поле login будет равен переменной $login и текст в поле pass будет равен переменной $pass. Затем если все правильно то мы с помощью функции mysql_fetch_array получаем массив из всех полей этой записи. Затем выводим конфиденциальный денежный счет пользователя который никто не должен знать.

На первый взгляд безобидный скрипт не правда ли? Вот на этом многие и прокалываются… Давайте подумаем, что будет если хакер введет логин virun(допустим что такая запись есть в таблице), а вместо пароля ' or 1=1--'. Теперь вместо нормального запроса ”SELECT * FROM users WHERE login=’virun’ and pass=’Переданный пароль’ мы получим ”SELECT * FROM users WHERE login=’virun’ and pass=’’ or 1=1”. Люди хорошо знающие SQL уже наверняка догадались в чем вся фишка… Теперь mysql ищет запись у которой поле login равно virun, и пустым паролем, если не находит то ищет запись у которой поле login равно virun и проверяет правильно ли выражение 1=1(что естественно правильно). И после всего этого выводит конфиденциальный счет пользователя как ни в чем небывало. Таким же способом можно передать различные команды MySQL: можно удалять целые базы, удалять таблицы, просто вырубить MySQL и т.д. Как видите этот метод атак очень опасен!

Теперь немного о том как избежать такой атаки.

Использовать функцию str_replace("'", "''", $str), где $str – это логин или пароль или что-то другое. В принципе этим мы убиваем 95% таких атак. Затем эту функцию также рекомендую использовать для удаления таких ‘опасных’ операторов как insert, drop,; , --. Еще рекомендую ограничивать длину пароля и логин. Если он максимум в 15 символов, то зачем же разрешать вводить 50 и более? Здесь нам поможет функция strlen.

Ну вот собственно и все, и помни предупрежден значит- вооружен! Успехов тебе кодер. До встречи!

http://www.noil.pri.ee



Опубликовал admin
20 Дек, Четверг 2007г.



Программирование для чайников.