VULNERABILIDADES DE APLICACIONES WEB: COMBINACIÓN DESCUIDADA DE PRIVILEGIOS
04.02.2018 19:46
En inglés esta vulnerabilidad suele recibir el nombre de "Privilege chaining" (Encadenamiento de privilegios) aunque sería más correcto llamarla "Combinación descuidada de privilegios". El problema se presenta cuando los roles y/o privilegios se combinan de modo que permitan a alguien realizar acciones inseguras.
Clarificamos con un ejemplo. El archivo "frente.html" es como sigue:
<html>
<h1>Combinación descuidada de privilegios</h1>
<form action="atras.php" method="post">
Usuario: <input type="text" name="usuario" value="">
Contrasena: <input type="password" name="clave" value="">
<input type="submit">
</form>
</html>
siendo "atras.php":
<?php
$usuario = $_POST['usuario'];
$clave = $_POST['clave'];
if (($username == 'Guillermo') && ($clave == '%#compu1234HT')){
$rol = "administrador";
}elseif (($usuario == 'Catalina') && ($clave == 'trabajoZxcY$8')){
$rol = "colaborador";
}elseif (($usuario == 'Javier') && ($clave == 'carroViejo44&&')){
$rol = "usuario";
}else{
$rol = "invitado";
}
if (($rol =="usuario") || ($rol =="invitado")){
header('Location: frente.php');
exit;
}
?>
<html>
<h1>Cambio de contraseñas</h1>
<form action="cambio.php" method="post">
Usuario: <input type="text" name="nombre" value="">
Contrasena: <input type="password" name="acceso" value="">
Confirmar ctsna.: <input type="password" name="verificar" value="">
<input type="submit">
</form>
</html>
y finalmente cambio.php es:
<?php
$nombre = $_POST['nombre'];
$acceso = $_POST['acceso'];
$verificar = $_POST['verificar'];
if ($acceso == $verificar) {
echo "La contraseña de $nombre ha sido cambiada a $acceso exitosamente";
}
?>
Como vemos, Catalina, que es colaboradora del sitio, de ser necesario puede cambiar contraseñas y eso está bien. El problema es que como no se verifica su rol al momento de cambiarlas hay un "encadenamiento de privilegios" y si Catalina conociera la vulnerabilidad, de querer hacerlo podría cambiar la clave de acceso del administrador. Sólo debería conocer el nombre de usuario del mismo que demasiado a menudo es Admin, admin, Administrador, administrador...
¡Cuidado, el código fue simplificado para facilitar su comprensión. No use combinaciones usuario/contraseña incrustadas en el programa, mucho menos en texto plano!