Pokud uvedeme seznam zranitelností ve webových aplikacích, které měly největší dopad vzhledem k míře závažnosti, kterou mohou způsobit, bezpochyby najdeme SQL Injection. Tento zranitelnost útočníkovi může dokonce umožnit přejít od výpisu obsahu databáze k úplnému přístupu na serverPodívejme se, z čeho se skládá.
Termín injekce, odkazuje na vkládání nebo připojování příkazů SQL v dotazu, který aplikace provádí do databáze, to se provádí s využitím jakéhokoli vstupu dat, který aplikace požaduje přímo nebo nepřímo od uživatele, odkazujeme přímo na pole, například formuláře kde uživatel zadává určitá data, nepřímo by to mohly být parametry předávané prostřednictvím URL (GET). Cílem vložení příkazů SQL do dotazu je upravit logiku uvedeného dotazu nebo výsledku, který bude vrácen databází.
Toto je typický formulář, kde je pro přístup do soukromé oblasti vyžadováno uživatelské jméno a heslo. Kód na straně serveru, který tvoří dotaz, by vypadal nějak takto:
$ username = $ _POST ['username']; $ heslo = $ _POST ['heslo']; $ sql = "VYBRAT * OD uživatelů WHERE username = '$ username' AND heslo = '$ heslo'";Jak vidíme, nejprve se uloží uživatelské jméno a heslo zadané do proměnných uživatelského jména a hesla, poté jsou tyto hodnoty zahrnuty v dotazu, který bude odeslán do databáze, aby zkontroloval, zda uvedený uživatel existuje. Předpokládejme, že v našem příkladu uživatel zadá jako uživatelské jméno admin a heslo projít123Po odeslání formuláře bude vytvořený dotaz následující:
VYBRAT * OD uživatelů KDE uživatelské jméno = 'admin' A heslo = 'pass123'Jak vidíme, když jsou vstupní data umístěna, nacházejí se mezi jednoduchými uvozovkami, které představují, že se jedná o textový řetězec. Tento dotaz bude odeslán do databáze a vrátí výsledek s údaji uvedeného uživatele, pokud existuje, a bude povolen přístup do soukromé oblasti, jinak vrátí prázdný výsledek a přístup bude odepřen.
Jak jsme již zmínili dříve, SQL injekce Skládá se z připojení kódu SQL k dotazu a tento formulář to umožňuje prostřednictvím vstupních polí, takže máme aplikaci, která je náchylná k injekci SQL.
Využití zranitelnosti
Cílem využití této chyby zabezpečení je získat přístup do soukromé oblasti bez znalosti správného uživatelského jména nebo hesla a tuto chybu zabezpečení zneužít. Toho, čeho musíme dosáhnout, je vložit kód SQL tak, aby vytvořil dotaz, který vrátí platný výsledek.
Podívejme se, jak je dotaz vytvořen, pokud do pole pro heslo vložíme následující kód SQL:
Když je dotaz vytvořen, bude následující:
VYBERTE * OD uživatelů KDE uživatelské jméno = 'hacker' A heslo = '' nebo 1 = 1 # 'Důležitou pozornost je třeba věnovat skutečnosti, že vložený kód je mezi jednoduchými uvozovkami, které uzavírají heslo, za uzavření otevřených uvozovek v hesle odpovídá jednoduchá uvozovka na začátku vloženého kódu = dotaz, tímto způsobem dočasně získáme následující dotaz:
VYBRAT * OD uživatelů KDE uživatelské jméno = 'hacker' A heslo = ''Tento dotaz v tuto chvíli nevrací výsledky, protože takový uživatel s těmito přihlašovacími údaji neexistuje, pojďme však analyzovat zbytek vloženého kódu:
nebo 1 = 1 #Věta nebo 1 = 1 radikálně mění logiku dotazu, protože jak víme v dotazu tvořeném podmíněným NEBO Vrátí true, když je splněn alespoň jeden ze dvou výrazů, v našem případě je to první výraz username = 'hacker' AND heslo = '' , a druhý nebo 1 = 1 , druhé vždy platí, to znamená, že 1 se vždy rovná 1, protože dotaz vrátí platný výsledek.
Nakonec se musíme zbavit uvozovek, které uzavírají větu, k tomu můžeme použít komentáře použité v SQL: #, - (dvojitá pomlčka), Dobře /* */ . kompletní dotaz tedy zní:
VYBERTE * OD uživatelů KDE uživatelské jméno = 'hacker' A heslo = '' nebo 1 = 1 # 'Vše za # bude zohledněno jako komentář a nebude součástí dotazu.
Abychom získali platný výsledek, existuje mnoho dalších variací v kódu, které můžeme vložit, například: