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 7603×
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
|
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ů
28.11.2018 23:56 /František Kučera Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz 22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz 20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
Více ...
Přidat zprávičku
 Poslední diskuze
31.7.2023 14:13 /
Linda Graham iPhone Services
30.11.2022 9:32 /
Kyle McDermott Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš Re: zavináč
2.12.2018 23:56 /
František Kučera Sraz
5.10.2018 17:12 /
Jakub Kuljovsky Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
Více ...
|