Descripción: | XSS en el input "Sitio WEB" dentro del perfil de usuario |
Descubierto por: | WHK@elhacker.net |
Código vulnerable: | Sources/Profile-Modify.php:802 |
URL Vulnerable: | N/A |
PoC: | javascript:alert(document.cookie);//http://xx |
Afecta a: | SMF 1.1.10 y 2.0 RC2 |
Descripción
La vulnerabilidad se localiza en el archivo Sources/Profile-Modify.php
Linea 802
http://code.google.com/p/smf2-review/source/browse/trunk/Sources/Profile-Modify.php#802
Código
$value = \'http://\' . $value;
Ya que permite la inyección de código arbitrario debido a que verifica
únicamente que contenga los carácteres "://" pero no indicaron en que
posición del string debería estar por lo cual puedes escribir "://" al
final del código inyectado encapsulandolo en un comentario tal como el
siguiente ejemplo.
PoC:
En el perfil de tu usuario pon lo siguiente en el input de "Website URL"
javascript:alert(document.cookie);//http://xx
Solución
Código original de SMF 1.1.10 en Sources/Profile.php linea 602
Código
// Fix the URL... { $_POST['websiteUrl'] = 'http://' . $_POST['websiteUrl']; $_POST['websiteUrl'] = ''; }
reemplazar por
Código
if($_POST['websiteUrl']){ $protocolo = $protocolo[0]; foreach($permitidos as $permitido){ $valido = true; break; } } /* La url comienza con un protocolo no válido */ if(!$valido) $_POST['websiteUrl'] = 'http://'.$_POST['websiteUrl']; /* Elimina urls no válidas */ }
Código original de SMF 2.0 RC2 en Sources/Profile-Modify.php linea 753
Código
// Fix the URL... if (strlen(trim($value)) > 0 && strpos($value, \'://\') === false) $value = \'http://\' . $value; if (strlen($value) < 8) $value = \'\'; return true; '),
Reemplazar por
Código
// Parche - Fix the URL... if($_POST["websiteUrl"]){ $permitidos = array("http", "https", "ftp", "ftps"); $protocolo = @explode("://", $_POST["websiteUrl"]); $protocolo = $protocolo[0]; foreach($permitidos as $permitido){ if(strtolower($protocolo) == strtolower($permitido)){ $valido = true; break; } } /* La url comienza con un protocolo no válido */ if(!$valido) $_POST["websiteUrl"] = "http://".$_POST["websiteUrl"]; unset($permitidos, $permitido, $protocolo, $valido); /* Libera memoria */ /* Elimina urls no válidas */ if(strlen($_POST["websiteUrl"]) < 8) unset($_POST["websiteUrl"]); } '),