Hem " SQL Injection 101: Vad är SQLi och hur man förhindrar angrepp

SQL Injection 101: Vad är SQLi och hur man förhindrar angrepp

06 augusti 2022 - säkerhet

Vad är SQL-injektion?

SQL-injektion (SQLi) är en typ av attack som gör det möjligt för brottslingar att exekvera skadliga SQL-satser mot sårbara webbapplikationer. Angripare kan komma åt känsliga data, som kundinformation, personuppgifter, affärshemligheter och mycket mer genom att kringgå applikationens säkerhetsåtgärder. Här kommer vi att diskutera SQL-injektion, hur det fungerar och hur du kan förhindra attacker.

SQL-injektionsattacker kan inträffa på alla webbplatser som använder en SQL-databas. Denna typ av attack gör det möjligt för angripare att få tillgång till dina viktiga data. De kan se konsumentinformation, personuppgifter, affärshemligheter och immateriella rättigheter. Detta är en av de allvarligaste typerna av attacker mot webbapplikationer, enligt OWASP.

Typer av SQL-injektion

Typer av SQL-injektion

In-band SQLi

In-band SQL injection är en attack där angriparen använder samma kanal för att skicka och ta emot frågor. In-band innebär att svaret erhålls med hjälp av samma kommunikationsmedium. Angriparens mål är att få svaret i en webbläsare omedelbart, om möjligt genom att utföra attacken manuellt med en webbläsare.

Exempel på in-band SQL-injektion

Det vanligaste sättet för en angripare att göra en SQL-injektion in-band är att ändra begäran så att de kan se den aktuella användarens personliga information. Detta kan göras genom att ändra det värde som skickas som en del av begäran. Om meddelandet till exempel skulle visa användarens namn, kan angriparen ändra det så att användarens namn visas i stället.

SELECT * FROM users WHERE user_id LIKE 'current_user'

Felbaserad SQLi och unionsbaserad SQLi är de två vanligaste formerna av SQL-injektion i band.

Felbaserad SQLi

En felbaserad SQLi-teknik är en metod för SQL-injektion i bandet som utnyttjar felmeddelanden från databasservern för att upptäcka databasens arkitektur. Felbaserad SQL-injektion är den vanligaste typen av in-band SQL-injektion.

Exempel på felbaserad SQLi:

Om en angripare försöker logga in med följande autentiseringsuppgifter:

användarnamn: ' OR 'a'='alösenord: något

Databasen kommer att returnera ett felmeddelande eftersom uttalandet är syntaktiskt felaktigt. Felmeddelandet avslöjar information om databasen, som angriparen kan använda till sin fördel.

Unionsbaserad SQLi:

In-band SQL-injektion är ett sätt att hämta information från en webbplats med hjälp av UNION-operatorn för att kombinera utdata från två eller flera SELECT-satser.

Blind SQL-injektion

Blind SQL-injektion är en attack där angriparen försöker få svar från databasen genom att ställa frågor som resulterar i ett sant eller falskt svar. Angriparen använder felmeddelanden för att se om applikationen reagerar annorlunda när en viss kod används.

När en hacker använder SQL-injektion kan webbapplikationen visa kritiska databasvarningsmeddelanden som anger att SQL-frågans syntax är felaktig. Blind SQL-injektion fungerar på samma sätt som traditionell SQL-injektion, med undantag för hur data hämtas från databasen. Om en databas inte innehåller tillräckligt med information för att en angripare ska kunna utnyttja den, måste angriparen ställa en rad frågor för att få fram data.

Blind SQL-injektion delas in i blind-booleanbaserad SQLi och blind-tidsbaserad SQLi.

Boolean-baserad blind SQLi

Boolean-based Blind SQL injection är en attack där angriparen försöker få svar från databasen genom att ställa frågor som resulterar i ett sant eller falskt svar. Angriparen använder felmeddelanden för att se om programmet reagerar annorlunda när en viss kod används.

Exempel på booleanbaserad Blind SQLi:

Om en angripare vill ta reda på databastypen använder han eller hon följande förklaring:

SELECT * FROM users WHERE user_id LIKE 'current_user' och database() like '%type%'

Om databasen är MySQL skulle utdata vara ungefär så här:

Du har ett fel i din SQL-syntax; kontrollera manualen som motsvarar din MySQL-serverversion för rätt syntax att använda nära 'and database() like '%type%" på rad

Tidsbaserad blind SQL-injektion

En tidsbaserad blind attack är när ett SQL-kommando skickas till servern med kod som gör att frågorna exekveras långsammare.

Tidsbaserade blinda attacker gör det möjligt för angripare att extrahera data baserat på åtkomsttid. En sådan attack är känd som en blind eller inferentiell injektionsattack. Det här är en typ av angrepp där inga data flödar mellan angriparen och databasen, men eftersom det inte finns något svar kallas det också för en blind injektionsattack.

Svarstiden indikerar om svaret är korrekt eller felaktigt. Om svaret är negativt kommer inkräktaren att göra en ny förfrågan. Denna angreppsteknik är långsam eftersom hackaren måste gå igenom varje tecken för sig, särskilt vid angrepp på stora databaser.

Exempel på blind SQLi

I det här exemplet försöker angriparen ta reda på om användaren med id=999 finns i databasen. För att göra detta använder de följande uttalande:

IF(SUBSTRING((SELECT password FROM users WHERE user_id=999),0, LEN('secret'))='secret', SLEEP(30), 'false')

Om användaren med id 999 finns i databasen och lösenordet är hemligt, kommer programmet att sova i 30 sekunder. Applikationen returnerar false om användaren inte finns i databasen.

SQLi utanför bandbredd

Den som vill stjäla data kan skicka SQL-kod till en databasserver på ett sätt som inte ingår i den vanliga kommunikationen mellan servern och andra datorer. Detta kan göras genom att skicka information till servern via DNS- eller HTTP-förfrågningar.

Appens svar påverkas inte av om data returneras eller inte, om det finns ett problem med databasen eller inte, eller hur lång tid det tar att exekvera frågan. Out-of-band kan användas i nätverksinteraktioner för att utlösa valfria händelser. Beroende på ett injicerat villkor kan dessa aktiveras villkorligt för att få kunskap en bit i taget.

Data kan också läcka via flera nätverksprotokoll från nätverksinteraktioner. Bilden visar den begäran som skickas från webbapplikationen till appens databas.

Exempel på SQLi utanför bandbredden

I det här exemplet försöker angriparen ta reda på om en viss användare finns i databasen. För att göra detta använder de följande uttalande:

SELECT user_id FROM users WHERE username='$username' AND password='$password' LIMIT 0,0 UNION SELECT NULL,'' INTO OUTFILE '/var/opt/databaser/$filename.php'; --

Programmet returnerar användarens användar-ID om användaren finns i databasen. Om användaren inte finns i databasen skapar programmet en fil som innehåller PHP-kod som kan användas för att utföra systemkommandon. Angriparen kan sedan använda den här filen för att köra kommandon på servern.

Så här förhindrar du en SQL-injektion

Det bästa sättet att skydda sig mot SQL-injektionsattacker är att använda indatavalidering, förberedda satser och parametriserade frågor. Koden ska aldrig använda användarens inmatning direkt. Utvecklare måste rensa all inmatning istället för att bara rensa inmatningar i webbformulär, t.ex. inloggningsformulär. Enkla citattecken bör elimineras från alla tvivelaktiga kodkomponenter. Det är också en bra idé att dölja databasproblem på live-webbplatser för att undvika att oavsiktligt avslöja dem. SQL-injektion kan ge information om ett databassystem som angripare kan använda till sin fördel.

Om du upptäcker ett problem med din webbplats bör du omedelbart ta den offline och kontakta din hostingleverantör. De kan hjälpa dig att avgöra om din webbplats har äventyrats eller inte och vilka steg du behöver ta för att åtgärda problemet. Under tiden ska du se till att alla användare av din webbplats känner till problemet och ändrar sina lösenord så snart som möjligt.

Förebyggande tips för att undvika SQL-injektioner

Det finns några sätt att undvika SQL-injektionssårbarheter i ditt programmeringsspråk och din databaskonfiguration. Dessa tekniker kan användas med de flesta databaser, till exempel XML. Du kan använda dessa tekniker för att göra dina databaser säkrare.

1) Användning av korrekt konstruerade lagrade procedurer

Nybörjare bör börja med att lära sig hur man skapar satser med variabler. Detta är enklare än att skapa dynamiska frågor, och det är lättare att förstå. Parametriserade frågor innebär att utvecklaren skapar all SQL-kod och sedan anger varje parameter vid ett senare tillfälle. Denna metod gör det möjligt för databasen att identifiera mellan källkod och information.

Prepared statements hjälper till att säkerställa att målet med en fråga inte ändras, även om någon försöker ge SQL-instruktioner.

2) Validering av inmatning för tillåt-lista

SQL-frågor använder bindningsvariabler på specifika platser för data. Om du till exempel använder Python skulle du använda %s platshållare. Du kan använda ett reguljärt uttryck för att validera användarens inmatning mot listan över tillåtna tecken i varje bindningsvariabel.

Om du använder JavaScript kan du använda \w för att matcha alfanumeriska och understreckade tecken.

Allow-listan bör vara så specifik som möjligt för att undvika falska positiva resultat.

Om du till exempel letar efter ett amerikanskt telefonnummer kan du använda följande reguljära uttryck:

/^\d{11}$/

Detta skulle matcha en sträng med 11 siffror som skulle kunna vara ett telefonnummer. Om någon försökte skicka in något i stil med 'abcdef', skulle det inte stämma och inmatningen skulle vara ogiltig.

Detta hjälper dig att se till att dina data är säkra och sunda. Om du behöver använda värden från kod i stället för användarparametrar är det också okej!

Det kan dock hända att användarparametervärden riktar sig till specifika tabell- och kolumnnamn. I så fall bör parametervärdena mappas till motsvarande tabell- och kolumnnamn för att säkerställa att obekräftade användarinmatningar inte kommer med i frågan.

3) Använd vitlistor

Filtrera inte användarinmatning baserat på svarta listor med dåliga tecken. Det är mycket effektivare att använda tillåt-listor med bra tecken som förväntas i specifika fält. Detta kommer att stoppa SQL-injektionsattacker innan de börjar.

Till exempel, tillåt bara siffror och bindestreck i inmatningsfältet om du förväntar dig ett telefonnummer. Om du förväntar dig en e-postadress ska du bara tillåta tecken som är giltiga i en e-postadress.

4) Använd de mest uppdaterade plattformarna

PHP har inte SQLi-skydd i äldre webbutvecklingsplattformar. Använd den mest uppdaterade utgåvan av programmeringsmiljön, språket och tillhörande teknik som finns tillgänglig. I stället för PHP använder vi i detta exempel PDO.

5) Skanna din webbapplikation regelbundet

SQL-injektioner kan vara mycket svåra att upptäcka. Det är viktigt att regelbundet skanna din webbapplikation efter sårbarheter.

6) Genomdrivande av lägsta privilegium

Principen om minsta möjliga behörighet är ett säkerhetskoncept som begränsar användarnas åtkomst till det minimum de behöver för att utföra sitt arbete. Detta innebär att man begränsar antalet konton som användarna har och vilka behörigheter dessa konton har.

LRF (Least Restriction on Functionality) är en metod och ett koncept för att begränsa användarrättigheter, konton och dataprocesser till endast de resurser som krävs för grundläggande, godtagbara uppgifter. Detta bidrar till att upprätthålla minimala användarrättigheter eller behörighetsnivåer, vilket är avgörande för att människor ska kunna utföra sina jobb på ett effektivt sätt.

Least privilege är en säkerhetsprincip som innebär att applikationer, system och prylar endast ska ha de behörigheter som krävs för att utföra en viss uppgift. På så sätt begränsas effekten om någon lyckas utnyttja en sårbarhet och göra skada. Detta står i kontrast till att ge användare fler behörigheter än de behöver, vilket ökar risken för betydande skada vid en SQL-attack.

SQL Injection - Vanliga frågor och svar

 
Vilken är den vanligaste SQL-injektionen?

In-band SQL-injektion är den vanligaste typen av SQL-injektionsattack. Det inträffar när en angripare kan använda samma kommunikationskanal för att leverera nyttolasten och samla in resultat.

Vad är det bästa försvaret mot SQL-injektion?

Det bästa försvaret mot SQL-injektion är att använda parametriserade frågor. Den här typen av frågor använder platshållarvärden för parametrar, som anges vid ett senare tillfälle. Denna metod gör det möjligt för databasen att skilja mellan källkod och information.

Hur upptäcks SQL-injektion?

SQL-injektion kan upptäckas på flera sätt. En metod är att använda en brandvägg för webbapplikationer (WAF). En WAF är en hårdvara eller mjukvara som sitter mellan en webbapplikation och internet. Den inspekterar trafiken efter skadlig aktivitet och kan blockera SQL-injektionsattacker.

Vad är SQL-injektion av andra ordningen?

SQL-injektion av andra ordningen inträffar när en angripare kan injicera en nyttolast som lagras av webbapplikationen och sedan exekveras senare. Denna typ av attack är svårare att genomföra eftersom angriparen måste ha ett sätt att utlösa exekveringen av den lagrade nyttolasten.

Vad är blind SQL-injektion?

Blind SQL-injektion är en attack där angriparen inte direkt ser resultaten av sin nyttolast. Istället måste de använda sanna eller falska påståenden för att härleda information från databasen. Denna typ av attack är mer utmanande att utföra men kan vara lika farlig som andra typer av SQL-injektion.

Vad är en staplad fråga?

En staplad fråga är en typ av SQL-injektion där angriparen använder flera frågor för att hämta information från databasen. Denna typ av attack är mer utmanande att utföra men kan vara mycket farlig om den lyckas.

Vad är en felbaserad SQL-injektion?

Felbaserad SQL-injektion är en attack där angriparen använder databasfel för att härleda information från databasen. Denna attack är mer utmanande att utföra men kan vara mycket farlig om den lyckas.

författarens avatar

säkerhet

admin är en senior personalförfattare för Government Technology. Hon skrev tidigare för PYMNTS och The Bay State Banner och har en BA i kreativt skrivande från Carnegie Mellon. Hon är baserad utanför Boston.

sv_SESwedish