Хочу написать вот статью о технологии взлома sql. Как-то, имхо, статей объясняющих "как" - много – а "почему" - мало. Вот я и постараюсь объяснить это самое "почему" для тех, кому это интересно. Итак, приступим. Язык sql состоит из предопределённых ключевых слов и специальных символов. Для того чтобы извлечь какие-либо данные из таблицы данных, необходимо воспользоваться оператором SELECT. При работе с web приложениями, как правило, именно этот оператор с ключевыми словами FROM и WHERE. Внедряя инструкции sql в такие запросы, можно добиться результата не предусмотренного … гм… просто непредусмотренного Формат выражений языка строго не определён, потому одно и тоже выражение может быть записано несколькими способами – что немного усложняет восприятие инструкций языка. Ну, пожалуй, введение можно закончить. Перейдём к практике OR 1=1(Например видео от zFailure со взломом гостевой книги (advanced guestbook 2.2)) Очевидно, что это выражение создаёт логическое выражение, результатом выражения которого всегда будет "истина". Данное выражение используется, например, в запросах аутентификации когда проверяют пользовательские имя и пароль. Code: sqlAuth = "SELECT userid FROM logins WHERE name='" & Username & "' AND password='" & Password & "'" Если пользователь входит в систему с именем lexa и паролем lamer, то запрос будет выглядеть примерно так - Code: SELECT userid FROM logins WHERE name='lexa' AND password='lamer' Из вышенаписанного получается, что пользователь lexa не сможет зайти в систему пока значение lamer непопадёт в БД. Но если наш Алексей умело вставит значенпие OR 1=1, то он может избавить себя от проверки пароля. что-т типа того : Code: SELECT userid FROM logins WHERE name='lexa' AND password='lamer' OR 1=1 UNIONЭтот оператор используется совместно с SELECT для извлечения всех столбцов из таблицы. Синтаксис - Code: UNION ALL SELECT field FROM table WHERE condition Может использоваться например в сообщениях об ошибках sql. INSERTКак понятно из названия - этот оператор предназначен для добавления каких-либо значений в БД. С помощью этого оператора можно впринципе добавить нового пользователя - admin с паролем 123 Code: INSERT INTO Users VALUES('admin', '123') Мда... Всё таки письменно выражать свои мысли значительно тяжелее, нежели устно. хз что получилось Тем не менее надеюсь что это поможет хоть кому нибудь. В заключение приведу небольшую памятку сиволов которые можно использовать в sql injection. Code: ' Завершает выражение. Code: -- Однострочный комментарий. всё что за ним - игнорируется. Code: + Пробел Code: ,@переменная Добавляет переменную Code: ?Param=lam&Param=mal Присваивает переменной Param значения lam и mal Code: SET Объявление переменных. Используется для многострочных выражений. Заключение. Вот вижу что тут кому-то не понравилось . А ты сам напиши
Сори но чето я не догнал ' - это же не всегда завершает выражение, везде по разному... -- - только для mssql И про остальное тоже... тут же проще ?name=1' or 1=1/*
' virgoz. Насчёт кавычки? Попрошу поподробнее. Я что-то тебя не понимаю 0_0 А про комментарии - да. Я говорил именно о Microsoft sql server.
Тулзу простенькую накодил. Вот небольшую тулзу накодил, для облегчения взлома серверов, юзая скулю, где фильтруются / слешируются кавычки. (формирует из строки вида /etc/passwd строку вида char(47,101,116,99,47,112,97,115,115,119,100) ) простенькая, но полезная. качать тут http://ifolder.ru/4738224
PHP: <? $string='/etc/passwd'; $str='char('; for($i=0;$i<strlen($string);$i++) { $i==(strlen($string)-1)?$str.=ord($string[$i]):$str.=ord($string[$i]).","; } $str.=')'; echo($str); ?>
Code: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin edit2.Text :=''; edit2.Text :='char('; for i:=1 to length(edit1.Text) do begin edit2.Text :=edit2.Text+ inttostr((ord(edit1.text[i]))); if i <> length(edit1.Text) then edit2.Text:=edit2.text+','; end; edit2.Text:=edit2.text+')'; end; end. вот сурс дельфинский
http://webfile.ru/1658613 имхо самая удобная тема (спс какому-то мемберу, кто-то выкладывал...не помню)