login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[PHP] inlog hack

Offline DrB - 27/06/2006 17:33
Avatar van DrBHTML interesse Beste leden,

Hoe is het op te lossen dat als iemand bij gebruikersnaam ' or 1 or ' invult en bij de pass gewoon iets dat hij dan ingelogt is als admin. Dit is namelijk het geval bij mij game.
Bij deze de login:

http://www.plaatscode.be/938/

Ik hoop dat iemand de oplossing weet.

Mvg,

DrB

14 antwoorden

Gesponsorde links
Offline Rens - 27/06/2006 17:34
Avatar van Rens Gouden medaille

Crew algemeen
Door niet zomaar $_POST['login'] te gebruiken.
gebruik functies als PHP.net: mysql_escape_string, of PHP.net: addslashes.
Offline Voldemort - 27/06/2006 17:47 (laatste wijziging 27/06/2006 17:48)
Avatar van Voldemort PHP ver gevorderde htmlentities($var,ENT_QUOTES)

Dan is het ook onmogelijk javascript te gebruiken, net als ' en ", die worden een HTML entitie.
Offline Wijnand - 28/06/2006 11:45
Avatar van Wijnand Moderator Ik zou zelf gebruik maken van:

$var = mysql_real_escape_string($_POST['login']);

Verder moet je even goed omgaan met quotes/single quotes.

Dus zo in een mysql query:

mysql_query("SELECT * FROM `tabel` WHERE `kolom` = '" . $var . "' ");
Offline Button - 28/06/2006 14:41 (laatste wijziging 28/06/2006 14:44)
Avatar van Button PHP ver gevorderde ik snap eigenlijk niet hoe dat ie met 'or 1 or' kan inloggen? zou iemand me dat eens kunnen uitleggen?
Offline Wijnand - 28/06/2006 16:22
Avatar van Wijnand Moderator hmmm. lastig uit te leggen.

Maar ik zal een poging wagen.

Je hebt dit:

mysql_query("SELECT * FROM `tabel` WHERE `kolom` = " . $_POST['iets'] . ");

Stel dat die $_POST['iets'] het volgende bevat:
;DROP TABLE users;

Dan lees mysql het als:
SELECT * FROM `tabel` WHERE `kolom` = ;
DROP TABLE users;

Oftewel. Hij doet eerst de select. Als die klaar is, dan voert hij die DROP TABLE uit.

Oplossing: mysql_query("SELECT * FROM `tabel` WHERE `kolom` = '" . $_POST['iets'] . "' ");

en eventueel ook nog de $_POST['iets'] in de functie mysql_real_escape_string(); gooien.

snap je?
Offline CDNC - 28/06/2006 16:37 (laatste wijziging 28/06/2006 16:37)
Avatar van CDNC PHP ver gevorderde je hebt dat ene bericht op php freaks gelezen ofzo?

met mysql_query kun je maar 1 actie uit voeren niet selecten en droppen. dach ik hoor

en je het ook aanhaalings tekens gezet tusen kan je er toch niet uitbreken?
Offline Thomas - 28/06/2006 16:37 (laatste wijziging 28/06/2006 16:39)
Avatar van Thomas Moderator mysql_query() kan niet meer dan één query tegelijkertijd uitvoeren, dus het droppen van tables (bovenstaand voorbeeld) zal niet lukken.

Wel zou je query kunnen manipuleren, door de SQL zelf "aan te vullen". Dit oneigenlijke gebruik wordt "mysql injection" genoemd.

EDIT: Aanhalingstekens zijn makkelijk te omzeilen. Gebruik gewoon addslashes() of equivalent om al je input.
Offline Button - 28/06/2006 16:40
Avatar van Button PHP ver gevorderde ja ik snap dat voorbeeld van Wijnand wel, ook al zou het niet werken maar hoe gebeurt het dan met die 'or 1 or', hoe verloopt dat dan?
Offline Thomas - 28/06/2006 16:46 (laatste wijziging 28/06/2006 16:47)
Avatar van Thomas Moderator Zucht... Enig uitproberen:

querystring:
  1. "SELECT * FROM login WHERE user = '".$_POST['user']."' AND pass = '".$_POST['pass']."'"


$_POST:
  1. $_POST['user'] -> "Admin" (willekeurig)
  2. $_POST['pass'] -> "' OR '1'='1"


resulterende query:
  1. "SELECT * FROM login WHERE user = 'Admin' AND pass = '' OR '1' = '1'


Dit levert dus alle logins op omdat de condities die aan de query hangen tot "true" evalueren. En als je pech hebt is de eerste entry in je login-tabel een admin...

Happy hacking, scriptkiddies...
Offline Button - 28/06/2006 16:49 (laatste wijziging 28/06/2006 16:49)
Avatar van Button PHP ver gevorderde Jep, zo snap ik het. Dank je.
Maar DrB zei dat ze dit gebruikten: "or 1 or"
en dat is dan nog iets anders, begrijp je mijn verwarring?
Offline Thomas - 28/06/2006 16:51
Avatar van Thomas Moderator Oh, dat werkt wellicht ook, maar de strekking lijkt me duidelijk niet? Bovenstaand voorbeeld is wss een van de vele manieren...
Offline Crazed - 28/06/2006 17:15 (laatste wijziging 28/06/2006 17:15)
Avatar van Crazed PHP interesse Wat ik meestal doe is iets als:
  1. $sql = mysql_query("SELECT * FROM index_users WHERE user='".addslashes($_POST['user'])."'") or die(mysql_error());
  2. $waarden = mysql_fetch_array($sql);
  3.  
  4. if($waarden['pass'] == md5($_POST['pass']))
  5. {
  6. // ingelogd
  7. }

Is dit dan veilig(er)??
Offline Gerard - 28/06/2006 18:19
Avatar van Gerard Ouwe rakker
  1. <?php
  2. $qCheckLogin = mysql_query("SELECT COUNT(*)
  3. FROM user
  4. WHERE username = '" . mysql_real_escape_string($_POST['username']) . "'
  5. AND password = '" . convertToPassword($_POST['password']) ."'");
  6.  
  7. if (mysql_result($qCheckLogin, 0) == 1) {
  8.  
  9. //login
  10.  
  11. }
  12. ?>

Ik fix mijn login altijd zo 
Offline Thomas - 29/06/2006 12:50
Avatar van Thomas Moderator Meestal is het wachtwoord als MD5-hash of wat dan ook opgeslagen, dus $_POST['pass'] gaat dan toch door de vleesmolen .
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.269s