Iniezione SQL: vera funzione di stringa di escape

2

example4.php? Id = id = 2-1

Mi sono imbattuto nella suddetta iniezione e non riesco a capire perché (come) funziona e ciò che è interessante è che restituisce tutti i record dal database.

Qualcosa ragazzi? educami

Grazie

    
posta Asak 21.04.2014 - 14:53
fonte

2 risposte

1

Esegue la query WHERE id=id . Poiché id è solo un'altra colonna e in SQL puoi semplicemente passare il nome della colonna quando esegui operazioni di confronto.

Si sta dicendo di recuperare tutte le righe WHERE id della riga uguale a id della stessa riga, che è vero per tutte le righe.

Questo è uguale a WHERE 1=1 , in pratica altera WHERE istruzione in modo tale che sia sempre true.

    
risposta data 21.04.2014 - 15:58
fonte
1

Il frammento iniettato probabilmente genera una query simile a questa:

… WHERE id=id=2-1

Poiché MySQL viene analizzato da sinistra a destra, quanto sopra è equivalente a:

… WHERE (id=id)=2-1

Quindi l'espressione id=id viene valutata per prima e restituisce 1 (% co_de valore%) per ogni riga come qualsiasi valore non- TRUE equivale a se stesso quando si utilizza NULL operazione . Quindi può essere semplificato in:

… WHERE 1=2-1

Che, ovviamente, può essere semplificato in:

… WHERE 1=1

E questo, di nuovo, è vero per ogni riga con un valore% non= NULL .

Per quanto riguarda il titolo: è un comune fraintendimento che il passaggio di un valore di input attraverso la funzione id lo rende automaticamente sicuro da utilizzare in una dichiarazione SQL . Anche il manuale PHP afferma che è ambiguo:

This function must always (with few exceptions) be used to make data safe before sending a query to MySQL.

Tuttavia, ciò che manca al manuale è che i valori passati attraverso mysql_real_escape_string devono essere usati solo in MySQL stringhe letterali e da nessun'altra parte. Sfortunatamente, il manuale manca di chiarire quell'aspetto importante.

Il risultato è che mysql_real_escape_string viene anche utilizzato per dati che non sono intesi come valori letterali stringa. Come un diverso valore letterale , un parola chiave , o anche come identificativo colonna o tabella .

Allo stesso modo, nel caso discusso sopra, il valore di input non è usato in una stringa letterale, quindi mysql_real_escape_string non aiuterà. Tuttavia, una dichiarazione preparata, in cui l'input sarebbe passato come parametro, avrebbe aiutato.

    
risposta data 21.04.2014 - 19:17
fonte

Leggi altre domande sui tag