Inden du besvarer spørgsmålet direkte, er det værd at bemærke, at selvom alt en angriber kan gøre er at læse data, som han ikke burde kunne, det er normalt stadig rigtig dårlig. Overvej det ved at bruge JOIN
s og SELECT
ing fra systemtabeller (som mysql.innodb_table_stats
), en angriber, der starter med en SELECT
indsprøjtning og ingen anden viden om din database kan kortlægge dit skema og derefter eksfiltrere hele de data, du har i MySQL. For langt de fleste databaser og applikationer er det allerede repræsenterer et katastrofalt sikkerhedshul.
Men for at svare direkte på spørgsmålet:der er et par måder, jeg kender til, ved hvilken indsprøjtning i en MySQL SELECT
kan bruges til at ændre data. Heldigvis kræver de alle med rimelighed usædvanlige omstændigheder er mulige. Alle eksempler på injektioner nedenfor er givet i forhold til eksemplet på injicerbar forespørgsel fra spørgsmålet:
SELECT id, name, message FROM messages WHERE id = $_GET['q']
1. "Stablede" eller "batchede" forespørgsler.
Den klassiske injektionsteknik med bare at sætte et helt andet statement efter det, der bliver sprøjtet ind i. Som foreslået i et andet svar her
, kan du indstille $_GET['q']
til 1; DELETE FROM users; --
så forespørgslen danner to sætninger, der udføres fortløbende, hvoraf den anden sletter alt i users
tabel.
Til afhjælpning
De fleste MySQL-stik - især inklusive PHP's (forældede) mysql_*
og (ikke-forældet) mysqli_*
funktioner - understøtter slet ikke stablede eller batchede forespørgsler, så denne form for angreb virker ganske enkelt ikke. Men nogle gør - især inklusive PHP's PDO-stik (selvom understøttelsen kan deaktiveres for at øge sikkerheden
).
2. Udnyttelse af brugerdefinerede funktioner
Funktioner kan kaldes fra en SELECT
, og kan ændre data. Hvis en dataændringsfunktion er blevet oprettet i databasen, kan du lave SELECT
kald det, for eksempel ved at sende 0 OR SOME_FUNCTION_NAME()
som værdien af $_GET['q']
.
Til afhjælpning
De fleste databaser indeholder ingen brugerdefinerede funktioner - endsige dataændrende - og giver derfor ingen mulighed overhovedet for at udføre denne form for udnyttelse.
3. Skrivning til filer
Som beskrevet i Muhaimin Dzulfakars (noget formastelige navngivne) papir Avanceret MySQL-udnyttelse
, kan du bruge INTO OUTFILE
eller INTO DUMPFILE
klausuler på et MySQL-valg for at dumpe resultatet i en fil. Siden, ved at bruge en UNION
, ethvert vilkårligt resultat kan være SELECT
ed, dette tillader at skrive nye filer med vilkårligt indhold på et hvilket som helst sted, hvor brugeren kører mysqld
kan få adgang. Det kan tænkes, at dette ikke blot kan bruges til at ændre data i MySQL-databasen, men til at få shell-adgang til den server, den kører på - for eksempel ved at skrive et PHP-script til webroot og derefter lave en anmodning til den, hvis MySQL-serveren hostes sammen med en PHP-server.
Til afhjælpning
Masser af faktorer reducerer den praktiske udnyttelse af dette ellers imponerende klingende angreb:
- MySQL vil aldrig lad dig bruge
INTO OUTFILE
ellerINTO DUMPFILE
at overskrive en eksisterende fil eller skrive til en mappe, der ikke eksisterer. Dette forhindrer angreb som at oprette en.ssh
mappe med en privat nøgle imysql
brugerens hjemmemappe og derefter SSHing ind eller overskrivemysqld
binær selv med en ondsindet version og venter på en servergenstart. - Enhver halvvejs anstændig installationspakke vil oprette en speciel bruger (typisk kaldet
mysql
) for at køremysqld
, og giv denne bruger kun meget begrænsede tilladelser. Som sådan burde den ikke være i stand til at skrive til de fleste steder i filsystemet - og burde bestemt ikke normalt kunne gøre ting som at skrive til en webapplikations webroot. - Moderne installationer af MySQL leveres med
--secure-file-priv
indstillet som standard, hvilket forhindrer MySQL i at skrive til andre steder end et udpeget dataimport-/eksportbibliotek og derved gøre dette angreb næsten fuldstændig impotent... medmindre ejeren af serveren bevidst har deaktiveret det. Heldigvis ville ingen nogensinde bare helt deaktivere sådan en sikkerhedsfunktion, da det åbenbart ville være det - åh vent ligegyldigt .
4. Kalder sys_exec()
funktion fra lib_mysqludf_sys
at køre vilkårlige shell-kommandoer
Der er en MySQL-udvidelse kaldet lib_mysqludf_sys
det - at dømme ud fra dets stjerner på GitHub
og en hurtig Stack Overflow-søgning
- har mindst et par hundrede brugere. Den tilføjer en funktion kaldet sys_exec
der kører shell-kommandoer. Som nævnt i #2 kan funktioner kaldes inde fra en SELECT
; konsekvenserne er forhåbentlig indlysende. For at citere fra kilden
, denne funktion "kan være en sikkerhedsrisiko" .
Til afhjælpning
De fleste systemer har ikke denne udvidelse installeret.