He intentado resolver el siguiente desafío de "piratería" para obtener experiencia con las vulnerabilidades de la web.
El servicio está programado en node.js y está accesible como enlace :
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");
})
}
})
Los detalles para enviar correos electrónicos son irrelevantes y están comentados (como en el desafío).
Los datos se almacenan en una base de datos SQLite 3 simple. Las tablas de usuarios utilizadas por el servicio se crean utilizando la siguiente consulta de creación de SQL:
CREATE TABLE users(username text, passwordhash text, key text)
Existe al menos un usuario en la base de datos, con el nombre de usuario admin
.
Goz :
Obtenga la clave privada para el usuario admin
.
Mi intento:
He intentado la inyección SQL, por ejemplo. con user
establecido en ' OR ''='
, sin embargo, no pasa nada ... Además, he leído artículos sobre MS SQL que admiten la función EXECUTE()
, pero no puedo encontrar el equivalente en SQLite. Con tal función, en principio podría ejecutar comandos de shell como nslookup
.
Es obvio que el único punto donde este servicio es vulnerable es la llamada db.get()
, y como los detalles para enviar correos electrónicos son irrelevantes, entonces de alguna manera debo hacer que la base de datos envíe la clave privada para admin
(motivo de EXECUTE()
call).
Estoy atrapado en este desafío después de pasar muchas horas, así que creo que es hora de pedir ayuda a la comunidad.