tclover
13.02.2006, 00:18
Хочу написать вот статью о технологии взлома sql.
Как-то, имхо, статей объясняющих "как" - много – а "почему" - мало.
Вот я и постараюсь объяснить это самое "почему" для тех, кому это интересно.
Итак, приступим.
Язык sql состоит из предопределённых ключевых слов и специальных символов.
Для того чтобы извлечь какие-либо данные из таблицы данных, необходимо воспользоваться оператором SELECT. При работе с web приложениями, как правило, именно этот оператор с ключевыми словами FROM и WHERE. Внедряя инструкции sql в такие запросы, можно добиться результата не предусмотренного … гм… просто непредусмотренного :)
Формат выражений языка строго не определён, потому одно и тоже выражение может быть записано несколькими способами – что немного усложняет восприятие инструкций языка.
Ну, пожалуй, введение можно закончить.
Перейдём к практике :)
OR 1=1
(Например видео от zFailure со взломом гостевой книги (advanced guestbook 2.2))
Очевидно, что это выражение создаёт логическое выражение, результатом выражения которого всегда будет "истина". Данное выражение используется, например, в запросах аутентификации когда проверяют пользовательские имя и пароль.
sqlAuth = "SELECT userid FROM logins WHERE name='" & Username & "' AND password='" & Password & "'"
Если пользователь входит в систему с именем lexa и паролем lamer, то запрос будет выглядеть примерно так -
SELECT userid FROM logins WHERE name='lexa' AND password='lamer'
Из вышенаписанного получается, что пользователь lexa не сможет зайти в систему пока значение lamer непопадёт в БД. Но если наш Алексей умело вставит значенпие OR 1=1, то он может избавить себя от проверки пароля.
что-т типа того :
SELECT userid FROM logins WHERE name='lexa' AND password='lamer' OR 1=1
UNION
Этот оператор используется совместно с SELECT для извлечения всех столбцов из таблицы. Синтаксис -
UNION ALL SELECT field FROM table WHERE condition
Может использоваться например в сообщениях об ошибках sql.
INSERT
Как понятно из названия - этот оператор предназначен для добавления каких-либо значений в БД. С помощью этого оператора можно впринципе добавить нового пользователя - admin с паролем 123
INSERT INTO Users VALUES('admin', '123')
Мда... Всё таки письменно выражать свои мысли значительно тяжелее, нежели устно. хз что получилось :)
Тем не менее надеюсь что это поможет хоть кому нибудь.
В заключение приведу небольшую памятку сиволов которые можно использовать в sql injection.
' Завершает выражение.
-- Однострочный комментарий. всё что за ним - игнорируется.
+ Пробел
,@переменная Добавляет переменную
?Param=lam&Param=mal Присваивает переменной Param значения lam и mal
SET Объявление переменных. Используется для многострочных выражений.
Заключение.
Вот вижу что тут кому-то не понравилось ;). А ты сам напиши :)
Как-то, имхо, статей объясняющих "как" - много – а "почему" - мало.
Вот я и постараюсь объяснить это самое "почему" для тех, кому это интересно.
Итак, приступим.
Язык sql состоит из предопределённых ключевых слов и специальных символов.
Для того чтобы извлечь какие-либо данные из таблицы данных, необходимо воспользоваться оператором SELECT. При работе с web приложениями, как правило, именно этот оператор с ключевыми словами FROM и WHERE. Внедряя инструкции sql в такие запросы, можно добиться результата не предусмотренного … гм… просто непредусмотренного :)
Формат выражений языка строго не определён, потому одно и тоже выражение может быть записано несколькими способами – что немного усложняет восприятие инструкций языка.
Ну, пожалуй, введение можно закончить.
Перейдём к практике :)
OR 1=1
(Например видео от zFailure со взломом гостевой книги (advanced guestbook 2.2))
Очевидно, что это выражение создаёт логическое выражение, результатом выражения которого всегда будет "истина". Данное выражение используется, например, в запросах аутентификации когда проверяют пользовательские имя и пароль.
sqlAuth = "SELECT userid FROM logins WHERE name='" & Username & "' AND password='" & Password & "'"
Если пользователь входит в систему с именем lexa и паролем lamer, то запрос будет выглядеть примерно так -
SELECT userid FROM logins WHERE name='lexa' AND password='lamer'
Из вышенаписанного получается, что пользователь lexa не сможет зайти в систему пока значение lamer непопадёт в БД. Но если наш Алексей умело вставит значенпие OR 1=1, то он может избавить себя от проверки пароля.
что-т типа того :
SELECT userid FROM logins WHERE name='lexa' AND password='lamer' OR 1=1
UNION
Этот оператор используется совместно с SELECT для извлечения всех столбцов из таблицы. Синтаксис -
UNION ALL SELECT field FROM table WHERE condition
Может использоваться например в сообщениях об ошибках sql.
INSERT
Как понятно из названия - этот оператор предназначен для добавления каких-либо значений в БД. С помощью этого оператора можно впринципе добавить нового пользователя - admin с паролем 123
INSERT INTO Users VALUES('admin', '123')
Мда... Всё таки письменно выражать свои мысли значительно тяжелее, нежели устно. хз что получилось :)
Тем не менее надеюсь что это поможет хоть кому нибудь.
В заключение приведу небольшую памятку сиволов которые можно использовать в sql injection.
' Завершает выражение.
-- Однострочный комментарий. всё что за ним - игнорируется.
+ Пробел
,@переменная Добавляет переменную
?Param=lam&Param=mal Присваивает переменной Param значения lam и mal
SET Объявление переменных. Используется для многострочных выражений.
Заключение.
Вот вижу что тут кому-то не понравилось ;). А ты сам напиши :)