Как работи атаката на SQL Injection

Съдържание

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

Терминът инжекция, се отнася до инжектиране или добавяне на SQL изрази в заявка, която приложението изпълнява към базата данни, това се осъществява с помощта на всеки вход за данни, който приложението изисква директно или индиректно от потребителя, ние се позоваваме директно на полета, например на формуляри когато потребителят въвежда определени данни, косвено те могат да бъдат параметри, които се предават чрез URL (GET). Целта на инжектирането на SQL изрази в заявката е да се промени логиката на въпросната заявка или резултатът, който ще бъде върнат от базата данни.

Това е типична форма, при която потребителско име и парола се искат за достъп до частна зона. Кодът от страна на сървъра, който формира заявката, ще бъде нещо подобно на следното:

 $ потребителско име = $ _POST ['потребителско име']; $ password = $ _POST ['password']; $ sql = "SELECT * FROM users WHERE username = '$ username' И парола = '$ password'"; 
Както виждаме, първо потребителското име и паролата, въведени в променливите за потребителско име и парола, се съхраняват съответно, след това тези стойности се включват в заявката, която ще бъде изпратена до базата данни, за да провери дали споменатият потребител съществува. Да предположим, че в нашия пример потребителят въвежда като потребителско име администратор и парола 123, когато формулярът е изпратен, формираната заявка ще бъде следната:
 SELECT * FROM users WHERE username = 'admin' AND password = 'pass123'
Както можем да видим, когато се поставят входните данни, те са между единичните кавички, за да представляват, че това е текстов низ. Тази заявка ще бъде изпратена до базата данни и ще върне резултат с данните на споменатия потребител, ако съществува, и достъпът до частната зона ще бъде разрешен, в противен случай ще върне празен резултат и достъпът ще бъде отказан.

Както споменахме по -рано, SQL инжекция Състои се от добавяне на SQL код към заявка и тази форма го позволява чрез полетата за въвеждане, така че да имаме приложение, което е уязвимо за SQL инжектиране.

Използване на уязвимостта
Целта на използването на тази уязвимост е да се получи достъп до частната зона, без да се знае правилното потребителско име или парола, и да се използва уязвимостта. Така че това, което трябва да постигнем, е да инжектираме SQL код, за да образуваме заявка, която връща валиден резултат.

Нека да видим как се формира заявката, ако инжектираме следния SQL код в полето за парола:

Когато заявката се формира, тя ще бъде следната:

 SELECT * FROM users WHERE username = 'hacker' AND password = '' или 1 = 1 # '
Трябва да се обърне важно внимание на факта, че вмъкнатият код е между единичните кавички, които обхващат паролата, единичният кавичка в началото на вмъкнатия код е отговорен за попълването на отворения кавичка в паролата = 'част от заявка, по този начин временно получаваме следната заявка:
 SELECT * FROM users WHERE username = 'hacker' AND password = ''
Тази заявка в момента няма да върне резултати, тъй като няма такъв потребител с тези идентификационни данни, но нека анализираме останалата част от вмъкнатия код:
 или 1 = 1 #
Присъда или 1 = 1 коренно променя логиката на заявката, тъй като както знаем в заявка, образувана от условното ИЛИ Той ще се върне, когато поне един от двата израза е изпълнен, в нашия случай първият израз е потребителско име = "хакер" И парола = "" , и втората или 1 = 1 , последното винаги е вярно, тоест 1 винаги е равно на 1, защото заявката ще върне валиден резултат.

Накрая трябва да се отървем от кавичките, които затварят изречението, за това можем да използваме коментарите, използвани в SQL: #, - (двойно тире), О, добре /* */ . следователно пълната заявка е:

 SELECT * FROM users WHERE username = 'hacker' AND password = '' или 1 = 1 # '
Всичко след # ще бъде взето под внимание като коментар и няма да бъде част от заявката.

За да получите валиден резултат, има много други варианти в кода, които можем да вмъкнем, например:

wave wave wave wave wave