Sie sind nicht angemeldet.

Matt

Fuck me, I'm famous

  • »Matt« ist der Autor dieses Themas

Beiträge: 214

Wohnort: Nähe Bodensee

Beruf: Informatikkaufmann

Danksagungen: 6

  • Nachricht senden

1

11.04.2011, 15:01

SQL Injection zu Lehrzwecken

Also hier ist erstmal der Code vom HTML Formular und des Auswertungsscripts:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
			Benutzname

			Passwort

			Name

			Vorname

			Ort

			Konto Nummer

			BLZ

			Bank

			E-Mail

			Und ab in die Datenbank:

--> formtest.html

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    session_start();
    
    $host "localhost";
    $dbname "testdb";
    $user "testuser";
    $passwd "xxxxxx";
    
    $db=mysql_connect($host$user$passwd) or exit ("Keine Verbindung hergestellt");
    
    mysql_select_db($dbname$db) or exit ("Datenbank nicht gefunden");
    
    $benutzername $_POST['benutzername'];
    $passwort $_POST['passwort'];
    $name $_POST['name'];
    $vorname $_POST['vorname'];
    $ort $_POST['ort'];
    $kontonr $_POST['kontonr'];
    $blz $_POST['blz'];
    $bank $_POST['bank'];
    $email addslashes($_POST['email']);
    
    $sql_query "INSERT INTO userdata (benutzername, passwort, name, vorname, ort, kontonr, blz, bank, email) 
                  VALUES ('$benutzername','".md5($passwort)."','$name','$vorname','$ort','$kontonr','$blz','$bank','$email')";
    
    mysql_query($sql_query$db) or die(mysql_error());
      echo "Daten erfolgreich uebertragen: "mysql_affected_rows($db);
?>


Und jetzt will ich wie in der iX Special Ausgabe 3/2010 ab S. 16ff die dahinterliegende Datenbank ausspionieren. Wir haben hier in der Testumgebung XAMPP installiert. Also Apache, mySQL und php5.

Dazu brauch ich aber, wie im Facebook besprochen, beim Link eine angezeigte ID.

Danke Gruß Matt

excalibur1976

el grande cheffe

Beiträge: 474

Wohnort: Kiel

Beruf: Softwareentwickler

Danksagungen: 44

  • Nachricht senden

2

11.04.2011, 15:05

Ähm, was heisst genau ausspionieren?

SELECT .... FROM ....?

Dir die Datensätze anschauen?

Dazu müsstest Du ja das Script direkt auf dem gleichen Server ablegen.
Es sei den, die Datenbank erlaubt einen Zugriff von überall.

Was in dem Magazin steht ist für mich wie eine trübe Glaskugel... Weil ich das Magazin nicht habe :D
Software: Windows 7, Cubase 5, Cubasis AV ;), Renoise 2.6, Novation Bass Station VSTi, Sylenth1, several Samples-Libaries. Hardware: AMD Phenom II X4 955 Black Edition, 4 GB RAM, SB Audigy 2 ZS Platinum, m-audio axiom 25, Behringer MS20 (active nearfield monitor)

Matt

Fuck me, I'm famous

  • »Matt« ist der Autor dieses Themas

Beiträge: 214

Wohnort: Nähe Bodensee

Beruf: Informatikkaufmann

Danksagungen: 6

  • Nachricht senden

3

11.04.2011, 15:13

Achso, die benutzen da eben kein zusätzliches Skript. So wie ich das verstanden habe, machen die das alles über die Adressleiste im Browser. Die hängen an die URL noch zB "www.linuxadmin.de/padawan/index.php?id=1+UNION+ALL+SELECT+1,2--" an. Ich schau mal wie ich dir das zur Verfügung stellen kann. Abtippen ist irgendwie doof ;)

Werbung

excalibur1976

el grande cheffe

Beiträge: 474

Wohnort: Kiel

Beruf: Softwareentwickler

Danksagungen: 44

  • Nachricht senden

4

11.04.2011, 15:22

Ahhh...Verstehe....

Beim INSERT ein UNION SELECT? Wird schiefgehen :) Es sei den, man macht daraus mehrere Statements.... :)

Die ID ist IMO zweitrangig und man macht es wie folgt:

PHP-Quelltext

1
http://www.lalala.de?id=1;SELECT+*+FROM+userdata+WHERE+1


Sprich: Es wird mittelst ; das INSERT-Query beendet und es folgt direkt eine Auslesung der Daten. Da aber an keiner Stelle ein mysql_fetch_object() oder mysql_fetch_array() im Script vorhanden ist, werden diese Daten auch nicht ausgegeben.

Das einzige was im Script angezeigt wird ist die Anzahl der betroffenen Datensätze per mysql_affected_rows(), nicht jedoch deren Inhalt.

Schlimmer wird es, wenn man Anstatt ein SELECT+... ein DELETE-Query oder gar ein ;DROP+TABLE+userdata an die URL hängt.
Das geschieht dann auch im Hintergrund...

Aber woher soll der Angreifer wissen, wie die Tabelle heisst? Sofern dieser keinen Zugriff auf den Source-Code hat, wird es schwierig...
Software: Windows 7, Cubase 5, Cubasis AV ;), Renoise 2.6, Novation Bass Station VSTi, Sylenth1, several Samples-Libaries. Hardware: AMD Phenom II X4 955 Black Edition, 4 GB RAM, SB Audigy 2 ZS Platinum, m-audio axiom 25, Behringer MS20 (active nearfield monitor)

excalibur1976

el grande cheffe

Beiträge: 474

Wohnort: Kiel

Beruf: Softwareentwickler

Danksagungen: 44

  • Nachricht senden

5

11.04.2011, 15:24

Software: Windows 7, Cubase 5, Cubasis AV ;), Renoise 2.6, Novation Bass Station VSTi, Sylenth1, several Samples-Libaries. Hardware: AMD Phenom II X4 955 Black Edition, 4 GB RAM, SB Audigy 2 ZS Platinum, m-audio axiom 25, Behringer MS20 (active nearfield monitor)

excalibur1976

el grande cheffe

Beiträge: 474

Wohnort: Kiel

Beruf: Softwareentwickler

Danksagungen: 44

  • Nachricht senden

6

13.04.2011, 09:00

Und wie hast Du / Ihr es gelöst? :)
Software: Windows 7, Cubase 5, Cubasis AV ;), Renoise 2.6, Novation Bass Station VSTi, Sylenth1, several Samples-Libaries. Hardware: AMD Phenom II X4 955 Black Edition, 4 GB RAM, SB Audigy 2 ZS Platinum, m-audio axiom 25, Behringer MS20 (active nearfield monitor)

Werbung

Matt

Fuck me, I'm famous

  • »Matt« ist der Autor dieses Themas

Beiträge: 214

Wohnort: Nähe Bodensee

Beruf: Informatikkaufmann

Danksagungen: 6

  • Nachricht senden

7

13.04.2011, 14:25

Danke!! :)

Bisher noch nicht. Wir sind grad wieder mit den kaufmännischen Dingen des Projekts beschäftigt. ;) Sobald das erledigt ist, schießen wir weiter und du wirst hier von mir lesen! ;)

Es hat sich bereits 1 registrierter Benutzer bedankt.

Benutzer, die sich für diesen Beitrag bedankt haben:

excalibur1976 (13.04.2011)

Matt

Fuck me, I'm famous

  • »Matt« ist der Autor dieses Themas

Beiträge: 214

Wohnort: Nähe Bodensee

Beruf: Informatikkaufmann

Danksagungen: 6

  • Nachricht senden

8

05.05.2011, 10:49

Sodelle, wir sind jetzt mal mit dem php Formular fertig.

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php
    ###################################################################
    # defines
    
    define('INVALID_FORM''Sie haben nicht alle Daten eingegeben!');
    define('EMPTY_FORM''Sie haben nicht alle Felder ausgefüllt!');
    define('OBJECT_ERR''Fehler beim erzeugen eines Objekts!');
    define('USER_ERR''Es wurde kein Benutzer mit den angegebenen Namen gefunden.');
    
    $inputUsername='';
    $inputPasswort='';
    $databasePasswort='';
    
    ###################################################################
    # Datenbankverbindung herstellen
    $db = new mysqli('localhost''root''xxxxx''projektDatenbank');

    
    if(mysqli_connect_errno())
    {
        echo 'Verbindung fehlgeschlagen!';
    }
    else
    {
        #include "login_verarbeitung.php";
        
    ###################################################################
    # ----- Grundgeruest fuer Formular-Verarbeitung -----
    #----- Uebergabemethode ueberpruefen -----
    if ($_SERVER['REQUEST_METHOD'] == 'POST') 
    {
        
        #----- ueberpruefen ob Formulardaten gesetzt -----
        if (!isset($_POST['username'], $_POST['passwort'])) 
        {
            echo INVALID_FORM;
            return;
            //return INVALID_FORM;
        }
        
        #----- auf Leerzeichen ueberpruefen -----
        if(($Username trim($_POST['username']) == '') OR
           ($Password trim($_POST['passwort'])) == '') 
        {
            echo EMPTY_FORM;
            return;
        }
    
    ###################################################################
    # ----- Deklarationen und Vorinitialisierungen -----
        $inputUsername$_POST['username'];
        $inputPasswort $_POST['passwort'];
    
    
    ###################################################################
    #----- Sql anfrage -----
    $anfrage "SELECT passwort FROM userdaten WHERE username = '".$inputUsername."'";
    
    #echo 'Testausgabe der SQL-Anfrage:<br';
    #echo $anfrage;
   
    if($result $db->query($anfrage))
    {
        echo 'result ok, bin im if<br>';
        while($obj $result->fetch_assoc())
        {
            $databasePasswort$obj['passwort'];
        }
    }
    else
    {
        echo 'bin im else<br>';
        echo $db->error;
    }
    echo $anfrage.'<br>';
    ###################################################################
    #----- Passwort Vergleich -----
    if( $inputPasswort === $databasePasswort)
    {
        echo 'Passwort hat gestimmt!';
    }
    else
    {
        echo 'Passwort hat nicht gestimmt!';
        echo $db->error;
        $db->close();   
    }
    

       
        
    } // ende else method post
    //ende else sql-connect
?>
<html>
<body>

    <h1>Login-Seite</h1>
    <form action="projektseiteNew.php" name="formular" method="post">
        <br>Benutzername<br><input type="text" name="username" size="30" maxLength="250">
        <br>Passwort<br><input type="password" name="passwort" size="10" maxLength="10">
        
        <input type="submit" name="uebertragen" value="Senden">
    </form>
 

</body>
</html>


Die Frage ist jetzt, ob dieses Formular angreifbar ist. Unser Ziel ist es jetzt, per SQL-Injection, entweder einen neunen admin Benutzer einzufügen oder die Passwörter auszulesen. Leider scheitern wir immer mit der Abfrage. Bzw...welche Abfrage wie angegeben werden muss. Wir haben es bisher versucht, die (zB. SELECT * FROM userdaten) Abfrage in das Benutzernamenfeld einzufügen. Das hat aber ncht geklappt.

Zitat

bin im else
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT * FROM userdaten; -- '' at line 1SELECT passwort FROM userdaten WHERE username = ''SELECT * FROM userdaten; -- '
Passwort hat nicht gestimmt!You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT * FROM userdaten; -- '' at line 1


Als Passwort geben wir immer irgendwas ein. In der Datenbank ist ein Benutzer angelegt, mit dem man sich "anmelden" kann.

Ideen?

Danke! Mätt

Lesezeichen:

Forenuser - Die Foren
Findmaschine