Προς το περιεχόμενο

PHP Login system


Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα

 

 

Έχω φτιάξει μια σελίδα για την ομάδα μου με login / register

στην αρχή όμως το login λειτουργούσε και μετά από λίγο καιρό δεν έπιανε καθόλου στην MySQL

και δεν ξέρω ποιο ακριβός είναι το πρόβλημα..

 

Σας παρακαλώ αν μπορεί κάποιος να με βοηθήσει!!!

 

>
<div id="content">
  <div id="center">
<div id="title_back_white">
<div id="title_text_left_white"></div>
<div id="title_text_center_white">Login area</div>
<div id="title_text_right_white"></div>
</div>

<div id="main">
<?php
include 'dbc.php';
error_reporting(E_ERROR | E_PARSE);
$username = mysql_real_escape_string($_POST['username']);
if ($_POST['Submit']=='Login')
{
$md5pass = $_POST['password'];
$sql = "SELECT username,password FROM users WHERE
	    username = '$username' AND
	    password = '$md5pass' AND active='1'";  
$result = mysql_query($sql) or die (mysql_error());
$num = mysql_num_rows($result);
   if ( $num != 0 ) {
    // A matching row was found - the user is authenticated.
   session_start();
   list($username,$md5pass) = mysql_fetch_row($result);
 // this sets variables in the session
 $_SESSION['username']= $username; 

 
 if (isset($_GET['ret']) && !empty($_GET['ret']))
 {
 header("Location: $_GET[ret]");
 echo "";
 } else
 {
 header('Location: index.php?id=index');
 header("Location: index.php?id=index");

 echo "Logged as $username <meta http-equiv='refresh' content='5;url=index.php?id=index'>";
 }
 //echo "Logged in...";
 exit();
   }
header("Location: index.php?id=login&msg=<b>Wrong username or password or Check your email with activation link</b>");
echo "<meta http-equiv='refresh' content='0;url=index.php?id=login&msg=<b>Wrong username or password or Check your email with activation link</b>'>";
exit(); 
}
?>
<?php if (isset($_GET['msg'])) { echo "<div class=\"msg\"> $_GET[msg] </div>"; } ?>

</p><table width="40%" border="0" align="center" cellpadding="0" cellspacing="0">
 <tr>
   <td><form name="form1" method="post" action="">
    <p> </p><b>
    <p align="center">Username:
	  <input name="username" type="text" id="username">
    </p>
    <p align="center"> Password:
	  <input name="password" type="password" id="password">
    </p>
    <p align="center">
  <button type="submit" name="Submit" value="Login">Login</button>
    </p>
    <p align="center"><a class="border2" href="register.php">Register</a></p></b>
  </form></td>
 </tr>
</table>

  <tr><td colspan="2" class="news_line"></td></tr>
 
</div></div>

Δημοσ.

Τα header δεν λειτουργούν ούτος η αλλος

επειδή στο index.php το έχω κάνει με

>
<?php include('menu-class.php");?>

 

Και στο menu-class.php

>
<?php
$login = $_GET["id"];

switch($login)
{
case 'login';
require_once 'incl/login.php';
break;
}
?>

 

Γιατί όλο το site είναι έτσι για να μην φτιάχνω teams.php,index.php,matches.php κτλπ..

 

Γιαυτό βάζω αυτό στο login.php

>
echo "Logged as $username <meta http-equiv='refresh' content='5;url=index.php?id=index'>";

Δημοσ.

>
$md5pass = $_POST['password'];

 

Αυτό φαίνεται κάπως ύποπτο (λόγω του ονόματος του variable).

 

To password είναι ήδη σε md5 μέσα στο $_POST ή έχεις ξεχάσει τη γραμμή που το κάνει hash;

Δημοσ.

Αυτό φαίνεται κάπως ύποπτο (λόγω του ονόματος του variable).

 

To password είναι ήδη σε md5 μέσα στο $_POST ή έχεις ξεχάσει τη γραμμή που το κάνει hash;

βασικα νομιζω οτι εχει ξεχασει την γραμμη του md5.

 

δοκιμασε να βαλεις

>


$md5pass = $_POST['password'];
$md5pass = md5($md5pass);

και να κανεις παλι login.

Δημοσ.

Αυτό φαίνεται κάπως ύποπτο (λόγω του ονόματος του variable).

 

Και όχι μόνο αυτό: επίσης το username προστατεύεται από SQL injection με mysql_real_escape_string, ενώ το password όχι. Επομένως όποιος έγραψε τον κώδικα "έκανε οικονομία" (κακώς) στη mysql_real_escape_string επειδή ήξερε ότι το $password είναι safe. Το οποίο σημαίνει ότι στάνταρ υπήρχε ένα md5() εκεί.

Δημοσ.

Η κωδικοί δεν είναι με md5 απλά ήταν να βάλω md5 και δεν έβαλα

και το έχω φτιάξει έτσι όστε να πιάνει τον κωδικό του user που είναι φανερός στην MySQL

και για να γίνεται POST ο κωδικός για το Login..

Δημοσ.

Το γεγονός είναι ότι από άποψη ασφάλειας η υπάρχουσα υλοποίηση μπάζει από παντού (π.χ. είναι πανεύκολο να κάνεις login με όποιο username θέλεις χωρίς να ξέρεις το password). Έχεις δουλειά μπροστά σου.

  • Like 1
Δημοσ.
Αν έχεις κάποια συγκεκριμένη ερώτηση μπορείς να την κάνεις και αν μπορώ θα την απαντήσω. Δεν μπορώ όμως να σε βοηθήσω με την έρευνα και το διάβασμα πέρα από το να σου δώσω κατευθύνσεις.

 

Μπορεί ΕΠΙΤΕΛΟΥΣ να γίνει στίκυ με έντονα κόκκινα γράμματα, μπακγκράουντ που αναβοσβήνει και να παίζει απαγγελία μόλις μπαίνει κάποιος σε αυτό το σέξιον; Ακριβώς όπως είναι.

  • Like 1
Δημοσ. (επεξεργασμένο)

Και όχι μόνο αυτό: επίσης το username προστατεύεται από SQL injection με mysql_real_escape_string, ενώ το password όχι. Επομένως όποιος έγραψε τον κώδικα "έκανε οικονομία" (κακώς) στη mysql_real_escape_string επειδή ήξερε ότι το $password είναι safe. Το οποίο σημαίνει ότι στάνταρ υπήρχε ένα md5() εκεί.

Έχεις δίκαιο, αλλά σύμφωνα με το link που έδωσες:

Most frameworks, including languages like PHP, have default security settings by now that don't allow multiple statements in one SQL string. In PHP, for example, you can only run multiple statements in one SQL string by using the mysqli_multi_query function.

και μετά από προσωπικά test:

>
<?php
$host = 'localhost';
$dbuser = 'root';
$dbpass = '';


$user = 'panos\' && password=\'mitsos\'); insert into accounts(username,password) values(\'panos\',\'panos\'); --';
$pass = 'random pass';
$dquery = 'select * from accounts where (username=\'$user\' && password=\'$pass\');';
$query = 'select * from accounts where (username=\''.$user.'\' && password=\''.$pass.'\');';
?>
<form action="" onsubmit="">
   <table style="width:100%;">
       <tr>
           <td>$user:</td>
       </tr><tr>
           <td><textarea style="width:100%;resize: none"><?php echo $user ?></textarea></td>
       </tr>
       <tr><tr>
           <td>$pass:</td>
       </tr><tr>
           <td><textarea style="width:100%;resize: none"><?php echo $pass ?></textarea></td>
       </tr>            
       <tr><tr>
           <td>Original query:</td>
       </tr><tr>
           <td><textarea style="width:100%;resize: none"><?php echo $dquery ?></textarea></td>
       </tr>            
       <tr><tr>
           <td>Cracked query:</td>
       </tr><tr>
           <td><textarea style="width:100%;resize: none"><?php echo $query ?></textarea></td>
       </tr>
       </table>
</form>

<?php
$conn = mysql_connect($host, $dbuser, $dbpass) or die('MySQL Error: '.mysql_error());
$db = mysql_select_db('test',$conn) or die('MySQL Error: '.mysql_error());

$result = mysql_query($query, $conn) or  die('MySQL Error: '.mysql_error());

?>

 

Μου κοπανάει error(Αν το τρέξω από το pma δεν βγάζει error, οπότε δεν έχει mysql syntax error):

test.jpg

Επεξ/σία από ntellos
Δημοσ.

Ναι, δεν μπορείς να κάνεις execute επιπλέον queries αλλά επίσης δεν χρειάζεται:

 

(σημ: τα SQL fragments που δίνω είναι στοχευμένα στο απο πάνω σου post, όχι στον κώδικα που είχε δώσει το παλικάρι στην αρχή -- υπάρχουν διαφορές στην SQL αλλά η ουσία δεν αλλάζει)

 

>$username = 'whatever';
$pass = '\' OR 1) LIMIT 1 --';

 

Μπορείς να βάλεις κάτι άλλο στο OR, ας πούμε αν θέλεις να κάνεις login σα συγκεκριμένος χρήστης. Επίσης μπορείς π.χ. να αρχίσεις να το δίνεις με ORDER BY username LIMIT 0, 1, μετά να κάνεις logout, να το δώσεις με LIMIT 1, 1, κλπ κλπ και με τον τρόπο αυτό να ανακαλύψεις όλα τα usernames που υπάρχουν καταχωρημένα (το "logged in as xxx" που τυπώνει με αφήνει να δω τι έκανα select).

 

Αφού το κάνεις αυτό μετά μπορείς να πάρεις και όλα τα passwords για καβάτζα σε περίπτωση που κλείσει η τρύπα στο μέλλον:

 

>$pass = '\' AND 1=0) UNION SELECT password, password FROM accounts WHERE username=\'foo\' --';

 

Εννοείται πως με την ίδια ακριβώς λογική μπορείς να πάρεις όποιο δεδομένο θέλεις από όποιο πίνακα θέλεις αρκεί να ξέρεις τα ονόματα του πίνακα και της στήλης. Δεν τα ξέρεις; Δεν πειράζει, μπορείς να τα μάθεις από το INFORMATION_SCHEMA του οποίου η δομή είναι γνωστή.

 

Αυτός δεν είναι ο μοναδικός τρόπος με τον οποίο μπορείς να κάνεις exploit, απλά αυτό μου ήρθε τώρα. Και βέβαια αν κάνουμε δουλειά αντί να παίζουμε δε θα κάτσω να τα δώσω ένα ένα με το χέρι, απλά παίρνεις ένα πρόγραμμα με όλη τη λογική που χρειάζεται μέσα του και στο πι και φι σου έχει κάνει ένα "full dump" όλων των πληροφοριών που είναι accessible στα πλαίσια του user με τον οποίο κάνεις connect στη MySql.

 

Έκανες connect σαν root?

 

>SELECT * FROM mysql.user

 

Περαστικά. Im in ur dataz inserting ur recordz.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...