|
|
| (6 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) |
| Zeile 1: |
Zeile 1: |
| =Vorüberlegung=
| | *[[Was ist eine SQL Injection]] |
| ==Verhaltensweise einer SQL Abfrage==
| | *[[SQL Injection Datenabfrage]] |
| ;Normale Abfrage
| | *[[SQL-Injection-Exploits]] |
| *MariaDB [sql_injections]> select * from users where username = 'rudi.burkart'; | | *[[SQL Injection - Übersicht]] |
| +------+--------------+----------+
| | *[[SQL Blind Injection]] |
| | id | username | password |
| | *[[Sql-Injection-Proof-of-Concept]] |
| +------+--------------+----------+
| |
| | 2 | rudi.burkart | secret |
| |
| +------+--------------+----------+
| |
| 1 row in set (0.000 sec)
| |
| ;Oder Verknüpfung
| |
| *MariaDB [sql_injections]> select * from users where username = 'rudi.burkart' or username = 'hans.will'; | |
| +------+--------------+----------+
| |
| | id | username | password |
| |
| +------+--------------+----------+
| |
| | 2 | rudi.burkart | secret |
| |
| | 1 | hans.will | geheim |
| |
| +------+--------------+----------+
| |
| 2 rows in set (0.000 sec)
| |
| =PHP Code unsicher=
| |
| <pre>
| |
| $search = $_POST['search'];
| |
| $sql = "SELECT * FROM users WHERE username='$search'";
| |
| $result = mysqli_query($link, $sql);
| |
| </pre>
| |
| ;Diese Eingabe bewirkt nun
| |
| | |
| [[Datei:Sql-injection-2.png]] | |
| | |
| ;folgende Sql Abfrage
| |
| | |
| *MariaDB [sql_injections]> select * from users where username = '' or '1' = '1'; | |
| +------+---------------+-------------+
| |
| | id | username | password |
| |
| +------+---------------+-------------+
| |
| | 2 | rudi.burkart | secret |
| |
| | 3 | erwin.lehmann | weisniemand |
| |
| | 1 | hans.will | geheim |
| |
| +------+---------------+-------------+
| |
| 3 rows in set (0.000 sec)
| |
| ;Da '1' = '1" werden alle Datensätze angezeigt
| |
| | |
| =Webfrontend=
| |
| [[Datei:Sql-injection-1.png]] | |
| =PHP Code sicher=
| |
| <pre>
| |
| $search = mysqli_real_escape_string($link, $_POST['search']);
| |
| $sql = "SELECT * FROM users WHERE username='$search'";
| |
| $result = mysqli_query($link, $sql);
| |
| </pre>
| |
| | |
| | |
| Das Sicherheitsproblem wird also dadurch verursacht, dass eine Benutzereingabe ungeprüft bzw. unverarbeitet weiter benutzt wird.
| |
| | |
| Bei der sicheren Methode wird die Benutzereingabe nicht direkt übergeben.
| |
| | |
| In diesem Beispiel wird eine php-Funktion benutzt, die dafür sorgt, dass Sonderzeichen entwertet werden
| |
| | |
| So wird eine sicherere SQL Abfrage gebildet.
| |
| | |
| Die an die Datenbank geschickte Abfrage sieht in diesem Fall so aus:
| |
| | |
| SELECT * FROM users WHERE username='\'or\'1\'=\'1'
| |
| | |
| Prinzipiell sollten alle Daten die von Außen kommen als unsicher angesehen werden und niemals ohne eine Prüfung und/oder Bearbeitung weiterverwendet werden.
| |