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!