sql >> Database teknologi >  >> RDS >> Mysql

MySQL Injection - Brug SELECT-forespørgsel til at OPDATERE/SLETTE

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 eller INTO 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 i mysql brugerens hjemmemappe og derefter SSHing ind eller overskrive mysqld 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øre mysqld , 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.



  1. At få jQuery-autofuldførelse til at fungere med PHP-kilde

  2. Lagring af konfigurationer i Android

  3. Hvordan kan jeg starte PostgreSQL på Windows?

  4. Reparation af kodninger