Curso Javascript basico

Como vimos en la última publicación Javascript tiene un papel fundamental en en mundo del hacking. En Javascript y hacking hablábamos sobre la problemática de inyectar código en un sitio web para que el internáuta que navegase por la web realizara acciones que normalmente no haría si de el dependiera. En la lección de hoy vamos a adentrarnos en el mundo de javascript para ver cómo se programa y poder utilizarlo tanto a la hora de hacer un análisis de pentesting en una web 2.0 como a la hora de crear scripts para mejorar tu propio sitio web.

Utilidad práctica del curso Javascript

Los motivos por los que debes tener unas nociones básicas de javascript y continuar leyendo este curso javascript básico es que además de que te permitirá estar en posición de analizar, crear y defender tu sitio de ataques de inyección de código con Javascript podrás realizar:

  • Generar contenido en un documento, cambiar atributos de etiquetas y parámetros, lograr interacción básica con el usuario y con el código fuente de la página, etc…
  • Controlar los exploradores sacándole botones, agregando textos, adornando la pantalla, etc…
  • Interactuar con formularios, tomando datos, validando el contenido de las variables, actuando sobre eventos entre el usuario y los mismos, etc…
  • Interactuar con el usuario, mostrando mensajes de confirmación, cuadros de dialogo generales, peticiones para insertar o definir variables, etc…
  • Trabajar con toda la página HTML en donde está embebido, pudiendo tener casi control total sobre esta y sus propiedades así como de todas la ventanas que se abran a partir de ella o de las que la han abierto.
  • Crear efectos, tales como transición de imágenes, bloques de texto, etc…

Lo que «NO» podrás hacer con Javascript

  • No podemos leer ni escribir archivos en el disco, exceptuando las cookies, para quienes no saben las cookies son pequeños archivos de texto que se guardan en la carpeta de archivos temporales con la finalidad de recordar preferencias de usuario o datos de «sesión» entre este y el sitio. 
  • No podemos usar ningún recurso del Sistema Operativo (impresoras, escáneres, pendrives…)
  • No podemos generar gráficos.
  • No podemos hacer networking, lo mas parecido será cargar otra página HTML dada o llamar otro script de forma remota.

Y hemos dicho un «no» entrecomillado porque en la informática el «no» absoluto no existe, lo que ocurre es que estas acciones no se pueden realizar de forma directa, pero si de forma indirecta. ¿Un ejemplo? Cada vez que se descubre un fallo de seguridad en el que mediante código javascript se puede tomar el control total del navegador. Para los que recien estáis empezando en el mundo de la seguridad informática esto os resultará algo chocante, para que lo podais entender, pensad que el navegador que utilizáis (ya sea chrome, firefox, safari, opera, Internet explorer…) es un programa que lee el código fuente de un sitio web, lo interpreta y muestra un resultado en pantalla. Y justo ahí es donde se puede producir la falla de seguridad, a la hora de interpretar el código que está leyendo. Es posible crear códigos que el navegador no sepa interpretar y actúe de forma fraudulenta. Cuando esto ocurre el navegador se dice que ha sido explotado, y el atacante ha tomado el control del navegador, es a su vez implica que ha tomado el control de prácticamente todo el PC si trabajáis desde windows. Para que podáis ver en profundidad un caso real de esto que acabamos de ver os dejo el siguiente caso práctico: Exploit internet explorer a fondo.

Core Javascript

Primero veamos cual es la estructura léxica del lenguaje, con esto me refiero a obtener resultados correctos con la sintaxis que utilicemos. Javascript es key sensitive, esto quiere decir que diferencia las palabras mayúsculas de las palabras minúsculas;
Un ejemplo:
variable es igual a variable.
VARIABLE es distinto que variable.

Lo mismo ocurre para las funciones. Si creamos una función llamada ObtenerNombre y queremos usarla tendremos que hacerlo empleado el nombre de la función respetando las mayúsculas y las minúsculas. Si intentamos llamar a la función así «obtenernombre» no funcionará ya que la fución «obtenernombre» no está definida, la que sí está definida es la función «ObtenerNombre».

En JavaScript hay una serie de caracteres especiales que no podremos representar con sus propias letras o números, al igual que en HTML y que en todos los lenguajes interpretados aquí existen los caracteres de escape, necesarios para escribir aquellos caractéres especiales tales como comillas, tabulaciones, saltos de línea, etc.. Para evadir este problema existen los caracteres de escape y para representarlos como texto se escriben con una notación especial que comienza por una retrobarra (una barra inclinada al revés de la normal “\”) y luego el código del carácter a mostrar, veamos los más comunes…

  • \n Salto de línea.
  • \r Retorno de carro.
  • \’ Comilla simple.
  • \f Avance de página.
  • \» Comilla doble.
  • \b Retroceder espacio.
  • \t Tabulador.
  • \\ Contrabarra.

Para que se entienda aún mejor vamos a poner un pequeño ejemplo de código Javascript en el que vamos a probar el carácter especial de salto de línea /n. Para el ejemplo vamos a a utilizar la función alert. Esta función lo único que hace es generar un mensaje al usuario. Cuando se está trabajando haciendo análisis de pentesting es muy común utilizarla para ver si el código javascript que estamos intentando inyectar se ejecuta correctamente o no. El ejemplo es el siguiente:

<script>
alert(‘Mi primer codigo javascript…\n 1 \n 2 \n 3…’)
</script>

Lo único que tenéis que hacer para probarlo es abrir un bloc de notas, escribir dentro el código y guardarlo como prueba.html 
Crear archivo curso javascript

Cuando lo tengaís solamente debeís hacer doble click en el archivo prueba.html y vuestro navegador de internet predeterminado lo cargará y lo ejecutará; obtniendo como resultado esta respuesta:
función alert curso javascript

En Javascript las distintas instrucciones de cada programa se separan convenientemente para que el navegador no indique errores de sintaxis. Las dos técnicas que podemos utilizar para esto son:

  • El carácter punto y coma al final de cada instrucción.
  • Un salto de línea al final de cada instrucción.

Por esta razón si solo colocamos una instrucción en cada línea las sentencias Javascript no necesitan acabar en punto y coma, pero si colocamos dos o mas instrucciones en la misma línea si será necesario separarlas con punto y coma al final de cada instrucción. Si la instrucción o sentencia ocupa varias líneas en pantalla será necesario indicar dónde acaba haciendo uso del punto y coma. Pasemos a ver un par de ejemplos para que se vea más claro:

Ejemplo1…
<script>
alert (‘Una única instrucción en 1 sola línea, no es necesario “;” ‘)
alert (‘Segunda instruccion’)
</script>

Ejemplo 2…
<script>
alert (‘Esta instrucción ocupa mas de una línea, y por tanto sera’ +
‘necesario que finalicemos la instrucción con ;’);
</script>

Te recordamos que puedes y deberías copiar cada uno de los ejemplos en tu archivo de prueba e ir probándolos. La forma correcta de adquirir habilidad en cualquier lenguaje de programación es práctica, práctica, práctica y luego más práctica. Asi que aprovecha todos estos ejemplos, por sencillos que sean y haz distintas pruebas, te servirán para ir quedándote con la sintáxis a la vez que profundizas en el lenguaje.

Comentarios de código javascript y protección

Ahora que ya sabemos como escribir varias instrucciones en un script javascript llega el momento de agregar comentarios. Los comentarios son de gran ayuda en todos los lenguajes de programación ya que ayudan al programador a entender el código de una forma más eficiente. Pero desde el punto de vista de la seguridad infomática pueden ser un arma de doble filo cuando hablamos de scripts interpretados y no ejecutados como es el caso de javascript. Veamos como podemos realizar comentarios en el código fuente javascript.

Existen 2 mecanismos para llevar a cabo un comentario. Utilizando dos barras inclinadas “//” podremos insertar comentarios en una línea del programa. Desde que el intérprete de Javascript las encuentre y hasta que llegue al final de la línea (línea de la pantalla), todo el texto será considerado comentario, por ejemplo:

<script>
var saludo = ‘Hola!!’; //Declaro la variable saludo con el valor Hola!.
alert (saludo); //Esta vez no necesite comillas en el alert.
</script>

Para comentar fragmentos de código completos se puede utilizar los símbolos barra inclinada y asterisco “/*” para iniciarlo y viceversa “*/” para cerrarlo. Estos símbolos definen zonas de comentarios que pueden extenderse a través de varias líneas. Todo lo que esté dentro de esos símbolos será considerado un comentario, incluso si se trata
de código real, aquí va un ejemplo:

<script>
var saludo = ‘Hola!!’; /*Y ahora…*/ alert (saludo);
</script>

¿Por qué estos comentarios pueden suponer un problema de seguridad? La respuesta es muy sencilla, en javascript los comentarios que tu pones en el código son visibles por todo el mundo, basta con que alguien pulse con el botón derecho sobre tu web y seleccione la opción «mostrar código fuente» y ahí verá absolutamente todo el código javascript que has programado o incluido. Con tus comentarios puedes facilitar mucho la vida a un usuario que pretenda hacer una intrusión, ya que le estás dando la «guía» de tu código fuente. Esto no quiere decir que si no tienes comentarios el supuesto hacker no vaya a ser capaz de analizar tu código y comprenderlo, por supuesto que no, lo único que estamos poniendo de manifiesto es que se lo vas a poner más fácil y en el peor de los casos (para ti como webmaster) le vas a dar pistas sobre qué pruebas realizar para practicar la intrusión.

De aquí la conclusión que debes sacar es que incluir comentarios en el código fuente javascript es algo beneficioso pero si se hace con cierta precaución. Hay también una técnica que está bastante extendida que consiste en tener 2 versiones de cada script javascript. En una de ellas el código está limpio, tabulado y comentado. Es el que se utiliza para implementar nuevas funcionalidades o corregir erroes, y de ese archivo se saca otro que contiene el mismo código fuente, pero sin comentarios, sin tabulaciones, sin saltos de línea e incluso totalmente ofuscado. La ofuscación de código consiste en aplicar una serie de técnicas para dificultar la lectura e interpretación del código a aquellas personas que no dispongan de la fuente original. Esto se logra cambiando de nombre las variables, quitando todo el formato al código, introduciendo código que no hace realmente nada…. Para hacer esto de forma automática nos econtramos ofuscadores de código como jasob o  myobfuscate. Para que puedas ver la dificultad para el analista de leer un código ofuscado vamos a ofuscar uno de nuestros primeros ejemplos con la herramienta myobfuscate:

Codigo Original
<script>
alert(‘Probando…\n 1 \n 2 \n 3…’)
</script>

Código Ofuscado

Sabed que esto se hecho para ofuscar una instrucción simple, imaginad que aplicamos esta técnica a un código complejo…. resulta mas que evidente que el persona que tenga que lidiar con este código ofuscado lo tiene realmente difícil. Si que es cierto que existen por ahí herramientas para desofuscar el código, pero aquí la cuestión es establecer un nivel de protección para dificultar al máximo la tarea a un hacker que pretenda hacer una intrusión en nuestra web.

Continuamos en la siguiente entrega. Cualquier duda o sugerencia como siempre puedes exponerla utilizando los comentarios.

Continua leyendo

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Newsletter Signup

Suscríbete a nuestra lista si te interesa recibir turcos exclusivos sobre hacking y seguridad informática