Iniezione SQL semplice

1

Sto formando le mie conoscenze SQLInjection su uno strumento di formazione realizzato dalla mia università. In un certo lvl c'è questo semplice visualizzatore di prodotti che ottiene una riga basata su un id. Quindi la query dovrebbe essere qualcosa come SELECT * FROM products WHERE id = ? C'è un semplice livello di sicurezza che filtra alcuni caratteri (e combinazioni di caratteri) come OR e simili.

Il seguente input mi fornisce quattro risultati invece di uno: 1 | 1 is not null

GOAL: ottiene il passaggio degli utenti

Informazioni aggiuntive: C'è una tabella utente con una colonna password. L'utente desiderato ha il 'nome' 'Piet'

Come posso far funzionare la mia iniezione in modo tale da restituire la password da qualche parte?

    
posta Cmaster 02.06.2016 - 16:21
fonte

2 risposte

2

Forse iniettare un union ? Dovrai sapere quali colonne vengono restituite dalla query di base. Supponiamo che tu determini che la query originale essenzialmente ritorna:

SELECT id, productName, productDescription, createdDate FROM Products where ID = 1

Puoi creare una query UNION che corrisponde alla stessa struttura di colonna ma esegue una query su un'altra tabella. Quindi se passi il seguente anziché 1 : 1 UNION SELECT null, userName, userPassword, null FROM users

Creerà la seguente query:

SELECT id, productName, productDescription, createdDate 
FROM Products 
where ID = 1 
UNION 
SELECT null, userName, userPassword, null 
FROM users

Che praticamente aggiunge un'altra query che colpisce la tabella utente e restituisce username / password.

Idealmente questo ti darebbe la password perché la password sarebbe salata / hash, ma se l'esercizio ti sta chiedendo di ottenere la password probabilmente non lo è. Tieni presente che in uno scenario reale potresti saltare / cancellare le tue password per proteggerti dal danneggiamento del tuo database.

    
risposta data 02.06.2016 - 16:42
fonte
0

Dipende completamente da quali caratteri sono effettivamente filtrati.

La mia prima prova sarebbe un'iniezione usando:

UNION SELECT

Puoi testarlo rapidamente con: id = 1 UNION ALL SELECT * FROM prodotti .

Se ottiene tutti i prodotti invece di uno solo, funziona. Devi quindi indovinare il numero di colonne per prodotti e il loro tipo (ci sono molti modi per farlo, google è tuo amico).

Se prodotti è una tabella a 4 colonne con tipi di dati (varchar, varchar, int, int):

id=1 UNION ALL SELECT (name,password,0,0) FROM products

Otterrai il nome: combinazione di password.

Potrebbero esserci molti altri modi per ottenere quello che vuoi, link potrebbe aiutarti.

    
risposta data 02.06.2016 - 16:40
fonte

Leggi altre domande sui tag