Alvorens de vraag direct te beantwoorden, is het de moeite waard om op te merken dat zelfs als het enige wat een aanvaller kan doen is lezen gegevens die hij niet zou moeten kunnen, dat is meestal nog steeds erg slecht. Bedenk dat door JOIN
. te gebruiken s en SELECT
uit systeemtabellen (zoals mysql.innodb_table_stats
), een aanvaller die begint met een SELECT
injectie en geen andere kennis van uw database kan uw schema in kaart brengen en vervolgens het geheel van de gegevens die u in MySQL hebt, exfiltreren. Voor de overgrote meerderheid van databases en applicaties is dat al vertegenwoordigt een catastrofaal beveiligingslek.
Maar om de vraag direct te beantwoorden:er zijn een paar manieren die ik ken door welke injectie in een MySQL SELECT
kan worden gebruikt om gegevens te wijzigen. Gelukkig hebben ze allemaal redelijkerwijs ongebruikelijke omstandigheden mogelijk zijn. Alle onderstaande voorbeeldinjecties worden gegeven ten opzichte van de voorbeeldinjecteerbare vraag uit de vraag:
SELECT id, name, message FROM messages WHERE id = $_GET['q']
1. "Gestapelde" of "gegroepeerde" zoekopdrachten.
De klassieke injectietechniek om gewoon een hele andere verklaring te plaatsen na de verklaring waarin wordt geïnjecteerd. Zoals gesuggereerd in een ander antwoord hier
, je zou $_GET['q']
. kunnen instellen naar 1; DELETE FROM users; --
zodat de query twee instructies vormt die opeenvolgend worden uitgevoerd, waarvan de tweede alles verwijdert in de users
tafel.
Als beperking
De meeste MySQL-connectoren - met name PHP's (verouderd) mysql_*
en (niet-verouderd) mysqli_*
functies - ondersteunen helemaal geen gestapelde of gegroepeerde zoekopdrachten, dus dit soort aanvallen werkt gewoon niet. Sommigen doen echter - met name inclusief PHP's PDO-connector (hoewel de ondersteuning kan worden uitgeschakeld om de veiligheid te vergroten
).
2. Gebruik van door de gebruiker gedefinieerde functies
Functies kunnen worden aangeroepen vanuit een SELECT
, en kan gegevens wijzigen. Als er een functie voor het wijzigen van gegevens in de database is gemaakt, kunt u de SELECT
roep het aan, bijvoorbeeld door 0 OR SOME_FUNCTION_NAME()
. door te geven als de waarde van $_GET['q']
.
Als beperking
De meeste databases bevatten geen door de gebruiker gedefinieerde functies - laat staan gegevensveranderende - en bieden dus helemaal geen mogelijkheid om dit soort exploits uit te voeren.
3. Schrijven naar bestanden
Zoals beschreven in Muhaimin Dzulfakar's (enigszins aanmatigende naam) paper Geavanceerde MySQL-exploitatie
, kunt u INTO OUTFILE
. gebruiken of INTO DUMPFILE
clausules op een MySQL selecteren om het resultaat in een bestand te dumpen. Sinds, met behulp van een UNION
, elk willekeurig resultaat kan SELECT
. zijn ed, dit maakt het mogelijk om nieuwe bestanden met willekeurige inhoud te schrijven op elke locatie waar de gebruiker mysqld
uitvoert toegang kan krijgen. Het is denkbaar dat dit niet alleen kan worden misbruikt om gegevens in de MySQL-database te wijzigen, maar om shell-toegang te krijgen tot de server waarop deze draait - bijvoorbeeld door een PHP-script naar de webroot te schrijven en er vervolgens een verzoek aan te doen, als de MySQL-server wordt samen met een PHP-server gehost.
Als beperking
Veel factoren verminderen de praktische bruikbaarheid van deze anders indrukwekkend klinkende aanval:
- MySQL zal nooit laat je
INTO OUTFILE
. gebruiken ofINTO DUMPFILE
om een bestaand bestand te overschrijven, noch om naar een map te schrijven die niet bestaat. Dit voorkomt aanvallen zoals het maken van een.ssh
map met een privésleutel in demysql
homedirectory van de gebruiker en vervolgens SSHing in, of overschrijven van demysqld
binary zelf met een kwaadaardige versie en wacht op een herstart van de server. - Elk half fatsoenlijk installatiepakket zal een speciale gebruiker instellen (meestal genaamd
mysql
) ommysqld
. uit te voeren , en geef die gebruiker slechts zeer beperkte machtigingen. Als zodanig zou het niet in staat moeten zijn om naar de meeste locaties op het bestandssysteem te schrijven - en zou het normaal gesproken zeker niet in staat moeten zijn om dingen te doen zoals schrijven naar de webroot van een webtoepassing. - Moderne installaties van MySQL worden geleverd met
--secure-file-priv
standaard ingesteld, waardoor wordt voorkomen dat MySQL ergens anders schrijft dan een aangewezen map voor het importeren/exporteren van gegevens, waardoor deze aanval bijna volledig onmachtig wordt... tenzij de eigenaar van de server deze opzettelijk heeft uitgeschakeld. Gelukkig zou niemand zo'n beveiligingsfunctie ooit volledig uitschakelen, want dat zou duidelijk zijn - oh wacht laat maar .
4. De sys_exec()
. aanroepen functie van lib_mysqludf_sys
om willekeurige shell-commando's uit te voeren
Er is een MySQL-extensie genaamd lib_mysqludf_sys
dat - te oordelen naar zijn sterren op GitHub
en een snelle Stack Overflow-zoekopdracht
- heeft minstens een paar honderd gebruikers. Het voegt een functie toe genaamd sys_exec
die shell-opdrachten uitvoert. Zoals opgemerkt in #2, kunnen functies worden aangeroepen vanuit een SELECT
; de implicaties zijn hopelijk duidelijk. Om te citeren uit de bron
, deze functie "kan een veiligheidsrisico zijn" .
Als beperking
Op de meeste systemen is deze extensie niet geïnstalleerd.