Union-based SQL Injection är en av de mest effektiva metoderna för att **exfiltrera (stjäla) data** från en databas. Den bygger på det faktum att en webbapplikation använder osäker användarinmatning i en SQL-fråga, men istället för att bara ändra frågans logik (som i Rum 4), lägger angriparen till en helt ny fråga med hjälp av kommandot **UNION SELECT**.
Kommandot UNION används i SQL för att slå ihop resultaten från två separata SELECT-frågor till ett enda resultatset. För att detta ska fungera måste båda SELECT-frågorna ha **samma antal kolumner** och **kompatibla datatyper** i respektive position.
SELECT username FROM users WHERE id = {$id}.id=-1 eller id=0).UNION SELECT password FROM users WHERE username='admin'.UNION SELECT-frågan exekveras. Databasen returnerar lösenordet (password) i stället för användarnamnet (username), och webbapplikationen (som förväntar sig ett användarnamn) skriver ut det känsliga lösenordet på sidan.Huvudstegen för en Union-based attack inkluderar ofta att först ta reda på hur många kolumner den ursprungliga frågan har (genom att använda ORDER BY eller UNION SELECT NULL, NULL, ...) och sedan att identifiera namnen på de känsliga tabellerna och kolumnerna (t.ex., genom att fråga databasens schema-tabeller).
Försvaret är detsamma som för Rum 4: **Använd alltid Förberedda Frågor (Prepared Statements)**. Eftersom id är en numerisk inmatning, bör du dessutom se till att all inmatning **typ-konverteras** till ett heltal innan det används i frågan. Detta förhindrar att citattecken och text kan injiceras.