Numero di enumerazione colonne in PHP / MySQL

1

Attualmente sto studiando SQLi da un libro che non citerò per evitare problemi di copyright. Il libro contiene molti esempi di stringhe / codice da MSSQL, MySQL, Oracle ecc.

Attualmente sono perplesso su quale sarebbe la sintassi equivalente in PHP / MySQL per questo esempio, dato solo in asp (assumendo un DB di MSSQL). Questa è una stringa di iniezione utilizzata nella barra degli indirizzi del browser, utilizzando ORDER BY per enumerare il numero di colonne in una tabella, ripetendo con ORDER BY 1 , ORDER BY 2 ecc. Fino a produrre un errore:

hxxp://someserver.com/products.asp?id=12+order+by+1

Quindi, la sintassi equivalente in PHP / MySQL dovrebbe essere qualcosa del tipo:

hxxp://someserver.com/products.php?id=12 order by 1

Penso che lo spazio bianco sia OK qui? O forse:

hxxp://someserver.com/products.php?id=12%20order%20by%201

Ho scritto un'applicazione per XAMPP per testare, ma non riesco a produrre un errore, quindi sto verificando che sto usando la sintassi corretta.

Per essere chiari, per il presente post, sto solo chiedendo la sintassi.

Modifica: ho pensato che ero molto chiaro che stavo solo chiedendo degli spazi bianchi in un URL ... Ho generato l'errore che stavo cercando.

Ho trovato un'istanza in cui uno spazio vs %20 fa non produce gli stessi risultati - come l'ultimo carattere in un URL.

Questo (notare lo spazio singolo dopo i due trattini):

/victim/products.php?val=100' ORDER BY 4 -- 

produce questo:

Database access failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1.

Mentre questo:

/victim/products.php?val=100' ORDER BY 4 --%20

produce:

Database access failed: Unknown column '4' in 'order clause'.

Interessante ...

So che la stessa build di XAMPP non ha problemi con uno spazio dopo 2 trattini alla fine di un'iniezione quando si trova in un campo di accesso usando il metodo POST ...

    
posta russ6100 05.07.2016 - 01:58
fonte

2 risposte

1

Quindi hai tre diversi modi di esprimere uno spazio: , + e %20 . Quando inserisci un URL, il tuo browser la ritaglierà per primo e poi l'URL lo codificherà. Puoi vedere questo in azione dando un'occhiata alla scheda di rete negli strumenti di sviluppo in Chrome. Qui puoi vedere l'URL che viene effettivamente inviato, a differenza di quello che inserisci nella barra degli URL.

Da questo possiamo concludere che uno spazio e %20 sono equivalenti, tranne che alla fine dove lo spazio verrà ignorato mentre %20 non lo sarà. Per quanto riguarda + tutto il decodificatore di URL conforme allo standard (incluso il urldecode() di PHP) lo convertirà in uno spazio, quindi può anche essere trattato come equivalente (di nuovo, eccetto se è alla fine).

Quindi perché lo spazio alla fine è importante? Leggi la documentazione di MySQL :

From a -- sequence to the end of the line. In MySQL, the -- (double-dash) comment style requires the second dash to be followed by at least one whitespace or control character (such as a space, tab, newline, and so on). This syntax differs slightly from standard SQL comment syntax, as discussed in Section 1.8.2.4, “'--' as the Start of a Comment”.

Senza uno spazio vuoto dopo -- non ottieni un commento. Quindi l'errore.

    
risposta data 01.02.2017 - 09:34
fonte
0

Questo dovrebbe essere un commento, ma è un po 'lungo.

Sembra che gli URL per i server PHP siano in qualche modo diversi da ASP. A parte l'estensione sullo script (che è comunque solo una convenzione e non un requisito cablato, nemmeno su MSWindows) non c'è alcuna differenza nel modo in cui l'URL è codificato. Finché non avrai compreso il protocollo, non avrai molto successo nel sovvertirlo.

I have written an application for XAMPP in order to test

Quindi stai provando a eseguire il debug di un programma e modificarlo contemporaneamente? Non stai rendendo la vita molto facile per te stesso. D'altra parte, vuoi che eseguiamo il debug del programma senza darci accesso al codice.

-

/someserver.com/products.xyz?id=12+order+by+1

e

/someserver.com/products.xyz?id=12%20order%20by%201

dovrebbe essere equivalente.

Se lo inserisci nel browser:

/someserver.com/products.xyz?id=12 order by 1

sarà convertito in uno dei 2 moduli mostrati sopra prima di essere spedito via cavo.

    
risposta data 05.07.2016 - 11:15
fonte

Leggi altre domande sui tag