Ho provato a risolvere la seguente sfida "hacking" per ottenere esperienza con le vulnerabilità del web.
Il servizio è programmato in node.js ed è accessibile come link :
app.post ("/reset/", function (req, res) {
var user = req.body.username;
if (!user) {
res.send("no username provided");
} else {
db.get (
"select * from users where username='" + user + "'",
function (err, row) {
// ...
if (row) {
// ... send email because we have a real response
}
res.send("password reset email has been queued");
})
}
})
I dettagli per l'invio di e-mail sono irrilevanti e sono commentati (come nella sfida).
I dati sono memorizzati in un semplice database SQLite 3. Le tabelle utenti utilizzate dal servizio vengono create utilizzando la seguente query di creazione SQL:
CREATE TABLE users(username text, passwordhash text, key text)
Esiste almeno un utente nel database, con nome utente admin
.
Obiettivo:
Ottieni la chiave privata per l'utente admin
.
Il mio tentativo:
Ho provato l'iniezione SQL, ad es. con user
impostato su ' OR ''='
, tuttavia non accade nulla ... Inoltre, ho letto articoli su MS SQL che supportano la funzione EXECUTE()
, ma non riesco a trovare l'equivalente in SQLite. Con una tale funzione, potrei in principio eseguire comandi di shell come nslookup
.
È ovvio che l'unico punto in cui questo servizio è vulnerabile è la chiamata db.get()
, e poiché i dettagli per l'invio di e-mail sono irrilevanti, allora devo in qualche modo fare in modo che il database invii la chiave privata per admin
(motivo per EXECUTE()
chiamata).
Sono bloccato in questa sfida dopo aver trascorso molte ore, quindi penso che sia ora di chiedere aiuto alla comunità.