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
ellerINTO 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 imysql
användarens hemkatalog och sedan SSHing in, eller skriver övermysqld
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öramysqld
, 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.