Какво е SQLi

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

Като начало – ето една схема на нормална http заявка ( или какво се случва, когато щракнете нещо в браузъра )

1.

браузъра изпраща HTTP Request към сървъра, на който се намира желания сайт
2.

на сървъра тази заявка се обработва от HTTP сървъра ( който може да бъде Apache, IIS и т.н ). Ако заявката е към статичен HTML файл, то сървъра направо връща информация на браузъра. Ако обаче заявката е за динамична страница, която трябва да се генерира в момента ( а това са близо 95% от всички страници напоследък ) то:
3.

HTTP сървъра извиква скриптовият интерпретатор – най-често това e PHP, но също така може да е ColdFusion, ASP, JSP и т.н.За да е максимално лесно и просто да се използва какъвто и да е език за програмиране и съответно интерпретатор е стандартизиран интерфейса между сървъра и интерпретатора – т. нар. CGI. Този стандарт също така описва начините за предаване на различни параметри към скриптовете, които трябва да генерират страницата – въщност точно това се случва с цялата информация ( и не само с нея ), която пишете по форми и полето в уеб-страниците – тя се изпраща като параметри на някой такъв скрипт и в резултат скрипта по някакъв начин ги обработва – записва, проверява и т.н. В много случаи обаче има нужда да се работи с големи обеми информация. Тогава повечето езици за програмиране не са най-удобното и производително решение, а се изпраща заявка към:
4.

База данни. Всъщност по-пълното име трябва да е “сървър за управление на релационна база данни“. Сложничко, нали ? Най-често използваните сървъри при уебсайтовете са MySQL, но същата функция може да се изпълнява и от Oracle, MSSQL сървър, PostreSQL. Забелязвате ли повтарящото се “SQL” ? Това е името на стандартния протокол, с който можете да искате определена информация от базата данни ( например – “покажи ми всички потребители, родени след 1980 г.” ). Та PHP скрипта използва SQL, за да извлече нужната му информация от базата данни. Конкретната SQL заявка се съставя в зависимост от това, каква информация е необходима ( най-често с използването на същите онези параметри, предадени на PHP интерпретатора. ).
След като SQL сървъра върне необходимата информация, скриптовия интерпретатор я обработва, генерира HTML страница, която бива изпратена от HTTP сървъра на браузера на клиента, изпратил заявката.

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

Забелязахте ли как едни параметри, които се изпращат от браузера ( напр. текст, попълнен във форма ), стига до PHP интерпретатора и евентуално се използва за съставяне на SQL заявка, която обработва нещо ? Всъщност SQL Injection е съставяне на такава HTTP заявка, с параметри, които всъщност изпълняват нещо друго. Например:

SQL заявката, която ще изтрие цялата информация от дадена таблица в базата данни е “DROP TABLE ”. Ако програмиста, писал конкретния скрипт не е бил достатъчно внимателен и не е проверявал какво точно пристига като параметри е напълно възможно да имаме следния код:

$SQL=“SELECT * FROM users WHERE username=“ + $ime + „;“;

Което би трябвало да генерира заявки от рода на:

SELECT * FROM users WHERE username=“pencho“;
SELECT * FROM users WHERE username=“ivan“;

и т.н. според стойността на променливата $ime. Както виждате, една SQL заявка завършва с точка и запетая. Ако обаче някой намери начин в променливата $ime да се запише не просто “pencho”, а малко по дългото „pencho; DROP TABLE users;“, крайната заявка, която ще се изпрати към базата данни е:

SELECT * FROM users WHERE username=“pencho“;DROP TABLE users;“

Хоп и проблем… Целият списък с потребителите хваща гората. Най-лошото е, че в повечето случаи на атакуващия не му трябва друг инструмент, освен браузър – просто пише SQL заявката в поле на дадена форма. Разбира се, не е задължително тази SQL заявка да изтрие цяла таблица. Може “само” да смени паролата на администратора…

Advertisements

Вашият коментар

Попълнете полетата по-долу или кликнете върху икона, за да влезете:

WordPress.com лого

You are commenting using your WordPress.com account. Log Out / Промяна )

Twitter picture

You are commenting using your Twitter account. Log Out / Промяна )

Facebook photo

You are commenting using your Facebook account. Log Out / Промяна )

Google+ photo

You are commenting using your Google+ account. Log Out / Промяна )

Connecting to %s

%d bloggers like this: