Contenido


Evite los ataques de secuencias de comandos entre sitios codificando las respuestas HTML

Comments

Nota: Consulte el tutorial, "Proteja sus aplicaciones contra los ataques de secuencias de comandos entre sitios (XSS)" para utilizar el recinto de seguridad del desarrollador. El fragmento de código de ese tutorial muestra cómo utilizar secuencias de escape para que el código que se inyecte no puede ejecutarse.

Ataques de secuencias de comandos entre sitios

En los ataques de secuencias de comandos entre sitios (XSS), el atacante inyecta código maligno en una página web legítima que, después, ejecuta scripts maliciosos por el lado del cliente. Cuando un usuario visita la página web está infectada, el script se descarga y se ejecuta desde el navegador del usuario. Hay muchas variaciones de este esquema. El script malicioso podría acceder a cookies del navegador, a tokens de sesión o a otra información confidencial que en navegador conserve. Sin embargo, todos los ataques XSS siguen el patrón de la Imagen 1.

Figura 1. Ataque XSS típico
Cuatro cajas que comienzan con un hacker que termina en un servidor web, mostrando el camino de un ataque
Cuatro cajas que comienzan con un hacker que termina en un servidor web, mostrando el camino de un ataque

Vulnerabilidades del XSS

En un ataque XSS típico, el atacante descubre una forma de insertar una cadena de caracteres en la página web de un servidor. Suponga que el atacante inyecta la siguiente cadena de caracteres en la página web: <script>alert("attacked")</script> . Siempre que un usuario final visite esta página, el navegador descargará este script y lo ejecutará como parte del procesamiento de la página. En este caso, el script se ejecutará y el usuario verá una alerta emergente que dice "atacado".

Impacto del XSS

Cuando los atacantes explotan con éxito las vulnerabilidades del XSS en una aplicación web, pueden insertar un script que les proporcione acceso a las credenciales de las cuentas de los usuarios finales. Los atacantes pueden realizar diferentes actividades maliciosas, como:

  • Secuestran una cuenta
  • Propagar gusanos web
  • Acceder al historial del navegador y al contenido del portapapeles
  • Controlar el navegador de forma remota
  • Escanear y explotar los dispositivos y aplicaciones de la intranet

Cómo evitar los ataques XSS

Para que una aplicación ayude a evitar los ataques XSS, tiene que asegurarse de que todo el resultado variable que sale de una página sea codificado antes de ser devuelto al usuario final. El resultado variable codificado sustituye el código HTML con representaciones alternativas llamadas entidades. El navegador muestra las entidades pero no las ejecuta. Por ejemplo, <script> se convierte a &lt;script&gt;.

La Tabla 1 muestra el nombre de las entidades de algunos caracteres HTML comunes.

Tabla 1. Nombres de entidades para los caracteres HTML
ResultadoDescripciónNombre de la entidadNúmero de entidad
 Espacio duro &nbsp;&#160;
<Menor que &lt;&#60;
>Mayor que &gt;&#62;
&Ampersand&amp;&#38;
¢Céntimo&cent;&#162;
£Libra&pound;&#163;
¥Yen&yen;&#165;
Euro&euro;&#8364;
§Sección&sect;&#167;
©Copyright&copy;&#169;
®Marca comercial registrada&reg;&#174
Marca registrada&trade;&#8482;

Cuando un navegador web encuentra las entidades, las vuelve a convertir en HTML y las imprime, pero no las ejecuta. Por ejemplo, si un atacante inyecta <script>alert("está siendo atacado")</script> en un campo variable de una página web del servidor, según esta estrategia el servidor devolverá &lt;script&gt;alert("está siendo atacado")&lt;/script&gt;.

Cuando el navegador web descargue el script, volverá a convertir el script codificado a <script>alert("está siendo atacado")</script> y mostrará el script como parte de la página web, pero no lo ejecutará.

Cómo añadir código HTML a una aplicación Java por el lado del servidor

Para garantizar que el código de secuencias de comandos maliciosos no se envíe como parte de la página, la aplicación tiene que codificar todas las cadenas de caracteres variables antes de mostrarlas en una página. La codificación tan sólo es convertir todos los caracteres en el nombre de su entidad HTML, tal como muestra el ejemplo de código Java Java del Listado 1.

Listado 1. Convierte los caracteres en el nombre de la entidad HTML.
public class EscapeUtils {

public static final HashMap m = new HashMap();
static {
m.put(34, "&quot;"); // < - less-than
m.put(60, "&lt;");   // < - less-than
m.put(62, "&gt;");   // > - greater-than
//El usuario tiene que correlacionar todas las entidades html con sus valores decimales correspondientes.
//Por favor, consulte la tabla siguiente para correlacionar las entidades y los valores enteros de un carácter
      }

public static String escapeHtml() {
String str = "<script>alert(\"abc\")</script>";
try {
    StringWriter writer = new StringWriter((int) 
                   (str.length() * 1.5));
    escape(writer, str);
    System.out.println("encoded string is " + writer.toString() );
    return writer.toString();
   } catch (IOException ioe) {
    ioe.printStackTrace();
    return null;
                                            }
                                             }

public static void escape(Writer writer, String str) throws IOException {
int len = str.length();
for (int i = 0; i < len; i++) {
    char c = str.charAt(i);
    int ascii = (int) c;
    String entityName = (String) m.get(ascii);
    if (entityName == null) {
        if (c > 0x7F) {
            writer.write("&#");
            writer.write(Integer.toString(c, 10));
            writer.write(';');
        } else {
            writer.write(c);
        }
    } else {
             writer.write(entityName);
    }
}
}
}

En el ejemplo de Java del Listado 1, el insumo para la codificación HTML es String "<script>alert(\"abc\")</script>". Utilice los siguientes pasos.

  1. Cree un mapa de hashes de todas las entidades HTML y de sus valores decimales. El ejemplo sólo muestra tres entidades. Es necesario que mapear todas las entidades HTML con sus valores decimales en este mapa. La tabla 2 muestra algunas de las entidades que se utilizan más habitualmente y sus valores decimales. Para obtener una referencia completa de todas las entidades de caracteres, vea la Referencia de Entidades HTML en Recursos.
  2. Cree StringWriter de búfer 1,5 veces el tamaño de la longitud de la cadena de caracteres de entrada.
  3. Pase este escritor y la cadena de caracteres de entrada al método escape , que recoge uno por uno todos los caracteres de la cadena de caracteres y obtiene el valor entero del carácter.
  4. Pase el valor entero al mapa que creó en el paso 1, busque el nombre de la entidad y escriba este valor en el escritor.

    Todos los caracteres de la cadena de caracteres se convertirán a este nombre de entidad.

El resultado es &lt;script&gt;alert(&quot;abc&quot;)&lt;/script&gt;.

La Tabla 2 esquematiza las entidades HTML con sus valores decimales.

Tabla 2. Valores decimales de las entidades HTML
DecimalExtracción deDescripción
160&nbsp;susacio duro
60&lt;Menor que
62&gt;Mayor que
38&amp;Ampersand
162&cent;elntimo
163&pound;Libra
165&yen;Yen
8364&euro;Euro
167&sect;Sección
169&copy;Copyright
174&reg;Marca comercial registrada
8482&trade;Marca registrada

Conclusión

El ataque de secuencias de comandos entre sitios es una de las formas más habituales de atacar la máquina de un usuario. Sin embargo, es posible eliminar enormemente la capacidad del atacante de infectar su aplicación web con código malicioso. Cuando escriba su aplicación, tenga la diligencia de codificar todo el resultado de las variables en una página antes de enviarlo al navegador del usuario final.


Recursos para Descargar


Comentarios

Inicie Sesión o Regístrese para agregar comentarios.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Cloud computing, tecnologia Java
ArticleID=1062682
ArticleTitle=Evite los ataques de secuencias de comandos entre sitios codificando las respuestas HTML
publish-date=07302013