sql >> Databasteknik >  >> RDS >> Mysql

MySQL Injection - Använd SELECT-frågan för att UPPDATERA/TA DELETE

Innan du svarar direkt på frågan är det värt att notera att även om allt en angripare kan göra är att läsa data som han inte borde kunna, det är vanligtvis fortfarande riktigt dålig. Tänk på det genom att använda JOIN s och SELECT från systemtabeller (som mysql.innodb_table_stats ), en angripare som börjar med en SELECT injektion och ingen annan kunskap om din databas kan kartlägga ditt schema och sedan exfiltrera hela den data som du har i MySQL. För de allra flesta databaser och applikationer är det redan representerar ett katastrofalt säkerhetshål.

Men för att svara direkt på frågan:det finns några sätt som jag känner till genom vilken injektion i en MySQL SELECT kan användas för att ändra data. Lyckligtvis kräver de alla rimligt ovanliga omständigheter vara möjliga. Alla exempelinjektioner nedan ges i förhållande till den injicerbara exemplet från frågan:

SELECT id, name, message FROM messages WHERE id = $_GET['q']

1. "Stackade" eller "batchade" frågor.

Den klassiska injektionstekniken att bara sätta ett helt annat uttalande efter det som injiceras i. Som föreslås i ett annat svar här , kan du ställa in $_GET['q'] till 1; DELETE FROM users; -- så att frågan bildar två satser som exekveras i följd, varav den andra tar bort allt i users bord.

Till begränsning

De flesta MySQL-anslutningar - särskilt inklusive PHP:s (utfasade) mysql_* och (ej utfasad) mysqli_* funktioner - stöder inte staplade eller batchade frågor alls, så den här typen av attack fungerar helt enkelt inte. Vissa gör det dock - särskilt inklusive PHP:s PDO-kontakt (även om stödet kan inaktiveras för att öka säkerheten ).

2. Utnyttja användardefinierade funktioner

Funktioner kan anropas från en SELECT och kan ändra data. Om en dataändringsfunktion har skapats i databasen kan du göra SELECT kalla det, till exempel genom att skicka 0 OR SOME_FUNCTION_NAME() som värdet på $_GET['q'] .

Till begränsning

De flesta databaser innehåller inga användardefinierade funktioner - än mindre dataändringsfunktioner - och erbjuder därför ingen möjlighet alls att utföra denna typ av exploatering.

3. Skriva till filer

Som beskrivs i Muhaimin Dzulfakars (något förmätet namngivna) tidning Avancerat MySQL-utnyttjande , kan du använda INTO OUTFILE eller INTO DUMPFILE satser på en MySQL-val för att dumpa resultatet i en fil. Sedan, genom att använda en UNION , alla godtyckliga resultat kan vara SELECT ed, detta gör det möjligt att skriva nya filer med godtyckligt innehåll var som helst där användaren kör mysqld kan komma åt. Tänkbart kan detta utnyttjas inte bara för att modifiera data i MySQL-databasen, utan för att få skalåtkomst till servern som den körs på - till exempel genom att skriva ett PHP-skript till webbroten och sedan göra en begäran till den, om MySQL-servern är värd tillsammans med en PHP-server.

Till begränsning

Många faktorer minskar den praktiska exploateringen av denna annars imponerande attack:

  • MySQL kommer aldrig låter dig använda INTO OUTFILE eller INTO DUMPFILE att skriva över en befintlig fil, inte heller skriva till en mapp som inte finns. Detta förhindrar attacker som att skapa en .ssh mapp med en privat nyckel i mysql användarens hemkatalog och sedan SSHing in, eller skriver över mysqld binär själv med en skadlig version och väntar på en omstart av servern.
  • Varje halvvägs anständigt installationspaket kommer att konfigurera en speciell användare (vanligen kallad mysql ) för att köra mysqld , och ge den användaren endast mycket begränsade behörigheter. Som sådan borde den inte kunna skriva till de flesta platser i filsystemet - och borde i allmänhet inte kunna göra saker som att skriva till en webbapplikations webroot.
  • Moderna installationer av MySQL levereras med --secure-file-priv inställt som standard, vilket hindrar MySQL från att skriva till någon annanstans än en angiven dataimport-/exportkatalog och därigenom gör denna attack nästan helt impotent... om inte serverns ägare avsiktligt har inaktiverat den. Lyckligtvis skulle ingen någonsin helt avaktivera en sådan säkerhetsfunktion eftersom det uppenbarligen skulle vara det - oh vänta strunt i .

4. Anropar sys_exec() funktion från lib_mysqludf_sys för att köra godtyckliga skalkommandon

Det finns en MySQL-tillägg som heter lib_mysqludf_sys det - att döma av dess stjärnor på GitHub och en snabb Stack Overflow-sökning - har minst några hundra användare. Den lägger till en funktion som heter sys_exec som kör skalkommandon. Som noterats i #2 kan funktioner anropas från en SELECT; konsekvenserna är förhoppningsvis uppenbara. För att citera från källan , den här funktionen "kan vara en säkerhetsrisk" .

Till begränsning

De flesta system har inte detta tillägg installerat.



  1. T-SQL Hur skapar man tabeller dynamiskt i lagrade procedurer?

  2. Fel i MySQL vid inställning av standardvärde för DATE eller DATETIME

  3. MySQL på Azure Performance Benchmark – ScaleGrid vs. Azure Database

  4. Hur skapar man tabell med SQLite-databas i Android?