Existuje několik případů, kdy tato funkce escape selže. Nejviditelnější je, když není použita jediná uvozovka:
string table= "\"" + table.Replace("'", "''") + "\""
string var= "`" + var.Replace("'", "''") + "`"
string index= " " + index.Replace("'", "''") + " "
string query = "select * from `"+table+"` where name=\""+var+"\" or id="+index
V tomto případě můžete "vyrazit" pomocí dvojité uvozovky, zpětného zaškrtnutí. V posledním případě není co "vylomit", takže stačí napsat 1 union select password from users--
nebo jakékoli užitečné zatížení SQL, které si útočník přeje.
Další podmínkou, kdy tato funkce escape selže, je, pokud je po escapování řetězce převzat podřetězec (a ano Ve volné přírodě jsem našel zranitelnosti, jako je tato):
string userPassword= userPassword.Replace("'", "''")
string userName= userInput.Replace("'", "''")
userName = substr(userName,0,10)
string query = "select * from users where name='"+userName+"' and password='"+userPassword+"'";
V tomto případě uživatelské jméno abcdefgji'
se změní na abcdefgji''
pomocí funkce escape a poté se změnil zpět na abcdefgji'
převzetím podřetězce. Toho lze zneužít nastavením hodnoty hesla na jakýkoli příkaz SQL, v tomto případě or 1=1--
by bylo interpretováno jako sql a uživatelské jméno by bylo interpretováno jako abcdefgji'' and password=
. Výsledný dotaz je následující:
select * from users where name='abcdefgji'' and password=' or 1=1--
T-SQL a další pokročilé techniky vkládání SQL, kde již byly zmíněny. Advanced SQL Injection In SQL Server Applications je skvělý dokument a měli byste si jej přečíst, pokud jste to ještě neudělali.
Posledním problémem jsou unicode útoky. Tato třída zranitelností vzniká, protože funkce escape nezná vícebajtové kódování a toho může útočník využít ke „spotřebování“ znaku escape. Přidání "N" před řetězec nepomůže, protože to neovlivní hodnotu vícebajtových znaků později v řetězci. Tento typ útoku je však velmi neobvyklý, protože databáze musí být nakonfigurována tak, aby akceptovala řetězce Unicode GBK (a nejsem si jistý, zda to MS-SQL dokáže).
Vložení kódu druhého řádu je stále možné, tento vzor útoku je vytvořen důvěryhodnými zdroji dat kontrolovanými útočníky. Escapování se používá k reprezentaci řídicích znaků jako jejich znakového literálu. Pokud vývojář zapomene ukončit hodnotu získanou z select
a poté tuto hodnotu použije v jiném dotazu než bam útočník bude mít k dispozici doslovnou uvozovku.
Vše otestujte, ničemu nevěřte.