Защита Иннокентия MySQL от SQL-инъекций
Автор:
Ашфак Ансари

Пересмотрены:
Рейтинг:
5
На Октябрь 19, 2012
Последние изменения:Январь 18, 2013

Резюме:

Подробное руководство о том, как предотвратить MySQL инъекций в PHP. Безопасные правила кодирования и функции для предотвращения SQL-инъекций.

Введение

 

Это краткое руководство о том, как защитить свою невинную MySQL базу данных из SQL-инъекция нападки.
 

Что такое SQL-инъекция?

 

Как следует из названия, SQL-инъекция происходит, когда пользователь вводит SQL заявления в ваше приложение.
 
Как это происходит?
 
Скажем, у нас есть простая форма входа, которая принимает имя пользователя и пароль, и проверяет в базе данных. Если имя пользователя и пароль проверяются, под которым пользователь зарегистрировался в систему.
 

Код для этого может выглядеть примерно так:
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?PHP
// получить имя пользователя и пароль с поста запросу
$user_name = $_POST[ "Имя пользователя" ];
$пароль  = $_POST[ "Пароль" ];

$запрос = "SELECT first_name, last_name, ACCOUNT_NUMBER ОТ users_table где имя пользователя = '$user_name'И пароль ='$пароль' ";

$результат = mysql_query( $запрос );

// проверить, если MySQL нашел ничего, и получить запись в случае успеха
если ( mysql_num_rows( $результат ) > 0 ) {
    $данные = mysql_fetch_assoc( $результат );
    эхо "Добро пожаловать" . $пользователь . '!';
    эхо «Ваш номер счета: ' . $данные[ 'ACCOUNT_NUMBER' ] . '';
} //Распечатайте errorr сообщение
еще {
    эхо "Имя пользователя или пароль не действительны! Пожалуйста, попробуйте еще раз!';
}
?>

 

Этот скрипт работает прекрасно, и это позволит подлинных пользователей ввести свои имя пользователя и пароль, чтобы увидеть номер банковского счета.
 

Давайте предположим, что я вхожу “демонстрация” как мое имя пользователя, и “demopass” как мой пароль, затем SQL запроса, который передается в MySQL будет выглядит Вам нравится эта:
 

1
SELECT, first_name, last_name, ACCOUNT_NUMBER ОТ users_table ГДЕ имя пользователя = "Демо" И пароль = 'Demopass' ;

 

Если наши входные данные успешно проходит проверку в базе данных, Затем мы будем вход в систему, и мы будем представлены номера счета еще мы не сможем получить доступ к системе, и мы будем представлены с сообщением об ошибке “Имя пользователя или пароль не действительны! Пожалуйста, попробуйте еще раз!
 

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

Давайте предположим, что пользователь пытается войти в систему как имя пользователя dem'o и пароль, что demopass.
 

Сейчас, Давайте посмотрим, как SQL заявление выглядит как.
 

1
SELECT, first_name, last_name, ACCOUNT_NUMBER ОТ users_table ГДЕ имя пользователя = ''o'И пароль ='demopass' ;

 

Когда MySQL в котором выполняется инструкция, он будет лечить только “dem” в качестве имени пользователя и при обнаружении другого ‘o', то оно лечит ‘o‘ как команды SQL и он будет бросать и сообщения об ошибках, поскольку он не признает ‘o‘ как допустимые команды SQL.
 
ОШИБКА 1064 (42000): У вас ошибка в запросе; Изучите документацию по используемой версии сервера MySQL на предмет корректного синтаксиса около 'O’ и пароль =”demopass”; ” в строке 1
 

Устрашающий. Данное сообщение об ошибке говорится, что есть некоторые ошибки в синтаксисе SQL. Если Волшебные кавычки были включены, тогда мы, возможно, не получил, что выше сообщение об ошибке.
 

Сейчас, давайте посмотрим, что произойдет, если злоумышленник вводит имя пользователя в качестве (‘ Или '1' = '1) и пароль, что “demopass“.

SQL запрос будет выглядеть следующим образом:

1
SELECT, first_name, last_name, ACCOUNT_NUMBER ОТ users_table ГДЕ имя пользователя = '' ИЛИ '1 '='1 ' И пароль = 'Demopass' ;

 

Что данный SQL запросов означает,? Это говорит MySQL, чтобы найти все строки с именем пользователя равна “” (пустой) или (1= 1) и пароль равна “demopass“.
 

Представим выше запрос SQL более логично понять, что на самом деле случилось с SQL заявление:
 

Имя пользователя = “” ИЛИ “1= 1” И пароль = “demopass”
 

Сейчас, Мы уже знаем, что 1 = 1 всегда будет верным. Следовательно, пользователь сможет войти в систему, если введен правильный пароль и имя пользователя не так.
 

Проанализируем более худший сценарий другой строкой атаки.
 

Атака струнных: ‘ OR 1 = 1–
 

Обратите внимание, что ( и #) используются, чтобы прекратить SQL заявление. Давайте поставим атаки строки в SQL запрос, и посмотрите, как последняя инструкция SQL будет выглядеть.
 

Сейчас, будем считать, что злоумышленник даже не знает пароля.
 

1
SELECT, first_name, last_name, ACCOUNT_NUMBER ОТ users_table ГДЕ имя пользователя = '' ИЛИ 1=1--'И пароль =' idonotknow ' ;

 

Посмотрите, как заявление SQL интерпретируется MySQL.
 

Имя пользователя = “” OR 1 = 1– И пароль = “idonotknow”
 

Пожалуйста, обратите внимание в приведенном выше заявлении. Как мы знаем, что это заявление терминатора в SQL и 1= 1 всегда верно, после отдыха заявление терминатор SQL запросов не будет выполнен.
 

Следовательно, Все записи в таблице будет получить вернулся и будет выполнен вход пользователя в систему. Нападающий сможете посмотреть номер счета первой записи в базе данных.
 

Поможем невинных MySQL
 

Волшебные кавычки

 

Волшебные кавычки является спорной особенностью PHP язык сценариев, где специальные символы подготовки состава обратную косую черту перед передачей на.
 

Волшебные кавычки были включены по умолчанию в новых установках PHP3 и PHP4, и так как их работа за кулисами, и не очевидно,, разработчики могут не знать об их существовании и потенциальные проблемы, которые они могут ввести.
 

Мы должны будем включить Волшебные кавычки в php.ini файл в веб--квадратный из веб-сайте.
 

Как волшебные кавычки помогает?

 

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

So usename = dem'o становится DEM 'O , и MySQL может работать с, что кавычки, как это “защищенный” косой чертой.
 

Давайте посмотрим, что происходит, когда Волшебные кавычки включена. Давайте посмотрим, как атакующий, пораженных волшебные кавычки?.
 

1
SELECT, first_name, last_name, ACCOUNT_NUMBER ОТ users_table ГДЕ имя пользователя = '\' OR 1 = 1 - ' И пароль = 'Idonotknow' ;

 

Имя пользователя интерпретируется как: \’ OR 1 = 1–

Это прекрасно бежал SQL запросов, ничто не может получить вводили. magic_quotes_gpc избегает опасного одинарные кавычки для нас. Следовательно, злоумышленник не сможет войти в систему.

Проблемы с волшебные кавычки?

 

Волшебные кавычки только вставить обратный слеш перед несколькими персонажами, Ничего больше. Это защищает нас от инъекции SQL только в некоторых частных случаях, как и выше, и только совпадение. Если у нас есть display_errors ON, мы просто сделали атакующий очень счастливы с вашими данными базы данных выводятся прямо на глазах. Даже если вы этого не сделаете, все еще есть возможность слепой SQL-инъекции и использования методов заранее SQL инъекции можно обойти magic_quotes_gpc функция.
 
Так, нам нужен способ избежать данных, которые не дрянные, является не как склонны к таким вопросам наборе символов, и не склонна к магии разведения полоснул котировки.
 
В Ноябрь 2005 ядро PHP разработчики решили из-за этих проблем, с которыми Волшебные кавычки функцией окажется быть удалены из PHP 6.
После Волшебные кавычки Особенности изымается, то будет некоторые серьезные проблемы возникали.
 

SQL-инъекция смягчения
 

Есть несколько способов, чтобы предотвратить MySQL Инъекции в PHP. Наиболее распространенные способы использования таких функций, как addslashes() и mysql_real_escape_string().
 

addslashes()

 

addslashes() возвращает строку с обратной косой черты перед символами, которые должны быть в санитарной обработке запросов к базе данных. Эти символы одинарные кавычки (‘ = ’) двойные кавычки (” = ”) и nullbyte (%00 = \0).
 

addslashes() будет работать только если строка запроса завернутые в кавычки. Строка, например, следующее будет по-прежнему уязвимы к SQL-инъекции:
 

1
2
3
$user_name = addslashes( $_POST[ "Имя пользователя" ] );
$пароль  = addslashes( $_POST[ "Пароль" ] );
$запрос = "SELECT first_name, last_name, ACCOUNT_NUMBER ОТ users_table где имя пользователя = '$user_name'И пароль ='$пароль' ";

mysql_real_escape_string()

 

mysql_real_escape_string() немного более мощный, чем addslashes() так как она вызывает библиотечную функцию в MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: \x00, \N, \R, \, ', ” и x1a.
 

Как и в случае addslashes(), mysql_real_escape_string() будет работать только если строка запроса завернутые в кавычки. Строка, например, следующее будет по-прежнему уязвимы к SQL-инъекции:
 

1
2
3
$user_name = mysql_real_escape_string( $_POST[ "Имя пользователя" ] );
$пароль  = mysql_real_escape_string( $_POST[ "Пароль" ] );
$запрос = "SELECT first_name, last_name, ACCOUNT_NUMBER ОТ users_table где имя пользователя = '$user_name'И пароль ='$пароль' ";

 

Sprintf()

 

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

1
2
3
$user_name = $_POST[ "Имя пользователя" ];
$пароль  = $_POST[ "Пароль" ];
$запрос = Sprintf("SELECT first_name, last_name, ACCOUNT_NUMBER ОТ users_table где имя пользователя = ''И пароль ='' ", $user_name, $пароль);

 

htmlentities($было, ENT_QUOTES)

 

htmlentities() В сочетании с опциональной второй параметр quote_style, позволяет использовать ENT_QUOTES, которая преобразует и двойные, и одиночные кавычки. Это будет работать в том же смысле, addslashes() и mysql_real_escape_string() в отношении кавычки, однако, Вместо указания в начале обратную косую черту, он будет использовать HTML субъекта кавычки.
 

В дополнение к использованию ENT_QUOTES в пределах htmlentities(), Третий параметр может быть установлен которое заставляет использовать набор символов в рамках конверсии. Это поможет остановить непредвиденные результаты от использования многобайтовую символов в наборы символов, такие как BIG5 и ГПК.
 

Ниже приведен пример кода, которые помогут предотвратить SQL-инъекция в PHP.
 

1
2
3
4
5
$user_name = $_POST[ "Имя пользователя" ];
$user_name = htmlentities( $user_name, ENT_QUOTES, "UTF-8" );
$пароль  = $_POST[ "Пароль" ];
$пароль  = htmlentities( $пароль, ENT_QUOTES, "UTF-8" );
$запрос = "SELECT first_name, last_name, ACCOUNT_NUMBER ОТ users_table где имя пользователя = '$user_name'И пароль ='$пароль' ";

 

Оптимизация SQL-кода

 

Серверы баз данных комплекса зверей и они имеют гораздо большую функциональность, чем нужно. Что касается безопасности обеспокоен, больше никогда не бывает лучше. Например, the xp_cmdshell Расширенная хранимая процедура в MS SQL дает доступ к оболочке, и это именно то, что хакер мечты. Вот почему вы должны отключить эту процедуру и любая другая функциональность, который может легко быть использована. Просто удалите или хотя бы отключить все функции вы можете обойтись без.
 

Отключить по умолчанию SQL Сообщение об ошибке

 

Сообщения об ошибках полезны для злоумышленника, поскольку они дают дополнительную информацию о базе данных и SQL запросов. И все SQL атак, как правило, в зависимости от типа ошибки выдается SQL, это означает, что тип ошибки решает хакеров подход к хакерской атакой на сайт или приложение. Лучшее решение, которое не ставит под угрозу безопасность было бы проявлением общее сообщение об ошибке просто говорится, что произошла ошибка.
 

Хранить учетные данные базы данных надежно

 

Для того чтобы свести к минимуму повреждение в случае SQL Injection атак, Всегда храните учетные данные базы данных в отдельный зашифрованный файл. Теперь, даже если хакеру удается прорваться в, он или она не пойдет на пользу, сколько он не может сделать многое в вашей базе данных.
 

Используйте принцип наименьших привилегий

 

Принцип наименьших привилегий является весьма полезным, и это относится и к SQL инъекции также. Всегда думайте или проверьте дважды о том, что привилегии вы предоставляете пользователь или объект. Предположим, что вы бледный, чтобы обеспечить модератором доступ к некоторым пользователя, так что только предоставить ему доступ из тех таблиц, которые он / она нужна, , а не доказывать ему доступ всей базы данных. Если у вас есть, чтобы обеспечить доступ к системе, лучше, чтобы создания секционированной таблицы пространства внутри базы данных и предоставлять доступ только к определенным табличного пространства. Эта техника будет резко сократить поверхность атаки.
 

Отключить Корпуса

 

Многие базы данных предлагают доступ к оболочке к базе данных, которая по сути является то, что злоумышленник или хакерской потребности. Из-за этого вы должны закрыть эту лазейку открытым. Каждый поставщик услуг имеет другой метод, чтобы отключить выполнение снарядов на их базе данных. Так обратитесь к документации по базе данных о том, как отключить доступ к оболочке для вашего конкретного пространства базы данных или таблицы или конкретной таблице.
 

Использование служебных SQL Injection, чтобы проверить уязвимость

 

Последнее, но не менее, думать как хакер. Как хакер может взломать мою базу данных через SQL-инъекция, какие инструменты и методы, которые он может использовать, чтобы найти лазейки. Вы всегда должны иметь сухую вызов инструментов SQL инъекции, как взломать SQLi, Haviz, SQL injectme и т.д.. Больше, если вы можете позволить себе сканер сетчатки уязвимость то его слишком хорошо,. Как оно состоит из всех последних подвергаются уязвимости.

Большое спасибо. Я надеюсь, вы все, должно быть, наслаждалась. Пожалуйста, дайте комментарии, так что мы можем сделать больше лучше.

 
 

28,913 просмотров всего, 12 просмотров сегодня

Следующие две вкладки изменять содержимое ниже.

Ашфак Ансари

Исследователь безопасности
Ашфак Ансари является основателем HackSys команды кодовым названием "Panthera". Он исследователь безопасности с опытом работы в различных аспектах информационной безопасности. Он является автором "HackSys Экстремальные Уязвимые водителя" и "Shellcode смерти". Он также написал и опубликовал различные технические документы на эксплуатацию программного обеспечения низкого уровня. Его основной интерес заключается в "Низкий уровень эксплуатации", "Обратное проектирование", "Анализ программы" и "Гибридная Фаззинг". Он фанат искусственного интеллекта и машинного обучения. Он глава свинец для нулевой Пуне.

Оставить комментарий

Ваш электронный адрес не будет опубликован. Обязательные поля помечены *