Proteggere login con autenticazione database

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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
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
 

max_400

Utente Attivo
23 Gen 2009
770
0
16
caltanissetta
max400.forumfree.it
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
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:
 

max_400

Utente Attivo
23 Gen 2009
770
0
16
caltanissetta
max400.forumfree.it
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
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
 

max_400

Utente Attivo
23 Gen 2009
770
0
16
caltanissetta
max400.forumfree.it
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:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
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
 

max_400

Utente Attivo
23 Gen 2009
770
0
16
caltanissetta
max400.forumfree.it
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

..
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
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
 

max_400

Utente Attivo
23 Gen 2009
770
0
16
caltanissetta
max400.forumfree.it
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

..
..
 

max_400

Utente Attivo
23 Gen 2009
770
0
16
caltanissetta
max400.forumfree.it
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
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:)
 

max_400

Utente Attivo
23 Gen 2009
770
0
16
caltanissetta
max400.forumfree.it
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
 

max_400

Utente Attivo
23 Gen 2009
770
0
16
caltanissetta
max400.forumfree.it
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:

max_400

Utente Attivo
23 Gen 2009
770
0
16
caltanissetta
max400.forumfree.it
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
Autore Titolo Forum Risposte Data
B Come proteggere la casa durante i nostri lunghi viaggi Discussioni Varie 1
R [c#] Proteggere il codice dell'applicazione C/C++ 0
S [PHP] proteggere pagine PHP 10
B Proteggere cartella Apache ma non le sottocartelle!!! Apache 0
anton Proteggere un file con htaccess Apache 0
anton Proteggere un file su host HTML e CSS 9
S proteggere download dei file PHP 6
M proteggere un file testuale da accesso diretto PHP 4
G Proteggere le tabelle in access MS Access 0
P Sistema migliore per proteggere le immagini? Discussioni Varie 8
A Proteggere Cartella con .htaccess su Xoom.it Web Server 2
max_400 Proteggere i cookie PHP 7
M Proteggere PHP PHP 4
Jam1 proteggere foto con watermark da accessi tramite $_GET[''] PHP 16
maurodefilippis Software Per DRM per proteggere pdf ed epub Windows e Software 1
C Proteggere file sul server Apache 2
asevenx proteggere dati con password sicura PHP 8
max_400 Nascondere indirizzo o visualiz. un altro oppure Proteggere pagina php ricevente PHP 6
S [VB.NET] Proteggere le applicazioni .NET Framework 0
M [htaccess] Proteggere file con password Web Server 1
I proteggere le pagine internet PHP 25
M Proteggere più pagine con password PHP 12
R Proteggere una pagina di un sito con password PHP 23
G php - codice per proteggere le pagine PHP 10
M Proteggere un intero sito con .htaccess PHP 1
S Proteggere file e dati nel FTP Web Server 0
M come posso proteggere le mie immagini? Javascript 5
Z proteggere pagine Classic ASP 2
Maverick1000tt Proteggere pagina html HTML e CSS 2
M Proteggere una pagina con password usando ASP Classic ASP 6
C Come proteggere le immagini Webdesign e Grafica 1
D Proteggere immagini HTML e CSS 3
grottafelix Tutorial Asp: come proteggere le pagine Supporto Mr.Webmaster 6
peppoweb Proteggere PHP: guida passo passo PHP 0
L Problemi con il login PHP 2
L login e session PHP 4
A Problema login con Safari PHP 14
R Reinderizzamento dopo login PHP 2
C finestra popup dopo login PHP 2
L login con solo un codice PHP 3
Web93 PROBLEMA SITO WEB WORDPRESS - LOGIN DASHBOARD Programmazione 3
M Login Autenticazione Sviluppo app per Android 0
M Effettuare Login con dati Json Sviluppo app per Android 0
S [PHP] Stampa a video Nome e Cognome in seguito a login PHP 1
M [PHP] header (location..) non funzionante dopo login PHP 3
L [PHP] Visualizzare utente dopo login PHP 0
L [PHP] login con password_verify PHP 3
A HTML issues with creating a register and login page + general questions HTML e CSS 1
L [PHP] login con varie entrate PHP 3
L [PHP] login con password_verify - password_hash PHP 5

Discussioni simili