Често задавани въпроси

Глупави въпроси няма, има само глупави отговори…

абонаменти

За ЧЗВ.нет

Хранилище на отговори на Често Задавани Въпроси. Като начало - основно в сферата на IT ( ИТ, Информационни Технологии... абе компютрите ). Ако не можете да намерите отговора на това, което живо ви интересува - питайте на vupros@chzv.net (опашката от чакащи отговори въпроси се намира на тук ) И за да не се заяждате за транслитерацията можете да изпращате и на vapros@chzv.net, vaprosi@chzv.net, question@chzv.net, faq@chzv.net...

Какво е SQL Injection ?

January 21st, 2008 от singu

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

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

Web_srv_php_diagram.png

  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 <DBNAME>”. Ако програмиста, писал конкретния скрипт не е бил достатъчно внимателен и не е проверявал какво точно пристига като параметри е напълно възможно да имаме следния код:

$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 заявка да изтрие цяла таблица. Може “само” да смени паролата на администратора…

И сега мисля, че е време да покажем отново онзи култов комикс на xkcd:
XKCD SQL Injection comics


Technorati :

Няма други подобни статии.

Публикувано в Сигурност |

Коментирайте

Внимание: Модерирането на коментари е включено и може да доведе до забавяне на публикуването на вашият коментар. Моля за търпение.