Sql-Injection-Proof-of-Concept: Unterschied zwischen den Versionen

Aus xinux.net
Zur Navigation springen Zur Suche springen
 
(35 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
=Unsichere Methode=
+
=Test Seite=
<pre>
+
*[[SQL Injection Vorbereitung]]
<?php
 
  if(isset($_POST['submit'])){
 
    //connect db
 
    include "inc/connect.php";
 
    //unsafe query
 
    $search = $_POST['search'];
 
    //Database search
 
    $sql = "SELECT * FROM users WHERE username='$search'";
 
    $result = mysqli_query($link, $sql);
 
  }
 
?>
 
  
<!DOCTYPE html>
+
=Unsichere Seite=
<html>
+
==Abfrage==
        <body>
+
;ins Suchfeld
                <h2>SQL Injection</h2>
+
*' or '1' = '1  
                <form method="post">
+
[[Datei:sql-injection-1.png]]
                  <label for="fname">Suche</label><br>
 
                  <input type="text" name="search"><br>
 
                  <input type="submit" name="submit" value="Suche">
 
                </form>
 
                <br>
 
                <table border = "1">
 
                        <tr>
 
                                <td>ID</td>
 
                                <td>Name</td>
 
                                <td>Passwort</td>
 
                        </tr>
 
<?php
 
  while ($row = mysqli_fetch_row($result)) {
 
    echo "<tr>";
 
    echo "<td>".$row[0]." </td>";
 
    echo "<td>".$row[1]." </td>";
 
    echo "<td>".$row[2]." </td><br>";
 
    echo "</tr>";
 
  }
 
?>
 
                </table>
 
        </body>
 
</html>
 
</pre>
 
=Sichere Methode=
 
<pre>
 
<?php
 
  if(isset($_POST['submit'])){
 
    //connect db
 
    include "inc/connect.php";
 
    //safe query
 
    $search = mysqli_real_escape_string($link, $_POST['search']);
 
    //Database search
 
    $sql = "SELECT * FROM users WHERE username='$search'";
 
    $result = mysqli_query($link, $sql);
 
  }
 
?>
 
  
<!DOCTYPE html>
+
==Einfügen eines Datensatz==
<html>
+
;ins Suchfeld
        <body>
+
*' ; insert into users values('8','wauzi','streng'); -- 
                <h2>SQL Injection</h2>
+
;Dann die Abfrage ins Suchfeld
                <form method="post">
+
*' or '1' = '1
                  <label for="fname">Suche</label><br>
+
 
                  <input type="text" name="search"><br>
+
=Sichere Seite=
                  <input type="submit" name="submit" value="Suche">
+
[[Datei:sql-injection-2.png]]
                </form>
+
=Erläuterung=
                <br>
+
==Unsichere Methode==
                <table border = "1">
+
;Bei der Unsicheren Methode wird folgender Query abgesetzt.
                        <tr>
+
 
                                <td>ID</td>
+
*SELECT * FROM users WHERE username='$search';
                                <td>Name</td>
+
 
                                <td>Passwort</td>
+
;Wenn wir in die Variable $search folgendes schreiben:
                        </tr>
+
 
<?php
+
$search = ' or '1' = '1
  while ($row = mysqli_fetch_row($result)) {
+
 
    echo "<tr>";
+
;wird folgender Suchausdruck gebildet:
    echo "<td>".$row[0]." </td>";
+
 
    echo "<td>".$row[1]." </td>";
+
*SELECT * FROM users WHERE username=' ' or '1' = '1';
    echo "<td>".$row[2]." </td><br>";
+
 
    echo "</tr>";
+
;da der 2. Ausdruck wahr ist, wird die ganze Tabelle ausgegeben.
  }
+
 
?>
+
==Sichere Methode==
                </table>
+
Das Sicherheitsproblem wird also dadurch verursacht, dass eine Benutzereingabe ungeprüft bzw. unverarbeitet weiter benutzt wird.
        </body>
+
 
</html>
+
;Bei der sicheren Methode wird die Benutzereingabe nicht direkt übergeben.
</pre>
+
 
 +
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.

Aktuelle Version vom 1. März 2024, 11:21 Uhr

Test Seite

Unsichere Seite

Abfrage

ins Suchfeld
  • ' or '1' = '1

Sql-injection-1.png

Einfügen eines Datensatz

ins Suchfeld
  • ' ; insert into users values('8','wauzi','streng'); --
Dann die Abfrage ins Suchfeld
  • ' or '1' = '1

Sichere Seite

Sql-injection-2.png

Erläuterung

Unsichere Methode

Bei der Unsicheren Methode wird folgender Query abgesetzt.
  • SELECT * FROM users WHERE username='$search';
Wenn wir in die Variable $search folgendes schreiben

$search = ' or '1' = '1

wird folgender Suchausdruck gebildet
  • SELECT * FROM users WHERE username=' ' or '1' = '1';
da der 2. Ausdruck wahr ist, wird die ganze Tabelle ausgegeben.

Sichere Methode

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.