sql >> Database >  >> RDS >> Mysql

MySQL-injectie - Gebruik SELECT-query om BIJWERKEN/VERWIJDEREN

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 of INTO 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 de mysql homedirectory van de gebruiker en vervolgens SSHing in, of overschrijven van de mysqld 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 ) om mysqld . 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.



  1. JDBC-verbindingstime-out kan niet opnieuw verbinding maken

  2. Hoe MySQL Root-wachtwoord opnieuw in te stellen

  3. Implementeer MySQL Server + DB met .Net-toepassing

  4. Converteer 'datetime' naar 'datetimeoffset' in SQL Server (T-SQL-voorbeelden)