- Home
- Categorie
- Coding e Sistemistica
- PHP
- Problema di sicurezza sito - accesso violato
-
Problema di sicurezza sito - accesso violato
Salve ragazzi , ho scoperto da poco che delle persone sono entrate nel mio pannello di controllo di un sito , la mia pagina fi login è cosi' formata
admin.php
[PHP]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//IT"><html>
<head><style>
a
{
text-decoration: none;
}</style><div id="adminaccesso"><center><td class="riga" bgcolor="#FFFFFF"><a href="#" onclick="history.go(-1);return false;" style="FONT-FAMILY: Verdena,Tahoma,sans-serif; FONT-SIZE:12px;font-weight: bold;color: #ffffff;border:0px;background-color:#7D1D1E;">Torna indietro</td></a><font class="fontprofilo"><b>Per accedere a questa area devi essere abilitato dal webmaster del sito</b></font><br>
<form action="loginadmin.php" method="post">
<font class="fontprofilo">
Nickname<br>
<input type="text" name="nickname"><br>
Password<br>
<input type="password" name="password"><br>
<center><input type="submit" style="font-family:tahoma; font-size:11px;" size="1" value="Accedi" /></center></a>
<b>Ricordo che puoi contattare il Webmaster all indirizzo <A HREF="mailto:inuaenail">infomiosito</a></b></font>
</form>
[/PHP]
e poi c'è loginadmin.php cosi' composta
[PHP]
<?
session_start(); //avvio l'utilizzo delle sessioniinclude "config.php";
setlocale(LC_TIME, 'it_IT');
// Sessione impostata a 10 min
ini_set('session.gc_maxlifetime', '1800');
//protezione sql injection
if($_POST['nickname'])
$nickname = mysql_real_escape_string($_POST['nickname']);
else
$nickname = "";//seleziono il database
mysql_select_db('Sql513457_2') or die("Errore apertura database: " . mysql_error());$selezione="SELECT utente,pass FROM accessoadmin WHERE utente='".mysql_real_escape_string($_POST['nickname'])."' AND pass='".mysql_real_escape_string($_POST['password'])."'";
$eseguisel=mysql_query($selezione);
if (mysql_num_rows($eseguisel) ==1) {
echo "Login effetuato con successo..Attendi";//ciclo while che mi richiama l'array dei dati selezionati dal database
while($ROW = mysql_fetch_array($eseguisel))
{
//qui vanno settati un po' di SESSIONI
$_SESSION['logged']=1;//setto che l'utente è loggato}
echo "<script>
alert("Ok!!!");
location = "miosito/pannello.php"
</script>";exit;
} else {
echo "<script>
alert("Dati inseriti non corretti!!!");
location = "miosito/index.php"
</script>";
//annullo tutte le chiavi di sessioni se esistono
session_unset();
session_destroy();exit;
}
?>
[/PHP]poi c'è pannello.php
[PHP]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//IT"><html>
<head><title>Pannello di controllo</title>
<style>
a
{
text-decoration: none;
}
<?//Apro la sessione e...
session_start();
//verifico che dopo il login io abbia la chiave di sessione ad 1
if($_SESSION['logged']==1){//recupero i valori dal form precedente
$id = $_SESSION['id'];}
else {
//altrimenti...
echo "Non sei loggato...";
//annullo tutte le chiavi di sessioni se esistono
session_unset();
session_destroy();
echo "<script>
alert("Ok!!!");
location = "miosito/index.php"
</script>";
exit;
} ?>
</style>
<center><a href="miosito/nseriscinews.php"> Inserisci news divertente</a><br>
<a href="miosito/inseriscinews2.php"> Inserisci news</a><br>
<a href="miosito/inseriscirecensione.php"> Inserisci recensione</a><a href="miosito/inseriscivideo.php"> Inserisci video</a>
</center>
</body>
</html>[/PHP]
Cortesemente mi aiutate a capire dove sta il bug ?
Grazie
-
Ciao. Se non lo fai da qualche altra parte non lo so ma nei tre file che hai postato non c'è uno straccio di algoritmo per criptare la password.
Adderittura tu hai una query di questo tipo:
[php]
$selezione="SELECT utente,pass FROM accessoadmin WHERE utente='".mysql_real_escape_string($_POST['nickname'])."' AND pass='".mysql_real_escape_string($_POST['password'])."'";
[/php]
in cui la parte dedicata al nickname è anche una ripetizione visto che controlli a inizio del file se $_POST['nickname'] è settato e nel caso lo passi con la funzione mysql_real_escape_string come giusto che sia ritornando il suo valore
eventualmente ripulito nella variabile $nickname che potresti usare per accorciare la query al posto di tutta quella pappardella
Quello che rappresenta un grosso problema, come ti dicevo poco sopra, è che se è giusto estrarre un nickname in "chiaro" non lo è più di tanto estrarre la password che almeno dovrebbe essere criptata in md5 o sha1
direttamente nel database e quindi la query dovrebbe diventare un qualcosa di simile a:
[php]
$selezione="SELECT utente,pass FROM accessoadmin WHERE utente='".mysql_real_escape_string($_POST['nickname'])."' AND pass='".mysql_real_escape_string(md5($_POST['password']))."'";
[/php]
che starebbe a significare la presenza di una password criptata nel database (tua e possibilmente di tutti gli utenti) e quindi inviolabile; nota l'md5 messo prima di $_POST['password'].
Per tornare alla tua domanda più che un bug è una grossa falla di sicurezza sfruttata da qualcuno che si è trovato nickname e password in chiaro sotto mano.Ciao