wpforge
Goto Top

Sicheres Script ?

Hallo,
ich habe meinen PHP code bisher eigentlich nicht für überragend gut, aber für sicher gehalten .
Nun scheinen wir aber irgendwo die Möglichkeit zur SQL Injection geschaffen zu haben.

Nachdem ich generell immer alle Eingaben für die Datenbank (sofern die Parameter nicht direkt aus der Datenbank kommen) immer gleich behandle, habe ich mal einen kleinen Beispielcode geschrieben.
Ich würde euch bitten, mal einen blick drauf zu werfen, ob jemandem hier ein möglicher Angriffsvektor auffällt.
Dass dieses Formular so gut für eine Bruteforceattacke geeignet ist, ist klar.

<?PHP
	define('SQLHOST','localhost');  
	define('SQLPORT',3306);  
	define('SQLUSER','');  
	define('SQLPASS','');  
	define('SQLDBNAME','');  
	
	define('USER_TABLE','users');  
	
	
	// Diese Datei wird importiert
	// https://github.com/ThingEngineer/PHP-MySQLi-Database-Class
	require_once 'MysqliDb.php';      
	$db = new MysqliDb(SQLHOST,SQLUSER,SQLPASS,SQLDBNAME);
?>
<!doctype html>
<html lang="en">  
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">  
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">  

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">  

    <title>Hello, world!</title>
  </head>
  <body>
    <form method="post">  
		<div class="form-group">  
			<label for="user">Nutzername:</label>  
			<input type="text" name="user" id="user">  
		</div>
		<div class="form-group">  
			<label for="user">Passwort:</label>  
			<input type="password" name="pass" id="pass">  
		</div>
		<input type="submit" value="Absenden">  
		<input type="hidden" name="do" value="1">  
	</form>
	
	<?PHP
		if(isset($_POST['do']) && $_POST['do'] = "1")  
		{
			$db->where('user',$db->escape($_POST['user']));  
			$db->where('pass',$db->escape(md5($_POST['pass'])));  
			$res = $db->getOne(USER_TABLE);
			if(count($res) > 0)
			{
				echo "erfolgreich";  
			}else{
				echo "fehlgeschlagen";  
			}
		}
	?>
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>  
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>  
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>  
  </body>
</html>

Danke schon mal für eure Antworten

Content-ID: 395958

Url: https://administrator.de/contentid/395958

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

Lochkartenstanzer
Lochkartenstanzer 17.12.2018 um 19:06:10 Uhr
Goto Top
Moin,

Input sanitation ist Dein Stichwort, dnach dem Du googlen solltest.

lks
WPFORGE
WPFORGE 17.12.2018 um 19:16:08 Uhr
Goto Top
Aber genau das sollte doch eigentlich damit "$db->escape($_POST['user'])" erfolgen.
certifiedit.net
certifiedit.net 17.12.2018 um 19:26:14 Uhr
Goto Top
Das wird nicht das ganze Programm sein, oder und ich glaube nur mit escape kommst du heute nicht mehr weit.

VG
Lochkartenstanzer
Lochkartenstanzer 17.12.2018 um 19:37:13 Uhr
Goto Top
WPFORGE
WPFORGE 17.12.2018 um 19:39:08 Uhr
Goto Top
Das ist ein Beispielscript.
Nachdem ggf. ja auch textfelder deren Inhalt nicht vorherehbar sind eingefügt werden müssen....
was ist sonst noch zu tun, um gegen SQL injections abzusichern?
Wie bringt man da sonst noch eine injection rein?
certifiedit.net
certifiedit.net 17.12.2018 um 19:47:02 Uhr
Goto Top
WPFORGE
WPFORGE 17.12.2018 um 20:00:53 Uhr
Goto Top
Wenn ich mir den Artikel so ansehe, müsste ja aber genau das dort gezeigt Beispiel mit dem escape erledigt sein.
Zumal die verwendete Klasse für mich zumindest den Eindruck erweckt, als würde hier mit prepared Statements gearbeitet.

Ich will meinen Code hier nicht sicher diskutieren. Mit ist nur nicht klar, wie der Angriffsvektor aussehen könnte.

Falls das hier zu sehr in die graue Richtung geht, bin ich auf für einen PN Tipp dankbar.
certifiedit.net
certifiedit.net 17.12.2018 um 20:21:17 Uhr
Goto Top
Imho arbeiten die dort mit PDO.

Nimm dir ein gutes, aktuelles Buch dazu und arbeite dich da durch.
WPFORGE
WPFORGE 17.12.2018 um 22:14:42 Uhr
Goto Top
Das ist nicht wirklich hilfreich ;)
Wenn man mal "MysqliDb sql injection" googled findet man unter anderem:
https://github.com/ThingEngineer/PHP-MySQLi-Database-Class/issues/764

Es werden also prepared Statements benutzt.
Die Eingaben werden zusätzlich escaped und wes werden keine RAW Queries genutzt.

Trotzdem wird hier ziemlich generell in den Raum gestellt, das Verfahren so sei unsicher.
Allen scheint klar zu sein, wie eine solche Konstruktion anzugreifen ist. Nur mir nicht;)
Deshalb wäre ich für einen konkreten Tipp echt dankbar ;)
certifiedit.net
certifiedit.net 17.12.2018 um 22:22:19 Uhr
Goto Top
Das ist auch nicht mal so schnell hingeschrieben und bringt "so" auch nichts.

Der beste Weg eine Anwendung sicher zu machen, ist zu verstehen, wie Sie anzugreifen ist. Da du nur irgendein Floskel Snippet geliefert hast, solltest du dich einlesen, wie man Webanwendungen angreift, um diese anschliessend zu härten.

VG
EvilMoe
EvilMoe 17.12.2018 um 23:03:32 Uhr
Goto Top
Hallo,

dasvon abgesehen, was die anderen bemängelt haben. Ist md5 schon lange keine sichere Methode mehr um passwörter "verschlüsselt" zu speichern: https://secure.php.net/manual/de/faq.passwords.php#faq.passwords.fasthas ...

Besser so machen: https://secure.php.net/manual/de/function.password-hash.php und Argon2 verwenden.

Gruß
maretz
maretz 18.12.2018 um 07:52:43 Uhr
Goto Top
Moin,

du willst deinen Code nicht diskutieren. Oben fehlt die hälfte vom Code. Aber du willst einen KONKRETEN Tip haben? Cool, also sollen wir immer schön raten?
WPFORGE
WPFORGE 18.12.2018 um 21:51:55 Uhr
Goto Top
Nein ;)
Ich bin durchaus bereit den Code zu diskutieren....
Ja ich hätte gern einen konkreten Tipp.
Vom Prinzip her weiß ich schon, wie eine SQL injection funktioniert.

Aber mir fehlt die Vorstellung, wie das unter DEN Umständen noch passieren soll.
TripleDouble
TripleDouble 03.05.2019 um 13:07:15 Uhr
Goto Top
Hallo,

ohne auf den Sicherheitsaspekt eingehen zu wollen, aber in PHP erfolgt der Vergleich beim if mit '==' (siehe Zeile 43).

Gruß - TD