SQL injection possibile con parametri GET nascosti?

1

Mi è stato chiesto dal mio amico di giocare con il nuovo sito web della sua famiglia e segnalare eventuali bug che potrei incontrare. Passando attraverso le pagine, ho notato uno che sembra molto incline all'iniezione SQL. Non ho accesso al codice sorgente in quanto è ospitato da una società di progettazione di siti Web locali.

http://website.tld/product/1234/a-beautiful-vase

Dopo aver giocato con l'URL, sono riuscito a ottenere la stessa identica pagina con:

http://website.tld/product.php/id=1234

Ho sostituito 1234 con 1234' e il sito Web ha generato il seguente errore:

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /home/shop/public_html/product.php on line 34

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /home/shop/public_html/product.php on line 40

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 ''1234''' at line 1

Ho anche provato a sostituire id=1234 con id=1234 AND 1=1 (codificato automaticamente dal browser in id=1234%20AND%201=1 ) e id=1234 AND 1=2 (codificato automaticamente dal browser in id=1234%20AND%201=2 ). Con entrambi i tentativi, la pagina web riesce a caricare la pagina del prodotto con due ulteriori errori lanciati:

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /home/shop/public_html/product.php on line 205

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /home/shop/public_html/product.php on line 217

La pagina del prodotto appare normale con le informazioni sul prodotto, il peso, il prezzo e l'immagine correttamente compilati. Non c'è alcun errore di sintassi SQL. Ed è qui che mi sono un po 'confuso.

Ho anche provato un sacco di altre varianti:

  • id='1234%20AND%201=2 resa ...to use near '1234%20AND%201'' at line 1
  • id=1234'%20AND%201=2 resa ...to use near ''' at line 1
  • id='1234'%20AND%201=2 resa ...to use near '1234'%20AND%201'' at line 1
  • id=1234%20AND%20'1'=2 resa ...to use near '1''' at line 1

Tuttavia, id=1234%20AND%201='2 rende anche la pagina del prodotto corretta con i due avvisi PHP come sopra:

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /home/shop/public_html/product.php on line 205

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /home/shop/public_html/product.php on line 217

Credo che le mie domande siano:

  1. È possibile, in questo caso, eseguire l'iniezione SQL? Ho trovato numerosi tutorial online che spiegavano come iniettare i normali parametri GET. Tuttavia, se non mi sbaglio molto, .htaccess è usato per riscrivere l'URL in modo tale da impedire (o modificare) la procedura?
  2. In secondo luogo, poiché il browser codifica caratteri speciali (ad esempio spazi in %20 ), ciò non significa che MySQL otterrà qualcosa come WHERE id='1234%20AND%201=1 e causerà un errore di sintassi?
  3. Perché ha prodotto lo stesso risultato anche quando ho provato ad aggiungere AND 1=1 e AND 1=2 alla fine del parametro id?
  4. Perché id=1234%20AND%20'1'=2 ha prodotto ...to use near '1''' at line 1 ? Ho solo messo una virgola singola intorno a 1, ma l'errore sembra indicare che ci sono altre due virgolette singole dopo 1?
  5. Il browser web (sto utilizzando Google Chrome) non sembra codificare il segno = , ma modificarlo manualmente in %3D non sembra fare la differenza nel risultato. Perché è così?

Due punti aggiuntivi che vorrei sottolineare:

  • Gli avvertimenti PHP lanciati quando è un errore di sintassi SQL e quando non ci sono sono diversi, basta dare un'occhiata ai numeri di riga. Suppongo che le righe 205 e 217 siano query utilizzate per trovare prodotti correlati, mentre la query principale che riporta il prodotto id = 1234 si trova intorno alla riga 34-40.
  • id=1234%20-- rende perfetta la pagina del prodotto senza alcun errore o avviso.
posta user1316560 09.02.2017 - 09:28
fonte

1 risposta

1

Proverò a rispondere a una domanda alla volta,

  1. Is it possible, in this case, to perform SQL injection? I found extensive tutorials online explaining how to inject normal GET parameters. However, if I'm not much mistaken, .htaccess is used to rewrite the URL so would that prevent (or change) the procedure?

Sì, è possibile. Poiché la query si aspetta di restituire un risultato, è possibile forzare la query corrente a non restituire alcun risultato (punto di controllo 3) e quindi creare un'unione con un'altra tabella (ad esempio la tabella utenti) e restituire una singola riga alla volta. / p>

  1. Secondly, since the browser encodes special characters (for example spaces to %20), doesn't that mean MySQL will get something like WHERE id='1234%20AND%201=1 and cause a syntax error?

No, i caratteri sono solo codificati nell'url, quando la stringa raggiunge il server sarà come se non fosse codificata.

  1. Why did it yield the same result even when I tried adding AND 1=1 and AND 1=2 at the end of the id parameter?

Stai ricevendo quell'errore perché la query restituisce false, forse perché il modo in cui la query è costruita e non ti stai iniettando correttamente. Ad esempio quando dici AND 1=2 stai rendendo falsa la condizione e non viene restituita nessuna riga. Ma leggi meglio questo per capire meglio.

Prova a mettere - dopo, come id=1234 OR 1=1 -- , per cercare di evitare quell'errore.

  1. Why did id=1234%20AND%20'1'=2 yield ...to use near '1''' at line 1? I only put one single quote around 1 yet the error seems to indicate there are two additional single quotes after 1?

Potrebbe essere il formato per il database restituire gli errori, se si nota, negli altri errori, aggiunge anche "" alla fine.

  1. The web browser (I'm using Google Chrome) doesn't seem to encode the = sign, yet manually changing it into %3D doesn't seem to make a difference in the outcome. Why is that?

Guarda il punto 2. Quando la stringa raggiunge il server sarà a = in ogni caso.

    
risposta data 09.02.2017 - 10:31
fonte

Leggi altre domande sui tag