Da ex bug hunter:
# config.php
Codice PHP:
<?php
/**
* config.php
*
* Funzioni di gestione database
*
* @author Your Name <your@email.com>
* @copyright Copyleft (c) 2014, Your Name
*/
/**
* Connession, selezione e selezione codifica caratteri al database
*
* @param void
* @return void
*/
function dbConnect() {
$dbHost = "";
$dbName = "";
$dbUser = "";
$dbPass = "";
if ( !$dbConnect = @mysql_connect( $dbHost, $dbName, $dbUser, $dbPass ) ) {
exit( "Impossibile connettersi al database." );
}
if ( !@mysql_select_db( $dbName, $dbConnect ) ) {
exit( "Impossibile selezione il database." );
}
// Richiesto per prevenire il bypass delle funzioni di escaping
@mysql_query( "SET NAMES 'utf8'" );
}
/**
* Esegue le query proteggendole da attacchi SQL Injection
*
* @param string Stringa query da eseguire
* @param array Argomenti da passare alla query
* @return resource Resource id della query
*/
function dbQuery( $query, $params = array() ) {
global $dbConnect;
// Verifica che ci siano parametri da inserire, eventualmente li cicla e li purifica
if ( count( $params ) ) {
foreach ( $params as $key => $value ) {
$params[$key] => mysql_real_escape_string( $query );
}
$query = vsprintf( $query , $params );
}
// Esegue la query
if ( !$queryId = @mysql_query( $query, $dbConnect ) ) {
exit( mysql_error() );
}
return $queryId;
}
?>
*.php
Codice PHP:
<?php
/**
*
*
*
*
* @author Your Name <your@email.com>
* @copyright Copyleft (c) 2014, Your Name
*/
// Costanti fondamentali
define( "DS", DIRECTORY_SEPARATOR );
define( "ROOT_PATH", dirname( __FILE__ ) . DS );
// Include le librerie fondamentali
require_once( ROOT_PATH . "config.php" );
// Connessione e selezione al database
dbConnect();
// Dati cookie provenienti dall'utente
$data = array();
$data["nome"] = isset( $_COOKIE["nome"] ) ? $_COOKIE["nome"] : "";
$data["pass"] = isset( $_COOKIE["pass"] ) ? $_COOKIE["pass"] : "";
// Verifica se l'utente è loggato
if ( $data["nome"] != "" && $data["pass"] != "" ) {
$query = "SELECT uid, name,email, password, crediti,autorizzazione FROM utenti WHERE name = '%s' AND password = '%s' LIMIT 1";
$result = dbQuery( $query, $dbConnect );
if ( mysql_num_rows( $result ) == 1 ) {
$resrow = mysql_fetch_array( $result );
echo "Bentornato " . htmlspecialchars( $resrow["name"] ) . "<br>";
echo intval( $resrow["crediti"] ) . " <img src='img/crediti.png'></img><br>";
echo "Hai i privilegi da " . ( $resrow["autorizzazione"] == 1 ? "amministratore" : "utente" ) . "<br><br>";
echo "Clicca <a href='logout.php'>Qui</a> per disconnetterti";
exit;
}
}
// Verifica se l'utente sta eseguendo il login
if ( !defined( "IS_USER" ) && isset( $_POST["nome"] ) && isset( $_POST["pass"] ) ) {
$query = "SELECT uid, name,email, password, crediti,autorizzazione FROM utenti WHERE name = '%s' AND password = '%s' LIMIT 1";
$result = dbQuery( $query, $dbConnect );
if ( mysql_num_rows( $result ) == 1 ) {
$resrow = mysql_fetch_array( $result );
setcookie( "nome" , $resrow["name"] , time()+3600 );
setcookie( "crediti", $resrow["crediti"] , time()+3600 );
setcookie( "pass" , $resrow["password"], time()+3600 );
echo "Benvenuto " . htmlspecialchars( $resrow["name"] ) . ", hai effettuato correttamente l' accesso.";
header( "refresh: 3; url=home.php" );
exit;
}
}
// Errori?
if ( isset( $_POST["login"] ) ) {
echo "<font color='red'>Utente e/o Password errata.</font><br />";
}
echo <<<TPL
<form method="POST">
Nome Utente: <input type="text" name="nome"><br />
Password: <input type="password" name="pass"><br />
<input type="submit" name="login" value="Accedi">
</form>
TPL;
mysql_close( $dbConnect ):
?>
Così non è hackerabile da nessuna tecnica attualmente conosciuta.
Lo soluzione da te postata può essere hackerata nel seguente modo:
1) creare un cookie utente con il nick dell'admin.
2) se non si è a conoscenza del nick dell'admin o della struttura della piattaforma, bisogna eseguire diversi steps per scoprire nomi e struttura della tabella e infine estrarre i dati dal database, creando sempre un cookie con dice sql maligno.