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 34Warning:
mysql_fetch_array()
expects parameter 1 to be resource, boolean given in/home/shop/public_html/product.php
on line 40You 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 205Warning:
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 205Warning:
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:
- È 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?
- In secondo luogo, poiché il browser codifica caratteri speciali (ad esempio spazi in
%20
), ciò non significa che MySQL otterrà qualcosa comeWHERE id='1234%20AND%201=1
e causerà un errore di sintassi? - Perché ha prodotto lo stesso risultato anche quando ho provato ad aggiungere
AND 1=1
eAND 1=2
alla fine del parametro id? - 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? - 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.