MySQL-Injection mal anders

Man nehme folgenden Script-Aufbau:

<?php
$mysqli = new mysqli('localhost', 'root', '', 'datatabletest');
$rating = $mysqli->real_escape_string($_GET['rating']);
$sql = "SELECT name, rating FROM movies WHERE rating > " . $rating;

Da wir ja mustergültig escapen, sollte eigentlich nichts schief gehen – oder? Nun, der Benutzer übermittelt in $_GET[‚rating‘] folgenden Wert:

3 AND 0 = IF(1, BENCHMARK(1000000, MD5(REPEAT(CONVERT(1, CHAR), 1000))), 0)

Der Wert von $sql lautet danach:

SELECT name, rating FROM movies WHERE rating > 3 AND 0 = IF(1, BENCHMARK(1000000, MD5(REPEAT(CONVERT(1, CHAR), 1000))), 0)

Ein astreines DoS-Einfallstor. In solchen Fällen besser intval verwenden.

Original entdeckt von ulf-wendel.de.

Weitere Posts:

Dieser Beitrag wurde unter Datenbanken, Security, webdev veröffentlicht. Setze ein Lesezeichen auf den Permalink.

4 Antworten auf MySQL-Injection mal anders

  1. Rudi sagt:

    Das wär aber nicht passiert, wenn man $rating im SQL Query in einfache Hochkommas eingeschlossen hätte. Das versteh ich unter „mustergültig“, ansonsten ergibt das escapen keinen Sinn.

    1. david sagt:

      Grad darum gings mir. Ich hätte erwartet, dass das real_escape_string schon selbst übernimmt.

    2. Ulf Wendel sagt:

      Warum sollte der Programmierer dort, wo in der SQL-Logik eine Zahl erwartet wird, eine Zeichenkette einfügen (Stichwort: Hochkomma)?

  2. Witold sagt:

    Prepared Statements FTW!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert