LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Bezpečnosť webovej aplikácie I.

Bezpečnosť počítačov v dnešnej dobe je dosť podceňovaná a braná na veľmi malú váhu, čo je veľmi veľká chyba. Rozhodol som sa napísať malý tutoriál, v ktorom vás oboznámim s najčastejšími a najzakernejšími útokmi. V tomto jednom článku sa pokúsim stručne opísať a navrhnúť riešenie najzávažnej zraniteľnosti, tou je Injection.

9.3.2012 00:00 | Marek Beleščiak | Články autora | přečteno 4579×

Za pomoci tejto zraniteľnosti dokáže útočník donútiť program či skript niečo, čo jeho vývojár pôvodne nechcel aby vykonal. Táto zraniteľnosť sa hojne vyskytuje na celom internete vo velkom počte stránok. Je veľa miest, kde sa dá vykonať injektáž, ja sa ale budem venovať len dvom a tie sú SQL Injection a Log injection. Podstatou tohto útoku je nedostatočná kontrola vstupu a z pôvodného plánu vznikne upravený nebezpečný kód. Pozrite si nasledúci dopyt na databázu:

SELECT name, city FROM customers WHERE id = 1

Len málokedy je premenná id statická, takže musíte za id dosadiť vstup, aby ste dostali to, čo potrebujete. Obrovská časť php programátorov to robí veľmi zlým ale zato obľubeným spôsobom. Proste tam dosadia vstup spojením dvoch reťazcov:

$sql = "SELECT name, city FROM customers WHERE id = " . $_GET['id']

Pre neznalcov php poviem len, že $_GET je pole vygenerované z QUERY_STRING. Problém je, ale, že nevieme, čo sa skrýva za magickým $_GET['id']. Príklad: pokiaľ by $_GET['id'] sa rovnal "1 OR 1=1" náš dopyt by zmenil podobu na:

SELECT name, city FROM customers WHERE id = 1 OR 1=1

Tento kód namiesto zobrazenia jedného zákaznika zobrazí úplne všetkých. Tento dopyt je sám o sebe neškodný, ale po jeho úspechu si už útočník nájde cestu.

Riešenie ?

Problém je len v tom, že id má byť číslo a nemá sa interpretovať ako reťazec. Medzi jedno z riešení patrí veľmi obľubené a elegatné printf(), funkcia ktorá má veľa variantov (sprintf,snprintf,vprintf,...) stále ale vravíme v podstate o tom istom. Náš problém vyrieší aj nasledujúca funkcia:

sprintf("SELECT name, city FROM customers WHERE id = %u", $_GET['id']);

Podotýkam, že formátov je v printf veľa, tie najbežnejšie sú %f (float), %d,%i (číslo), %u (kladné číslo), %s (reťazec). S takýmto interpretovaním našho dopytu sme ošetrili vstup a môžme bezpečne odoslať dopyt databázovému serveru.

Ďalším, asi najhorším problémom je, keď máte odoslať na server nejaký reťazec, dáta. Uveďme si zasa nejaký príklad napr. s prihlasením používateľa:

SELECT id, name, email, ip FROM account WHERE name = '%s' AND password = '%s'

Zasa nemôžeme dôverovať dátam zo vstupu, pretože v nich môže byť absolutne hocičo. Príklad: pokiaľ by sme do mena dali "' OR 1=1 #" náš dopyt by sa zmenil na:

SELECT id, name, email, ip FROM account WHERE name = '' OR 1=1 #' AND password = (hash)

Ako vidíte, dopyt vráti absolutne všetky riadky v tabuľke pretože pre každy platí, že 1=1 a časť za # sa berie ako komentár takže ju server úplne ignoruje. Zvyčajne sa pracuje len s jedným, obyčajne prvým riadkom v tabuľke takže po tomto príklade sa prihlásite za prvého užívateľa, zvyčajne admina s vysokýmmi právami!

Existuje tu funkcia mysql_real_escape_string(), ktorá by mala danému problému predísť, escapnutím všetkých problémových znakov, takže náš dopyt by napokon vyzeral takto:

SELECT id, name, email, ip FROM account WHERE name = '\' OR 1=1' AND password = (hash)

V takejto podobe, už môžme bezpečne poslať dopyt na server, dôležité je aby ste reťazec uzatvorili do apostrofov príp. úvodzoviek.

Ultimátne riešenie

Asi rok dozadu som objavil jedno vynikajúce riešenie problému sql injection. Je ním prehodenie vstupu do hexadecimálnej reprezentácie a následne poslanie na server. Funkcia pre c/c++ mysql_hex_string(), php bin2hex(). Jediným obmedzením je asi to, že výsledný reťazec bude jeho pôvodná dĺžka * 2, ale myslím, že to není nejaký veľký problém pretože aj pre mysql_real_escape_string() musíte alokovať toľko isto miesta, otázna je len skutočná použitá časť, ktorá sa posiela na server.

Uveďme si malý príklad ako by vyzeral dopyt v hexadecimálnej reprezentácií:

Normál: SELECT id FROM users WHERE name = 'root'
Hex: SELECT id FROM users WHERE name = 0x726F6F74

Ako môžte sami vidieť, vstup je dokonale ošetrený tak, že znaky pôvodného reťazca sú zmenené na ich ascii hodnoty v hexe s 0x. Je tu ešte jeden spôsob a to namiesto 0xXX použiť mysql funkciu UNHEX().

Aby som nezabudol, pri písaní svojho programu nezabudnite dobre zvážiť používanie prepared statementov.

Log Injection

Log Injection je zraniteľnosť logov vyzerať inač ako by mali. Stručne vám vysvetlím o čo vlastne ide. Pozrite si nasledujúcu funkciu:

	int Log(const char* file, const char* user) {
		FILE* fp = fopen("access.log", "a");
		fprintf(fp, "User %s: Requested  File %s\n", user, file);
		fclose(fp);
	}
	

Náš log vypadá takto:

	User John: Requested File music.ogg
	User Joe: Requested File project.tar.gz
	

Naša funkcia ale nijak nekontroluje nepovolené znaky to znamená, že ak by sme jej podstrčili napr. správu "article.txt\nUser Admin: Requested File secret.gpg" a systém užívateľa "Joe" náš záznam správ by sa zmenil na:

	User John: Requested File music.ogg
	User Joe: Requested File project.tar.gz
	User Joe: Requested File article.txt
	User Admin: Requested File secret.gpg
	

Záver

Dúfam, že som vám objasnil princípy a problematiku tejto zraniteľnosti. Jediné, čo musíte robiť je stále, stále, stále kontrolovať vstupné dáta a nikdy im neveriť.

Verze pro tisk

pridej.cz

 

DISKUZE

Nejsou žádné diskuzní příspěvky u dané položky.



Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

15.5.2017 23:50 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 18. května od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.5.2017 16:42 /Honza Javorek
PyCon CZ, česká konference o programovacím jazyce Python, se po dvou úspěšných ročnících v Brně bude letos konat v Praze, a to 8. až 10. června. Na konferenci letos zavítá např. i Armin Ronacher, známý především jako autor frameworku Flask, šablon Jinja2/Twig, a dalších projektů. Těšit se můžete na přednášky o datové analytice, tvorbě webu, testování, tvorbě API, učení a mentorování programování, přednášky o rozvoji komunity, o použití Pythonu ve vědě nebo k ovládání nejrůznějších zařízení (MicroPython). Na vlastní prsty si můžete na workshopech vyzkoušet postavit Pythonem ovládaného robota, naučit se učit šestileté děti programovat, efektivně testovat nebo si v Pythonu pohrát s kartografickým materiálem. Kupujte lístky, dokud jsou.
Přidat komentář

2.5.2017 9:20 /Eva Rázgová
Putovní konference československé Drupal komunity "DrupalCamp Československo" se tentokrát koná 27. 5.2017 na VUT FIT v Brně. Můžete načerpat a vyměnit si zkušenosti z oblasti Drupalu 7 a 8, UX, SEO, managementu týmového vývoje, využití Dockeru pro Drupal a dalších. Vítáni jsou nováčci i experti. Akci pořádají Slovenská Drupal Asociácia a česká Asociace pro Drupal. Registrace na webu .
Přidat komentář

1.5.2017 20:31 /Pavel `Goldenfish' Kysilka
PR: 25.5.2017 proběhne v Praze konference na téma Firemní informační systémy. Hlavními tématy jsou: Informační systémy s vlastní inteligencí, efektivní práce s dokumenty, mobilní přístup k datům nebo využívání cloudu.
Přidat komentář

15.4.2017 15:20 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě IoT a radiokomunikace? Přijď na sraz spolku OpenAlt, který se bude konat ve středu 19. dubna od 18:30 v Šenkovně (Sokolská 60, Praha 2).
Přidat komentář

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

27.2.2017 22:12 /František Kučera
Pozvánka na 137. sraz OpenAlt – Praha: Tentokrát jsme si pro vás připravili neobvyklou akci. Ve středu 1.3. v 17:30 nás přivítá sdružení CZ.NIC ve svých prostorách v Milešovské ulici číslo 5 na Praze 3, kde si pro nás připravili krátkou prezentaci jejich činnosti. Následně navštívíme jejich datacentrum pod Žižkovskou věží. Provedou nás prostory, které jsou běžnému smrtelníkovi nedostupné!
Po ukončení prohlídky se všchni odebereme do hostince U vodoucha, Jagelonská 21, Praha 3 pochutnat si na některém z vybraných piv či dát si něco na zub. Rezervaci máme od 19:30, heslo je OpenAlt.
Ale pozor! Do prostor datového centra máme omezený přístup, dostane se tam pouze 10 lidí! Takže kdo přijde dříve, ten má přednost, a občanky s sebou! Kdo nebude chtít na prohlídku datového centra, může se pomalu přesunout do hostince U vodoucha a u nepřeberné nabídky piv počkat na ostatní.
Přidat komentář

18.1.2017 0:49 /František Kučera
Členové a příznivci spolku OpenAlt se pravidelně schází v Praze a Brně. Fotky z pražských srazů za uplynulý rok si můžete prohlédnout na stránkách spolku. Příští sraz se koná už 19. ledna – tentokrát je tématem ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. Také budete mít příležitost si prohlédnout pražský hackerspace Brmlab.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

1.8.2017 7:32 / Cassidy
structural consultants

30.7.2017 11:12 / Jaromir Obr
Národní znaky

27.7.2017 12:24 / Jaromir Obr
Cteni/zapis

26.7.2017 21:12 / Jaromir Obr
Podminka

15.6.2017 9:34 / Ondřej Havlas
php,

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze