it-swarm-eu.dev

Využití vícebajtových znaků - PHP / MySQL

Mohl by mě někdo, prosím, poukázat na odkaz s některými informacemi o využití vícebytových znaků pro MySQL? Kamarád je upozornil, ale na internetu jsem nenašel mnoho informací.

20
Matthew S

Souhrn Ano, problém je, že v některých kódováních znaků (jako UTF-8) je jediný znak reprezentován jako více bytů. Jedním ze způsobů, jak se někteří programátoři pokoušejí zabránit injekci SQL, je před vložením do jejich dotazu SQL uniknout všem jednoduchým uvozovkám. Mnoho standardních funkcí, které unikají citacím, však nevědí o kódování znaků, které bude databáze používat, a zpracuje jejich vstup jako posloupnost bajtů, aniž by se zabývala skutečností, že jeden znak může zaplnit několik bytů. To znamená, že funkce úniku nabídek interpretuje řetězec jinak, než bude databáze. V důsledku toho jsou některé případy, kdy funkce úniku nabídek nemusí selhat při úniku částí řetězce, které bude databáze interpretovat jako vícebajtové kódování jediné nabídky; nebo by mohlo neúmyslně rozbít vícedajtové kódování znaků způsobem, který zavádí jedinou citaci, kde dříve nebyla. Využití vícebajtových znaků tedy poskytuje útočníkům způsob, jak provádět útoky SQL injekcí, i když si programátor myslel, že adekvátně unikají jejich vstupům do databáze.

Dopad Pokud používáte připravené/parametrizované příkazy k vytvoření všech databázových připojení, jste v bezpečí. Vícebajtové útoky selžou. (Samozřejmě se vyskytují chyby v databázi a knihovně. Ale empiricky se jeví jako vzácné.)

Pokud se však pokusíte uniknout nedůvěryhodným vstupům a poté dynamicky vytvoříte dotaz SQL pomocí zřetězení řetězce, můžete být zranitelní vícebajtovými útoky. Zda jste ve skutečnosti zranitelní, závisí na konkrétních podrobnostech funkce escape, kterou používáte, na databázi, kterou používáte, na kódování znaků, které používáte v databázi, a případně na dalších faktorech. Může být obtížné předvídat, zda budou vícebajtové útoky úspěšné. Výsledkem je, že vytváření dotazů SQL pomocí zřetězení řetězce je křehké a nedoporučuje se.

Technické podrobnosti. Pokud si chcete přečíst podrobnosti o útokech, mohu vám poskytnout řadu odkazů, které skvěle vysvětlují útoky. detail. Existuje několik útoků:

  • Základní útoky např. Na UTF-8 a další kódování znaků tím, že sežere další zpětná lomítka/uvozovky zavedené funkcí citování: viz např. zde .

  • Záludné útoky např. Na GBK, které fungují tak, že podvádějí funkci citace, která vám přináší další citát: viz např. blog Chris Shifletta , zde nebo - zde .

  • Útoky např. Na UTF-8, které zakrývají přítomnost nabídky pomocí neplatného nekanonického (příliš dlouhého) kódování jediné nabídky: viz např. zde . V zásadě má normální způsob kódování jediné nabídky zapadnout do jednobajtové sekvence (konkrétně 0x27). Existují však také vícebajtové sekvence, které by databáze mohla dekódovat jako jednoduchou nabídku, a které neobsahují 0x27 byte nebo jakákoli jiná podezřelá hodnota byte. Výsledkem je, že standardní funkce s únikem citací nemusí těmto nabídkám uniknout.

20
D.W.

Útoky s více bajty nejsou omezeny na SQL Injection. Obecně platí, že vícebajtové útoky vedou ke stavu „bajtové spotřeby“, ve kterém útočník odstraňuje kontrolní znaky. Toto je opak klasického ' or 1=1--, Ve kterém útočník zavádí kontrolní znak s jednoduchou citací. Pro mysql existuje mysql_real_escape_string(), který je navržen tak, aby se staral o problémy s kódováním znaků. Knihovny parametrizovaných dotazů, jako je PDO, tuto funkci použijí automaticky. MySQLi ve skutečnosti pošle parametry dotazu jako samostatný prvek v rámci struktury, což se problému zcela vyhýbá.

Pokud je stránka HTML vykreslena pomocí Shift-JIS, je možné získat kontrolní znaky pro získání XSS. Vynikající příklad byl uveden v „ Zamotaný web “ (fantastická kniha!) Na stránce 207:

<img src="http://fuzzybunnies.com/[0xE0]">
...this is still a part of the mkarup...
...but the srever dosn't know...
" onload="alert('this will execute!')"
<div>
...page content continues...
</div>

V tomto případě 0xE0 je speciální bajt, který označuje začátek 3 bajtového symbolu. Když prohlížeč vykreslí tento html, bude tok "> Spotřebován a přeměněn na jediný symbol Shift-JIS. Pokud útočník ovládá následující vstup pomocí jiné proměnné, může zavést obsluhu události, aby získal spuštění kódu.

5
rook