Полное руководство по SQL инъекции


Что такое SQL Injection


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

0x00 - Intro


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

0x01 - Что такое MySQL


"SQL" означает "построена языка запросов", которая просто позволяет пользователям посылать запросы на сервер базы данных. Существуют различные типы SQL, таких как MSSQL, который является версией Microsoft, языка, а также имеет некоторые другие команды, а также синтаксис.

0x02 - Обнаружение SQL инъекций


Прежде чем перейти к этой теме я хочу объяснить вам, о комментариях в MySQL. Есть три варианта для комментариев на этом языке: 

--
/*
#

Как вы уже знаете, комментарии просто блокирует раздел, чтобы он не будет выполнен по запросу. Как правило, в любое время вы увидите страницу с веб-сайта, который принимает в paramater, таких как: 

?id=
?category_id=
?user_id=

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

" and 1=1--

в конце URL-адреса и посмотреть, если содержимое страницы изменения, даже малейшей, если они не затем добавьте 

" and 1=0--

(Она не должна быть 1 = 1 или 1 = 0, только то, что возвращает верно для первого заявления и ложные в секунду) и посмотреть, если он изменяется после второго. Если содержимое изменится после второго запроса, то у вас есть уязвимости.

0x03 - сбор информации


Для того, чтобы ваша работа или жизнь немного легче, вы должны искать по всему сайту некоторые собрать информацию о том, что вы пытаетесь извлечь. Например, если сайт имеет вид регистрации пользователя в исходный код страницы и обратите внимание на имена полей, которые они используют (большинство разработчиков ленивы и использовать те же имена для простоты), вы также можете осмотреть место для более уязвимости. Хорошо так, как только вы нашли полезную информацию с нетерпением ждать, самое время узнать, сколько столбцов выбирается из базы данных от исходного запроса. Это важный шаг, потому что, если количество столбцов "выберите" и номер оригинального не идентичны, инъекции не работает! Чтобы узнать номер столбца можно просто добавить "порядок по х" на конце вашего уязвимых URL заменить "х" с увеличением числа пока вы не получите сообщение об ошибке 

http://www.site.com/vulnerable.php?id=4 order by 9--

Количество столбцов выбирается это значение х до ошибки.

0x04 - инъекция


Я полагаю, это то, где некоторые люди путаются. В MySQL для того, чтобы объединить два запроса заявления Вы можете использовать ключевое слово "союз", вы можете также включить слово "все", который будет dislay все результаты (по умолчанию свойство союза для удаления повторяющихся результатов дисплей). После того, как "объединение всех", вы также должны inlcude ключевое слово "выбор", так как мы будем хотеть, чтобы выбрать базу данных и отображение информации на экране до сих пор вы должны обратить внимание на что-то подобное: 

http://www.site.com/vulnerable.php?id=4 union all select

Continueing инъекции, как и в предыдущем примере будет работать нормально, но она также будет отображать все оригинальные результаты, а также наши новые результаты, как правило, в обход этого я, как и большинство других людей, использование SQL-инъекции, relace идентификатора значение, В нашем примере это будет 4, с одним из следующих действий: 

-1
null

или любой результат, который не был бы в базе данных, таким образом, первоначальный запрос на выборку не приведет ничего, кроме нашего нового вводится запрос на выборку будет отображаться. В SQL каждого столбца выбирается должны быть разделены запятой (,) так что если ваш сайт уязвимых выбор 4 колонки с первоначальным заявлением (которое было найдено ранее, когда мы собирали информацию с помощью «заказ»), вы бы просто concatinate тех на инъекцию, я хотел бы установить в каждом столбце в другой числовое значение, как я могу отслеживать, какие столбцы фактически отображается на экране. До сих пор, если все уже идет хорошо, вы должны иметь инъекции URL выглядеть примерно так: 

http://www.site.com/vulnerable.php?id=-1 union all select 1,2,3,4--

Если нет, то вернитесь назад и продолжайте чтение, пока не понять. В последней части нашего инъекции установка говоря запрос, таблица "выберите" информацию из, мы делаем это с помощью ключевого слова "из таблицы" ... очень нуждается explanitory не так ли? Так, например, у нас есть уязвимый сайт, который имеет 4 колонки выбирают, и мы хотим, чтобы посмотреть на «пользователей» таблицы мы можем иметь настройки, такие как: 

http://www.site.com/vulnerable.php?id=-1 union all select 1,2,3,4 from users--

Достаточно просто до сих пор, теперь, где это становится немного сложнее, но не слишком много.

0x05 - таблиц и столбцов


В зависимости от версии MySQL администраторы работают на сервере, найти имена таблиц и столбцов может быть очень простым или несколько раздражает. Существует простой способ выяснить, какая версия запущена на сервере, вы можете догадаться? Если вы не догадывались версии (), какого черта нет, его, как один из самых простых и само explanitory вещи никогда! В любом случае, заменить один из столбцов в инъекции, которая отображает на экране с версией вызова функции (), и это скажет вам, что обычно его либо 4.xx или 5.xx Если они работают или иной форме версии 4, то вы повторно в основном на свой собственный, когда дело доходит до выяснения имена таблиц и столбцов (я выложу несколько примеров распространенных имен позже), но если 5-й версии реализован, то ваша жизнь легка. Начиная с версии MySQL 5.1 разработчики начали автоматически включать основной базы данных на сервере INFORMATION_SCHEMA. В information_schema есть таблицы, которые дают информацию обо всех таблиц, столбцов, пользователи и т.д. по всей SQL Server (чтобы узнать больше о структуре information_schema и таблицы / столбцы имен посетить http://dev.mysql.com/doc / refman/5.0/en/information-schema.html). После того как вы выяснить имя таблицы и некоторые имена столбцов в этой таблице вы хотите посмотреть на просто разместить их в нашу инъекций установки от до, предположим, у нас есть сайт, который имеет "пользователи" таблицы и столбцов "пользователь" и "пас" , а второй и третий столбцы отображаются на экране, мы могли бы рассматривать эти по инъекций, таких как: 

http://www.site.com/vulnerable.php?id=-1 union all select 1,user, pass, 4 from users--

Этот пример покажет, как пользователя и пароль на экран в данной позиции, несмотря на то, что произойдет, если только один столбец выбран или отображается? В MySQL есть функция под названием CONCAT (), которая просто concatinates поля вместе так, чтобы упростить нашу privious Например, мы могли бы: 

http://www.site.com/vulnerable.php?id=-1 union all select 1, concat(user,0x3a, pass), 3, 4 from users--

"0x3a" это просто двоеточие (:) в шестнадцатеричном, просто отделить два поля для собственного просмотра.

0x06 - Сужение выбора


Обычно при выполнении SQL инъекция есть несколько результатов вы хотите посмотреть или возможно только одного человека. Есть несколько способов, чтобы сузить выбор Первый способ заключается в использовании ", где" ключевое слово просто берет логического параметра, такие как "где ID = 1", который будет выглядеть в идентификатор столбца в таблице, и определить, какие строки равным 1. Следующий способ использования "лимита" ключевое слово, и таким образом немного более полезно, поскольку вам не нужно знать имя дополнительные колонки для увеличения через предел выборов принимает два параметра, с чего начать выбор, и как много, чтобы выбрать . Поэтому, чтобы выбрать только первый "пользователь" со стола "пользователи" с помощью "предел" ключевое слово может иметь: 

http://www.site.com/vulnerable.php?id=-1 union all select user from users limit 0,1--

смотреть на остальных пользователей в отдельности просто увеличиваем 0 до пока Вы не получите сообщение об ошибке. Для того, чтобы взглянуть на все результаты в одной салфетки можно использовать функцию group_concat (), который работает очень похоже на CONCAT () за исключением того, отображает все результаты для данного столбца (ы) разделенных запятыми (,) ( запятой просто по умолчанию, вы можете изменить его с помощью "разделителя" ключевое слово и указать символ для использования).

0x07 - Препятствия


Исключая тот факт, что версии 4 в целом является одним из препятствий, есть несколько различных веб вещи разработчики могут сделать, чтобы попытаться сделать SQL-инъекции немного сложнее. Наиболее распространенными из этих неприятностей было бы magic_quotes, в основном волшебные кавычки запрещает любой вид кавычек и разбивает его, добавляя обратный слеш (\), что, конечно, будет портить ваши инъекции. Чтобы обойти это есть хороший маленький символ функции (); символ () принимает значения ASCII и генерирует соответствующие значения характер, тем самым устраняя необходимость для цитаты. Пример время ..., мы хотим, чтобы посмотреть на "проход" столбец таблицы "Пользователи", но только там, где "пользователь" столбец только равный "администратора" и на сайте выбирает только одну колонку от первоначального запроса, легко Достаточно ли? Мы узнали об этом раньше 

http://www.site.com/vulnerable.php?id=-1 union all select pass from users where user="admin"--

Кривая мяч! Разработчики включили magic_quotes поэтому ваш "администратора" не будет работать должным образом ... Я знаю его грустным. Чтобы исправить это, мы просто берем ASCII значения каждого символа (http://crashoverron.t35.com/ascii.php), так что теперь мы получаем 

http://www.site.com/vulnerable.php?id=-1 union all select pass from users where user=char(97,100,109,105,110)--

ТА-ДА! введение фиксированной. Кроме того, другой функцией безопасности пытаются блокировать нас есть регулярные выражения для поиска наш вклад, но часто у них есть свои выражения установлен в таких узких возможностей, которые вы можете обойти их, просто меняется так, символ комментария, или заменяя пробелы " + "(SQL не чувствителен к регистру, он также считает, что" + "в качестве наполнителя пространства так же, как пространство).

0x08 - Дополнительные возможности


Хотя я уже говорил ранее версии 4 была боль в заднице, я также заметил, приятной особенностью, общей для версии 4 уязвимых сайтов, которые я встречал в своих приключениях, эта функция будет функцией load_file (), не говорю, что функция является эксклюзивным до версии 4, но из моего опыта, чаще всего включена для текущих пользователей разработчики по каким-то причинам в этой версии. load_file () работает так же, как file_get_contents () из PHP в том, что она возвращает содержимое файла в строку формата.Если этот параметр включен, что позволяет не только для SQL хаки стилей на сервере, теперь позволяет уязвимостей LFI также. Несмотря на то, load_file () должен иметь точные полный путь к файлу, который вы пытаетесь открыть, например: / Главная / CrashOverron / Desktop / файл, и если вводить как строку символов, то оно должно быть заключено в кавычки, который приносит назад вопрос о magic_quotes но по-прежнему использовать только символ () функцию.Следующая интересная особенность, которая вряд ли возможно, но я видел случиться, это использование "INTO OUTFILE" ключевых слов. Это полная противоположность load_file () для того, чтобы использовать любую из этих возможностей текущего пользователя, что MySQL работает как должно быть FILE привилегии на сервере. Опять же, полный путь, необходимых для выходного файла, который не может быть существующий файл, хотя в отличие от load_file () символ () функция не исправить magic_quotes. Время для примера так, вот ситуация: уязвимый сайт 1 колонка выбраны также «пользователей» стола. magic_quotes load_file нет: 

http://www.site.com/vulnerable.php?id=-1 union all select load_file('/etc/passwd')--

load_file с magic_quotes: 

http://www.site.com/vulnerable.php?id=-1 union all select load_file(char(47,101,116,99,47,112,97,115,115,119,100))--

INTO OUTFILE: 

http://www.site.com/vulnerable.php?id=-1 union all select "test" INTO OUTFILE "/etc/test" from users--

0x09 - Blind SQL Injection


Слепые инъекции SQL происходит, когда первоначальный запрос на выборку получает информацию столбца, но не отображает его на экране. Для того, чтобы продолжать с помощью слепой SQL-инъекции необходимо в основном грубой силой любое значение вы хотите знать.Есть несколько функций, которые можно использовать в связке друг с другом, что сделать это довольно простой, но утомительный, это были бы в середине () и ASCII () функции. середина () является подстрокой функции MySQL и ASCII () делает прямо противоположное символ () он принимает характер и обмена его с соответствующим значением ASCII цифры. Делать это позволяет определить диапазон каждого из наших нужное значение в ASCII на графике, что сужение каждого вниз, пока не найдем матча. Пример ситуации, мы обнаружили, что сайт является уязвимым к слепой SQL-инъекции, и мы хотим, чтобы выяснить, какой пользователь MySQL в настоящее время работает как наша инъекция последовательность может выглядеть примерно так: 

http://www.site.com/vulnerable.php?id=1 and ascii(mid(user(),1,1)) < 97--

(Это скажет нам, если первая буква в пользовательском выше / ниже "", то мы можем изменить 97 различных значения, пока не найдем символ первой букве) 

http://www.site.com/vulnerable.php?id=1 and ascii(mid(user(),2,1)) < 97--

(Так же, повторяю, как и прежде поддерживать увеличивая через буквы, и вы будете в конечном счете, для текущего пользователя)

0x10 - Вход байпаса


Хорошо, я оставил это в конце, потому что это на самом деле не очень распространен больше, но буду через него, потому что я полагаю, вы можете столкнуться он однажды (я только натыкался на этот раз уязвимость в реальном мире). Концепция, лежащая в обход входа SQL достаточно прост, для того, чтобы выполнить использовать вводе имени пользователя в поле пользователя, то в поле пароля в виде вы положите: 

' or 1=1--

это просто заканчивается текущее поле пароля и включает в себя логическое ИЛИ с постоянным верное утверждение. Простой вход в MySQL скрипт может выглядеть следующим образом: 
<?php $user = $_POST['user']; $pass = $_POST['pass']; $ref = $_SERVER['HTTP_REFERER']; if((!$user) or (!$pass)) { header("Location:$ref"); exit(); } $conn = @mysql_connect("localhost", "root", "blah") or die("Could not connect"); $rs = @mysql_select_db("db", $conn) or die("db error"); $sql = "SELECT * FROM users WHERE user=\"$user\" AND pass=\"$pass\""; $rs = mysql_query($sql, $conn) or die("query error"); $num = mysql_numrows($rs); if($num != 0) { echo("Welcome $user"); } else { header("Location:$ref"); exit(); } ?> 

так что, если мы введем пользователя "администратор" и "" или 1 = 1 - "в качестве пароля запрос отправляется на сервер будет выглядеть следующим образом: 
"SELECT * FROM users WHERE user="admin" AND pass="" or 1=1--"

так что сервер будет выбрать строку, в которой "пользователь" равно "администратора" и игнорировать, если "проход" это правильно, потому что он спрашивает, если проход OR 1 = 1, правда, с 1 = 1 всегда истинно вам обойти проходить секции.

0x11 - Полезные Ключевые слова / Функции



UNION ALL SELECT AND/OR ORDER BY WHERE LIMIT LIKE INTO OUTFILE char() ascii() mid() concat() group_concat() load_file() user() database() version()
Автор CrashOverron

Комментариев нет:

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