Proteggere login con autenticazione database

  • Creatore Discussione Creatore Discussione max_400
  • Data di inizio Data di inizio

max_400

Utente Attivo
23 Gen 2009
770
0
16
caltanissetta
max400.forumfree.it
Ho letto che c'è un modo per by-passare il confronto tra user e password che scrive l'utente sfruttando delle virgolette... qualcosa chiamato sql injector

l'argomento l'ho letto qui...
http://italianhacking.forumcommunity.net/?t=32956840#lastpost

Contromisure...
come si fa a filtrare i dati nella pagina di verifica...
per esempio..
utiliziamo
$password=htmlspecialchars($_POST['password'])
per eliminare script nocivi...

e se devo togliere le virgolette cosa metto? :book:


$password=comando_che_toglie_virgolette($_POST['password']);

per evitare che si possa by-passare il controllo ...
confondere la query.... il SELECT :book:

Grazie in anticipo
by max_400
 
ciao
se ti riferisci a questo tipo di injection

123' OR '1'='1
la query diventerebbe:
SELECT * FROM users WHERE user='root' AND pwd='123' OR '1'='1'

basta che al $_POST tu aggiunga

$password=addslashes($_POST['pass']));

per cui la query risulta
SELECT * FROM users WHERE user='root' AND pwd='123 \'OR\' \'1\'=\'1\’'
cioè la query non si spezza e viene cercata la password 123 'OR' '1'='1' che, evidentemente non esiste

è evidente che puoi usare anche altri controlli
 
il gattoooooooo... è tornato il gatto!!!

Ciao borgo italia è un bel po che non ti vedevo....

infatti avevo pensato ad un comando simile addslash
però qualcosa proprio per togliere gli apostrofi
una specie di split comunque mi affido a voi esperti nel settore
ditemi voi qual è il sistema migliore....

Poi un altra cosa ... ci sono altri modi per aggirare i login
oltre a sql injector....?
Se si quali contromisure adottare per proteggere le aree riservate... :book:

Grazie infinite...

Ps sarà una coincidenza...
quando Eliox non c'è allora spunta il gatto? :mavieni:


grazie
ciao
 
ciao
tutto dipende dall'importanza, credo che per un uso generale l'addslashes sia abbastanza sicuro.
poi puoi usare le vaie funzioni di sostituzione str_replace o preg_replace o se vuoi eliminare eventuali tag striptags.
poi sempre codificare con md5 o, meglio, con ash1.
io uso un metodo (suggerito tempo fa' da quel bamboccione di alex) nel login vado ad una pagina (io la chiamo transito.php) in puro php (quindi con visualizza origine da pagina bianca) in cui:
1. verifico di arrivare dalla pagina loggati.php
2. se vengo da altre posizioni (es chiamando direttamente ...mio_sito/transito.php) vengo rimandato (nel mio caso) alla index o alla pag di tua scelta
3. se provengo invece da loggati.php verifico user e pass
4. se user e pass Ok, metto la pass in sessione e vado alla prima_pag_riservata, nella quale verifico l'esistenza della sessione, se la session è ok procedo con quello che devo fare
5. se user e/o pass Ko per sicurezza vuoto le sessioni e rimando alla index
6. quando devo uscire dalle riservate, non esco direttamente, ma vado alla pag transito.php. non proveniendo dalla loggati.php, le eventuali sessioni vengono azzerate e vengo rimandato alla pag scelta

siii... il gatto è ritornato
non è vero che torna quando non c'è il vampiro:vampiro:, sono entrambi animali notturni:mavieni:
 
str_replace me n'ero dimenticato..però...

...se non mi ricordo male non toglie gli apostrofi... però può togliere le parole
OR o AND dal campo password.

il referer impedisce all'estraneo di utilizzare un altro form ma il trucchetto lui lo esegue direttamente dal login originale loggati.php

Devo fare un esempio pratico appena possibile... :book:

ossia 2 login....
- uno con cui e possibile "beffare" il SELECT mettendo...
USER root
PASSWORD 123' OR '1'='1

- l'altro mettendo il filtro addlashes accanto al post

$password_=htmlspeciachars($_POST['pass']));

$password=addslashes($_POST['password_']));


SELECT * FROM users WHERE user='root' AND pwd='123 \'OR\' \'1\'=\'1\’'
cioè la query non si spezza e viene cercata la password 123 'OR' '1'='1' che, evidentemente non esiste

a dopo... Mr gatto!
gatto-pc.jpg
 
ciao
bellissima la foto:)
si puoi tigliere gli apostrografi
$pass=str_replace('\'','',$_POST['pass']);
oppure usando il codice asci
$pas=str_replace('asc(non mi ricordo il numero)','',$_POST['pass']);
comunque mettendo, come detto, adslashes la stinga infetta viene considerata come un'unica stringa e non come un OR della select
 
signor gattino... ho fatto una prova... il mio login è sicuro

USER root
PASSWORD 123' OR '1'='1

la verifica è ko

bisogna per forza scrivere
il giusto nome e la giusta password

guarda un po
http://max400scuola.altervista.org/aaa/a-php/a_login_database/select-tabella1.php

come nome utente scrivi banana e
come password scrivi joe

però ho modificato la parte finale di quello script perchè non mi funzionava un cazzo!

questa parte finale in particolare
Codice:
//Esegue la query (supponiamo che sia già aperta una connessione valida al database)
$sql = mysql_query($query);

//Conta il numero di righe trovate (se questo numero è maggiore di 0 i dati immessi sono corretti)
if(mysql_affected_rows($sql)>0)
{
//Esegue la convalidazione dell'autenticazione e permette l'accesso a pagine protette
}

?>

in

Codice:
$result = mysql_query($query);

//recupero i dati che arrivano dal database
$row = mysql_fetch_array($result);

$row['user****']; //username della tabella
$row['pass****']; //password della tabella

if (($user==$row['user****']) and ($pass==$row['pass****'])) {

echo " - verifica: OK <br>";
echo " 5 secondi andrai alla pagina riservata";
header('Refresh: 5; url=area_riservata.html');

}else{
echo " - verifica: KO";
}
}

la riga del select è identica a quella del pazzo :mavieni:
http://italianhacking.forumcommunity.net/?t=32956840#lastpost

ma siccome non funzionava il suo esempio ho dovuto modificarlo un po
dimenticavo... ho usato htmlspeciachars per la ricezione di user e pass

inoltre ho fatto tutto in una pagina per accorciare i tempi e lo spazio :mavieni:
------------

Signor gattino ... ma tu l'hai provato quello script? :book:
Può darsi che a te funziona bò

ed ecco Bufalo Bill.... ih ih ih
Wild-Bill-Hickok-219x300.jpg


max che ride ... ih ih ih
 
Ultima modifica:
ciao
a parte quello che ti ho detto sulla provenienza io uso questo, è quella che ho chiamato pagina di transito

PHP:
<?php
ob_start();
//connessione al db
$user=addslashes($_POST['user']);
$pass=addslashes($_POST['pass']);
$query=mysql_query("SELECT user, pass FROM tabella WHERE user='$user' AND pass='$pass'");
$corretto=mysql_num_rows($query);
if($corretto > 0){
	//se user e pass corrette creo una sessione autorizzato
	if(!isset($_SESSION)){session_start ();}
	$_SESSION['autorizzato']=$pass;
	echo " - verifica: OK <br>";
	echo " 5 secondi andrai alla pagina riservata";
	header('Refresh: 5; url=area_riservata.php');
}else{
	header("location:index.php");//nel rimando non metterei i sec di attesa, ma immediato
}
ob_end_flush();
?>
poi la pag_riservata in pag_riservata.php e non html in modo da verificare l'esistenza della sessione

PHP:
<?php
if(!isset($_SESSION)){session_start ();}
//verifico l'esistenza della sessione
if(isset($_SESSION['autorizzato']){
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
</head>
<body></body>
<!-- e tutto il codice html e/o php necessario della pagina-->
</body>
</html>
<?php
}else{
	header("location:index.php");
}
?>
questo in modo da evitare che se uno digita www.mio_sito/pag_riservata.php possa accedere alla riservata senza passare dal log.
si funzia, prova ad accedere all'admim del mio sito e, se ci riesci fammi sapere in modo che possa aumentare i controlli
 
questo in modo da evitare che se uno digita www.mio_sito/pag_riservata.php possa accedere alla riservata senza passare dal log.
si funzia, prova ad accedere all'admim del mio sito e, se ci riesci fammi sapere in modo che possa aumentare i controlli

e qual è il tuo sito... signo gattino?

stasera proverò questo tuo script con le sessioni

PS le sessioni le ho studiate.. ultimamente ho lavorato sulla scadenza delle sessioni
e ci sono riuscito (a modo mio) aggiungendo un tot di secondi al timestap per la scadenza e tutto ok...

Però non capisco la sicurezza delle sessioni proprio in fatto di privacy so che le sessioni sono qualkosa lato client cioè quando uno chiude il browser si perdono i valori memorizzati nelle variabili di sessione.

Qui in sicilia si muore dal caldo e ogni volta aspetto la sera per lavorare al pc
Quindi stasera provo lo script e poi ti faccio sapere.


Ho visto una tua foto mentre che studi.. si vede che sei molto preparato :book:
gatto_studia.jpg

..
 
ciao
intanto con il - tra borgo e italia e poi .it e prima il solito www. e, se vuoi, anche l'http://:)
...so che le sessioni sono qualkosa lato client...
no le sessioni sono lato server, ti confondi con i cookie che vengono registrati sul pc dell'utilizzatore
 
Signor Gattino....

nella seconda pagina ci sono degli errori
non mi funziona la verifica...

manca il seguito...
Codice:
if(isset($_SESSION['autorizzato']){
?>
una parentesi tonta e anche un echo... prima del codice html :book:

veda un pò lei signor gattino... :mavieni:

gatto_studia.jpg

..
..
 
Ci sono riuscito!!! Almeno credo.... ih ih ih

dunque se vado direttamente alla pagina riservata essa
(non avendo creato la sessione) mi riporta al login...

area riservata
non me la fa vedere!!!

se invece ci vado dal login e quindi creando la sessione
login
allora sì... potrò vedere l'area riservata...
ossia Bufalo Bill e il cane che ride.... che lo sfotte!! :mavieni:

username banana
password joe


giusto??

un ultima cosa...
per distruggere la sessione e riprovare ecco il link

session destroy

ho aggiunto anche i filtri htmlspeciachars
 
ciao
da quello che ho capito hai risolto, comunque l'errore era
if(isset($_SESSION['autorizzato']){
manca una parentesi
if(isset($_SESSION['autorizzato'])){

visto che il gatto :book: (studia mihao perchè dice che php è un linguaggio da cani:eek:)
 
Signor Gattino la prossima volta è meglio che li testi gli script
altre persone a cui serve l'argomento potrebbero avere problemi...

più tardi posto gli script sicuramente ci saranno cosette da correggere

visto che il gatto (studia mihao perchè dice che php è un linguaggio da cani)

come questo?
1256896338258_005.jpg


Non penso che il cane sia così intelligente
per il php ci vuole il gatto... :mavieni:
ci vuole borgo italia eh eh
il gatto il gatto il gatto
1284969523.gif
 
Ed ecco gli script ...

index.php (contiene il login che si può fare semplicemente in html)

Codice:
<div align=center>
<table><tr><td>
<form action="transito.php" method="POST">
Username: <input type="text" name="user"><br>
Password: <input type="text" name="pass"><br>
<input type="submit" value="invia">
</form>
<br>

</td></tr></table>
</div>


transito.php questa è la pagina focale, il cuore del sistema
essa controlla username e password tra quelle inserite dall'utente
a quelle contenute nella tabella****

PHP:
<?php
ob_start();

$user_=addslashes($_POST['user']);
$pass_=addslashes($_POST['pass']);

$user=htmlspecialchars($user_);
$pass=htmlspecialchars($pass_);
echo "$user - $pass <br>";

//connessione al db
include "dati-connessione_al_database**.php";

$query=mysql_query("SELECT user**, pass** FROM tabella** WHERE user**='$user' AND pass**='$pass'");
$corretto=mysql_num_rows($query);

if($corretto > 0){

    //se user e pass corrette creo una sessione autorizzato
    if(!isset($_SESSION)){session_start ();}
    $_SESSION['autorizzato']=htmlspecialchars($pass_);

    echo "<div align=center> - verifica: OK <br>";

 echo "contenuto della variabile session autorizzato:".$_SESSION['autorizzato']."<br>";

echo " 5 secondi andrai alla pagina riservata<br></div>";

    header('Refresh: 5; url=area_riservata.php');
}else{
    header("location:index.php");//nel rimando non metterei i sec di attesa, ma immediato
}
ob_end_flush();
?>

ed ecco l' area_riservata.php in cui NON si può accedere direttamente...
provate...
area_riservata.php
non appena cliccate non vedrete la foto di Bufalo Bill e il cane che ride ma bensì
il login ... ed esattamete la pagina index.php

area_riservata.php
PHP:
<?php

if(!isset($_SESSION['autorizzato'])){
session_start();
print $_SESSION['autorizzato']." - sessione creata<br>";
}

if(isset($_SESSION['autorizzato'])){ //verifico l'esistenza della sessione


echo "<HTML>
<HEAD>
<TITLE>area riservata</TITLE>
</HEAD>
<BODY>
<div align=center>
<h1>Area riservata di Bufalo Bill</h1><br>
<img src='http://www.mondoraro.org/wp-content/uploads/2010/05/Wild-Bill-Hickok-219x300.jpg' width='219' height='300'><br> <img src='http://web.tiscali.it/max_400/mutley.gif' width='119' height='200'><br>
<br>
</div>
</BODY>
</HTML>";

}else{
    header("location:index.php");
}
?>

<div align=center>
<br>
<a href="sessiondestroy.php">distruggi sessione!</a>
</div>
PS. IMPORTANTE: username e password giusti per andare alla pagina riservata

USERNAME: banana
PASSWORD:joe

fino a quando la sessione è attiva è possibile vedere la pagina riservata...
Se guardate in basso sotto le foto c'è un link "distruggi la sessione" se cliccate su di esso andrete ad una pagina
che distrugge la sessione e quindi non avrete più accesso all'area riservata
provate!!!

ed ecco lo script
PHP:
<?php
session_start();
session_destroy();
print "<div align=center><font color=red size=6>sessione distrutta!! </font><br>Tra 5 secondi ritornerai al login...";
header('Refresh: 5; url=index.php');
?>

se riprovate ad andare su area_riservata.php non vedrete più le foto ma il login

Morale della favola:
Proteggere la pagina area_riservata.php da chi non si è loggato
...

Altre considerazioni:

il filtro htmlspecialchars penso non sia necessario visto che se non è essatta la password o l'user l'utente viene rimandato al login o meglio rimane esattamente dov'è
a voi Onorevoli la parola
 
Ultima modifica:
un ultima cosa.... la verifica per i filtri

gli apostrofi e le possibili infiltrazioni... (htmlspecialchars)

ho creato una pagina di verifica che appunto disabilita i caratteri pericolosi
(cioè eventuali infiltrazioni di script mailgni) e mette lo slash dove ci sono gli apostrofi
spezzando eventuali tentativi di SQL injector o come cazzo si scrive...

verifica.php

ho fatto tutto bene? :book:
grazie per l'assistenza

by max_400
 

Discussioni simili