Come dimostrare l'iniezione SQL?

11

Ho delle linee nel mio codice PHP / MySQL che assomigliano a questo:

...
$sqlquery = "SELECT price FROM products WHERE 1=1 AND id=".$_POST['id'];
...
... query is executed
...
echo $price;

Come test / dimostrazione, come posso sovvertire questo per mostrare qualcosa come la password di un utente se avessi un utente di tabelle come:

id | username | password
------------------------
 1 |  abcde   | qwerty

In alternativa, cos'altro posso mostrare al sistema?

    
posta siliconpi 01.03.2011 - 15:21
fonte

3 risposte

18

Suppongo che tu stia utilizzando la funzione standard%% di PHP% in questo caso nel caso in cui qualcosa del genere sarebbe efficace nel tuo esempio.

SELECT price FROM products WHERE 1=1 AND id=
999999999999999999999999 
UNION ALL 
(SELECT CONCAT(username, ' ', password) FROM user) limit 0, 1;

Spiegazione

  1. Utilizza un ID di un prodotto che non esisterà.
  2. UNIONE con tabella utenti
  3. SELEZIONA una singola colonna nella tabella utenti da restituire, in quanto restituisce solo una singola colonna dal prodotto. In questo caso restituisce un campo concatenato delle colonne nome utente e password.
  4. Limite per 1. Poiché il codice presumibilmente prevede solo un singolo risultato dalla query della query. In alternativa, è possibile utilizzare una condizione WHERE per specificare un utente specifico che si desidera recuperare.

Un altro esempio potrebbe essere utilizzare mysql_query per consentire il recupero di tutte le voci dalla tabella utente in una singola query. Ispirato alla risposta su un'altra domanda qui .

SELECT price FROM products WHERE 1=1 AND id=-1 
UNION ALL 
(SELECT CONCAT(GROUP_CONCAT(username), '\n', GROUP_CONCAT(password)) FROM user);

Risorse aggiuntive che coprono gli attacchi SQL Injection:

risposta data 01.03.2011 - 16:12
fonte
5

Alla tua ultima domanda:

Alternatively, what else can I get the system to show?

Generalmente, dipende da come è configurato il server SQL e se ci sono alcune attenuazioni presenti. Ma l'hacker potrebbe non solo mostrare le password degli utenti, in alternativa, può provare a:

  • legge e scrive su vari file;
  • scrivi nel database e leggi da esso;
  • crea DoS e altre azioni dannose;

Ogni operazione dipende da diversi fattori, come, come ho detto, la presenza di fattori di mitigazione, permessi sui file, configurazione del sistema, ecc.

A proposito, per l'utente malintenzionato non è necessario mostrare il risultato della richiesta SQL. Nel caso in cui l'attaccante non possa visualizzare la risposta, rende il processo di estrazione delle informazioni più lento e difficile, ma non impossibile.

Se ti interessa, ti suggerisco di leggere il blog di Bernardo Damele - il creatore di sqlmap: link . Ci sono presentazioni interessanti e la lettura su cosa può essere fatto e come.

    
risposta data 02.03.2011 - 17:52
fonte
0

C'è un classico esempio chiamato "Exploits of a Mom" su xkcd che probabilmente funzionerebbe quasi letteralmente nel tuo esempio. L'idea è di pubblicare una stringa come la seguente come id, in modo tale che il tuo codice la legga come $ _POST ['id']:

-1; SELECT * FROM users;

Supponendo che quando si passa la query al database è separata in più istruzioni al punto e virgola, questo è il risultato che il database vede:

SELECT price FROM products WHERE 1=1 AND id=-1;

SELECT * FROM users;

Il tuo utente malintenzionato è riuscito a elencare l'intero database dell'utente. In questo modo, è possibile eseguire comandi di database arbitrari.

Poiché il codice probabilmente elabora il risultato della query e visualizza alcuni risultati in una pagina Web, un utente malintenzionato può eliminare cose, falsificare dati o persino spiare informazioni dal database e potenzialmente utilizzarlo per modificarle. Ciò può includere il dirottamento di account o, se il database e il design del server lo consentono, effettuare ordini senza eseguire pagamenti.

    
risposta data 04.07.2013 - 18:00
fonte

Leggi altre domande sui tag