HTBank
2 minutos de lectura
Se nos proporciona este sitio web:
Esta vez no tenemos el código fuente, por lo que debemos hacer pruebas directamente con el sitio web.
Registro de una nueva cuenta
En primer lugar, debemos registrar una cuenta:
Y luego podemos iniciar sesión para acceder a nuestro dashboard:
Análisis de archivos JavaScript
Podemos retirar dinero haciendo click en el botón:
Pero no podemos añadir dinero porque el otro botón no funciona.
Mirando los archivos JavaScript (/static/js/home.js
), solo está implementada la acción de retirar dinero:
const withdraw = () => {
const formData = new FormData();
var account = $('#account_input').val();
var amount = $('#amount_input').val();
if (!$.trim(account).length > 0 || !$.trim(amount).length > 0) {
showMessage('All fields required!');
return;
}
formData.append('account', account);
formData.append('amount', amount);
fetch('/api/withdraw', {
method: 'POST',
body: formData
})
.then((res) => {
res.json()
.then((data) => {
if (data.message == 'OK') {
return window.location.reload();
}
return showMessage(data.message)
})
})
}
No hay nada más en el sitio web, por lo que podríamos suponer que necesitamos retirar dinero de alguna manera, aun teniendo 0
monedas.
HTTP Parameter Pollution
Si usamos Burp Suite para capturar nuestras peticiones, podemos ver esta petición a /api/withdraw
:
Podemos enviar esto a la pestaña Repeater y hacer la petición:
Aquí, debemos darnos cuenta de que el servidor ha puesto cookies session
y connect.sid
, que son típicas de Express JS (Node.js). Sin embargo, el servidor agrega una cabecera Server: Werkzeug/3.0.1 Python/3.11.6
, que es probable que sea de Flask.
Este tipo de configuración puede ser vulnerable a algunos ataques, porque ambos servidores pueden tener ligeras diferencias al analizar los mensajes HTTP. Uno de estos matices es HTTP Parameter Pollution, que ocurre cuando el mismo parámetro se repite varias veces en la misma petición. Algunos servidores web tomarán la primer ocurrencia, otros tomarán la última y otros considerarán todas las ocurrencias. Para más información, se puede leer HTTP Parameter Pollution o ver HTTP Parameter Pollution Explained.
Entonces, si agregamos otro parámetro amount
, el servidor Flask solo considerará la primera ocurrencia, mientras que Node.js considerará ambas:
Como resultado, la transacción de retirar de dinero es exitosa.
Flag
Ahora, si volvemos a nuestro dashboard, veremos la flag: