N-D [REDOS AL DETALLE]

Documentos relacionados
TUTORIAL SOBRE EXPRESIONES REGULARES EN JAVASCRIPT PARA VALIDACIÓN DE CAMPOS EN FORMULARIOS HTML:

TIPOS DE VARIABLES EN PHP. DECLARACIÓN Y ASIGNACIÓN. LA INSTRUCCIÓN ECHO PARA INSERTAR TEXTO O CÓDIGO. (CU00816B)

Curso PHP Módulo 1 R-Luis

Detectar y solucionar infecciones en un sitio web

Cómo instalar fácilmente tu WordPress tras contratar un hosting en Hostalia

Manual CMS Mobincube

GUIA APLICACIÓN DE SOLICITUDES POR INTERNET. Gestión de Cursos, Certificados de Aptitud Profesional y Tarjetas de Cualificación de Conductores ÍNDICE

Base de datos en Excel

ICARO MANUAL DE LA EMPRESA

Introducción a PHP. * No es necesario declarar previamente las variables.

Formas de llevar a cabo un backup de una base de datos MySQL

La plantilla propone aprovechar esta estructura en común y sólo modificar el contenido del área del documento que sea diferente.

La ventana de Microsoft Excel

Funciones, x, y, gráficos

TPVFÁCIL. Caja Real. Definiciones.

MANUAL COPIAS DE SEGURIDAD

Iptables, herramienta para controlar el tráfico de un servidor

Mantenimiento Limpieza

COMO CONFIGURAR UNA MAQUINA VIRTUAL EN VIRTUALBOX PARA ELASTIX

Instalar y configurar W3 Total Cache

GUÍA RED SOCIAL FACEBOOK

Instalación y Registro Versiones Educativas 2013

TEMA 9 CREACIÓN DE PÁGINAS WEB

GUÍA RÁPIDA DE TRABAJOS CON ARCHIVOS.

Este programa mueve cada motor de forma independiente, y cuando termina una línea pasa a la siguiente.

Instalación del Admin CFDI

Sistema de Inscripciones en Línea de la Olimpiada Mexicana de Matemáticas, Delegación Yucatán MANUAL DE USUARIO

MINI MANUAL PARA CREAR FORMULARIOS CON PHP Marzo 2007

MANUAL DE USUARIO DE LA APLICACIÓN DE ACREDITACION DE ACTIVIDADES DE FORMACION CONTINUADA. Perfil Entidad Proveedora

Haga clic en los recuadros donde indica la mano y regrese al inicio del capítulo al hacer clic en el título de la sección donde se encuentra

TEMA 2 WINDOWS XP Lección 4 BLOC DE NOTAS

Capítulo 1 Documentos HTML5

PANEL DE CONTROL (Zona de Administración) MANUAL DE USO Por conexanet. Revisión 1.1 Fecha

Actualmente existen dos maneras de enviar y publicar las estadísticas en la página web de la Federación Española de Baloncesto:

Optimizar base de datos WordPress

Guia de realización de un GIG personal en nuestra página web (

BANNERS CÍCLICOS CON JAVASCRIPT

UAM MANUAL DE EMPRESA. Universidad Autónoma de Madrid

COMO CREAR UNA PÁGINA WEB 2-INTRODUCCIÓN A DREAWEAVER

Instrucción IrA (GoTo). Saltos no naturales en el flujo normal de un programa. Pseudocódigo y diagramas de flujo. (CU00182A)

MANUAL DE PRACTICUM12 PARA CENTROS EDUCATIVOS ÁMBITO MÁSTER

Guía Rápida de Inicio

Proceso de cifrado. La fortaleza de los algoritmos es que son públicos, es decir, se conocen todas las transformaciones que se aplican al documento

SEGUNDA SESIÓN escaparate gadgets.

MANUAL DE USUARIO APLICACIÓN SYSACTIVOS

SISTEMA DE APARTADO DE SALAS PARA EVENTOS

GUÍA DE USUARIO: GOOGLE DRIVE

1 DISEÑO WEB de ANCHO FIJO con 2 COLUMNAS FLOTANTES

Guía de uso del sistema CV-Online

SOLUCIÓN CASO GESTIÓN DE PERSONAL I

TUTORIAL PRÁCTICO DE BASES DE DATOS EN ACCESS CREAR UNA AGENDA

(Altas de prestaciones por ERE S): guía para las empresas

Person IP CRM Manual MOBILE

Apuntes Recuperación ante Fallas - Logging

Introducción al Proceso de Pruebas.

La única regla que debe de tener presente siempre, es que cada etiqueta que abra <etiqueta> debe de cerrarla en el mismo orden < /etiqueta cerrada>.

Google Analytics. Definición y creación de objetivos

15 CORREO WEB CORREO WEB

Internet Information Server

MANUAL DE AYUDA TAREA PROGRAMADA COPIAS DE SEGURIDAD

Creación paso a paso de Formularios con Google (Parte I) (AKA: no corrijo nunca más!)

Conciliación bancaria en CheqPAQ Cargado de estado de cuenta

GENERACIÓN DE TRANSFERENCIAS

AGREGAR COMPONENTES ADICIONALES DE WINDOWS

Manual hosting acens

SMS Gestión. manual de uso

Proyecto de Facturación con Filemaker Pro 12

AHORRACOM SOLUCIONES AVANZADAS S.L. Avda. de la Industria 13, Oficina Alcobendas, Madrid.

Software Criptográfico FNMT-RCM

TUTORIAL PARA REDIMENSIONAR FOTOS

Aceptación / Renuncia Plaza Erasmus

El e-commerce de Grupo JAB es una herramienta que permite a los clientes del Grupo, realizar un amplio conjunto de servicios de consulta, petición y

XAJAX: una librería de AJAX para PHP (parte 1)

CITRIX Citrix Application Streaming

Uso del Programa Gantt Project

MICROSOFT EXCEL Introducción: Qué es y para qué sirve Excel2007? TECNOLOGIA/ INFORMATICA: MS-EXCEL

CONFIGURACION AVANZADA DE MOZILLA THUNDERBIRD

CIERRE DE PERÍODOS DE LIQUIDACIÓN

Sistema de Captura de Expedientes de Trabajadores

GUÍA TÉCNICA PARA LA DEFINICIÓN DE COMPROMISOS DE CALIDAD Y SUS INDICADORES

Sistemas de seguridad en redes inalámbricas: WEP, WAP y WAP2

Cómo resolver errores comunes a la hora de programar con PHP

Bibliotecas Escolares. Perfil de Lector.

GENERACIÓN DE ANTICIPOS DE CRÉDITO

Vamos a crear nuestro primer juego en el que tendremos que coger la comida que esta protegida por los gatos

1.- INTRODUCCIÓN 2.- PARÁMETROS

TABLA DE DECISION. Consideremos la siguiente tabla, expresada en forma genérica, como ejemplo y establezcamos la manera en que debe leerse.

Guía Práctica para el Uso del Servicio de Software Zoho CRM

LABORATORIO Nº 2 GUÍA PARA REALIZAR FORMULAS EN EXCEL

MATERIAL 2 EXCEL 2007

(altas de trabajadores afectados por EREs): guía para las empresas

CÓMO CREAR NUESTRO CATÁLOGO

Al ejecutar esta aplicación tenemos lo siguiente: Pulsamos en Wizard mode y nos aparece lo siguiente:

Guía de uso del Cloud Datacenter de acens

Gracias a ese IP único que tiene cada ordenador conectado a la red de internet se pueden identificar y comunicar los ordenadores.

En términos generales, un foro es un espacio de debate donde pueden expresarse ideas o comentarios sobre uno o varios temas.

HERRAMIENTAS DE ACCESS ACCESS Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

Qué son y cómo combatirlas

Transcripción:

N-D Por David Kotriksnov (a.k.a. SH4V) N3t-Datagrams.net

En los últimos años se ha hablado mucho de ataques de Denegación de Servicio y más de alguno de vosotros conoceréis las famosas botnets (redes de maquinas zombies programadas para realizar peticiones masivas a servidores hasta causar una sobresaturación de los mismos). Existen sin embargo otro tipo diferente de ataques de Denegación de Servicio o DoS (Denial of Service). Un ataque contra una base de datos que eliminara el contenido de sus tablas sería otro tipo de denegación de servicio ya que no permitiría al usuario poder acceder a la información antes almacenada en el servidor: DROP database Existen muchos tipos de Denegaciones de Servicio pero la variante que vamos a tratar en este paper son las Denegaciones de Servicio en la validación de Expresiones Regulares, o lo que se conoce por redos. En 2009 fue presentado en la Open Web Application Security Project (OWASP) Israel Conference. En esa presentación se explicaba como una expresión regular pobremente escrita podía ser explotada para realizar un DoS. TIPOS DE MOTORES REGEXP: 2 Podemos encontrar dos tipos de motores RegExp: DFA (Deterministic Finite Automaton) y NFA (Nondeterministic Finite Automaton). Los motores NFA son sistemas de marcha atrás mientras que los DFA no. Los DFA evalúan cada carácter de cada cadena como mucho una vez mientras que los NFA pueden evaluar cada carácter todas las veces que sean necesarias hasta determinar que la cadena ha finalizado o la coincidencia ha sido encontrada. El sistema de marcha atrás del motor NFA tiene el pro de que pueden procesar expresiones regulares más complejas pero tienen el inconveniente de superar en tiempo de procesamiento a las DFA (depende de la expresión regular). EL PROBLEMA: Los sistemas NFA (marcha atrás) pueden confirmar con rapidez una coincidencia, sin embargo identificar una no-coincidencia en la cadena puede tomar mucho más tiempo ya que el motor tiene que confirmar que ninguna de los posibles caracteres a través de la string coincide con la expresión regular. Es decir, que todos los caracteres tienen que volver a ser testeados. Por tanto,

cada vez que añadamos un carácter a la cadena, el tiempo de respuesta se duplicará de forma exponencial Vamos a ver un ejemplo sencillo. Utilizaremos las expresiones regulares en Javascript porque no necesitamos más que un navegador para poder procesarlas. Esto hace que sea más portable y cualquiera en su casa sin necesidad de un servidor pueda probarlo: <script language='javascript'> var str="abcdefg"; var reg=/^(\w+)+$/; if (reg.test(str)){ alert('match found!'); else{ alert('match not found...') 3 </script> El código se ejecuta sin problemas y nos mostrará un alert con el mensaje "Match found!". Pero qué ocurriría si añadimos al final de la variable "str" un carácter no alfanumérico? Probad a sustituir la línea dos por esto: <script language='javascript'> var str="abcdefg^"; var reg=/^(\w+)+$/; if (reg.test(str)){ alert('match found!'); else{ alert('match not found...') </script>

El navegador se trabará. Algunos navegadores están preparados para este tipo de situaciones así que no os extrañéis si os sale un mensaje de alerta preguntando si quieres detener el script. Pero la pregunta es: Por qué? es entonces cuando llega el turno de bucear por el conocimiento para descubrir la respuesta al enigma que de forma superficial parece cosa de brujería, pero que en el fondo no es más que pura matemática. RESOLUCIÓN DEL PROBLEMA: Por partes, analicemos la expresión regular: \w: Cualquier carácter alfanumérico. +: 1 o más repeticiones de caracteres alfanuméricos. (): Toma los caracteres dentro del paréntesis como un grupo. El problema surge cuando incluimos caracteres que pueden repetirse dentro de un grupo que a su vez puede repetirse. Esto crea un bucle que crece de forma exponencial a medida que añadimos caracteres. Como se dijo anteriormente, los sistemas NFA son motores de marcha atrás. Esto es, que empiezan determinando la longitud de la cadena y comienzan a analizarla desde el final hasta el inicio. Tomemos el siguiente ejemplo: 4 <script> var str="abcdefg"; var reg=/^w+$/; reg.test(str); </script> El script comenzaría por calcular la longitud, empezando por a, b, c... hasta llegar a g. Una vez llegado a g, el sistema de marcha atrás del motor NFA vuelve hacia atrás, en el siguiente orden: abcdefg, abcdef, abcde, abcd, abc, ab, a. El número de rutas es de 7. Esta expresión regular no sería vulnerable a redos. Sin embargo la cosa cambia cuando la expresión regular es esta: <script> var str="abcdefg"; var reg=/^(w+)+$/; reg.test(str);

</script> Como veis, estamos metiendo entre paréntesis un grupo de caracteres alfanuméricos que puede repetirse como unidad y como grupo. Ahí es donde está el peligro. Veamos como interpretaría esto el motor NFA: A. Llega hasta el final de la cadena de la siguiente manera: a, ab, abc, abcd, abcde, abcdef, abcdefg. B. Comienza la marcha atrás. Analizaremos a partir de aquí diferenciando entre adyacentes y grupos. Como hacerlo en un procesador de textos es muy complicado, haré en papel los 4 primeros pasos. A partir de ahí pensad y si es necesario sacad bolígrafo y papel para entenderlo. Si compagináis la tabla de abajo con la imagen tendréis más facilidad a la hora de comprender. Adyacentes Grupos Resultado de Rutas/Ciclos abcdef + (g) - g es tomado como grupo. 1 ruta/ciclo. abcde + (fg) - fg es tomado como grupo (+1) que su vez se divide en un adyacente (f) y un grupo (g) (+1). 1+1=2 rutas/ciclos. abcd + (efg) - efg es tomado como grupo (+1), lo que significa que será analizado como grupo efg. efg a su vez será dividido en un adyacente (ef) y un grupo (g) (+1). Siguiendo la línea de la marcha atrás, se dará un paso a la izquierda quedando el adyacente (e) y el grupo (fg)(+1). Finalmente el grupo (fg) se analiza quedando un adyacente (f) y un grupo (g) (+1). 1+1+1+1=4 rutas/ciclos. abc + (defg) [...] 8 rutas/ciclos. ab + (cdefg) [...] 16 rutas/ciclos. a + (bcdefg) [...] 32 rutas/ciclos. - + (abcdefg) [...] 64 rutas/ciclos. TOTAL: 127 RUTAS + 1 ruta de identificación inicial= 128 RUTAS/CICLOS. 5

6 Cada vez que añadamos un carácter más, el número de rutas o repeticiones será el doble, es decir, crecerá en sentido exponencial al cuadrado, por lo que el número de rutas será igual a: N= 2 n Donde N es el número de rutas y n es el número de caracteres antes del fallo.

EXPLOTACIÓN: Vamos a ver varios ejemplos de RegExp vulnerables a una Denegación de Servicio (algunas de ellas sacadas de OWASP) y como explotarlas: /^(\w+)+$/= abcdefgasdfasdlkja_slf123leic_vaskjefhasjefh^ //Ingresamos caracteres alfanuméricos y/o "_" y finalizamos la cadena con una excepción. 2⁴⁴ rutas. /^(a+)*$/= aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa^ //Ingresamos "a" y finalizamos con una excepción. 2³⁹ rutas. /^([a-z0-9]+)*$/= aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa^ // 2³⁹ rutas. /^(1 r)+=$/= 1111111111111111111111111111111111111111^ //2⁴⁰ rutas. /^(([a-z])+.)+[a-z]([a-z])+$/= aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa^ //2³⁹ rutas. 7 /^([a-za-z0-9])(([\-.] [_]+)?([a-za-z0-9]+))*(@){1[a-z0-9]+[.]{1(([az]{2,3) ([a-z]{2,3[.]{1[a-z]{2,3))$/= 12345678901234567890123456789012345678901234567890^ // 2⁵⁰ rutas. /^(.*a){x for x > 10^/ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa^ //Esta es interesante. 2³⁹ rutas. Como podéis observar, se explotan todas del mismo modo: introduciendo caracteres válidos y añadiendo finalmente uno que no entre en el grupo de caracteres que deberían venir después. LOCALIZACIÓN: Ponernos a analizar una expresión regular en busca de posibles DoS puede ser algo tedioso si no estás familiarizado con las expresiones regulares. No cuesta nada ponerse y es hasta divertido. Para ahorrar la tarea de analizar manualmente he desarrollado un programa en JavaScript que analiza mediante RegExp si hay alguna falla de redos. Analizar una expresión regular por medio de RegExp de forma perfecta es muy complicado por lo que esta aplicación no es perfecta y puede dar falsos resultados. Aún así tiene un porcentaje de acierto muy alto, en torno al 95%. Sólo tienes que guardarlo en un archivo de texto y renombrarlo con extensión htm/html.

<html> <!-- [-] RegExp DoS Analyzer. [-] Programmed by SH4V. [-] Visit http://n3t-datagrams.net/ && http://foro.undersecurity.net/ [-] Gr33tz to Pr0x, Protos, Lix, OzX, C1c4Tr1Z, N0b0dy, Yoyahack, S[e]C, Seth, 1995, Dynamique and Undersec members. [-] Realizar un programa que localice RegExp vulnerables a un DoS mediante RegExp es extremadamente difícil por lo que el programa no es perfecto. En ocasiones da falsos positivos/negativos.4 [-] Enjoy it :-) --> 8 <head> <meta http-equiv='content-type' Content='text/html;charset=utf-8'> <style type="text/css"> #title { text-align:center; padding-top:15px; padding-bottom:15px; font-family: Arial, Georgia; font-size: 35px; color: white; background-color: #01356e; #form { background-color: #819ab8;

text-align:center; padding-bottom:1px; padding-top:10px; color: white; #result { background-color:#ffffff; color: #819ab8; font-family: Arial, Georgia; text-align:center; padding-bottom: 400px; #credits{ 9 text-align:center; font-family: Arial, Georgia; color: #01356e; font-size: 11px; font-weight: bold; </style> </head> <title>regexp Denial of Service Analyzer</title> <body> <div id='title'>regexp Denial of Service Analyzer</div> <div id='form'><form name='formu' method='post'> <input type='text' name='entrada' size= 37> <input type='button' onclick='proform()' value='comprobar RegExp'> </form></div> <div id='result'><h1><br /></h1></div>

<script> var reg= /\(([\w!%&,~:;<>=@ \/\'\- \"\\\*\+\?\ \{\[\]\\(\)\^\$\.\#])*\)\*/; var result=document.getelementbyid('result'); var per= 0; var tru= false; function cutpast(strg,sym){ strg=strg.split(sym); strg=strg.join('*'); return strg; 10 function proform(){ var str = document.formu.elements["entrada"].value; if (str.match(/script/i)){ alert('intentó un DOM bassed XSS. Si esta medida de seguridad interfiere en el análisis de su RegExp, desactívela modificando el código fuente.'); else{ countdown(); function countdown(){ if(tru){ var str = document.formu.elements["entrada"].value; str=cutpast(str,"+");

if (reg.test(str)){ control=reg.exec(str)[0]; control=cutpast(control, " "); if(control.split('*').length){ alert("posible redos! Revise las RegExp."); var sh0w= document.formu.elements["entrada"].value.split("\"").jo in('').split("\'").join(''); result.innerhtml="<h2>posible redos en: "+sh0w+"</h2>"; else{ alert('sin riesgo de alerta... :)'); result.innerhtml="<h2>no se encontraron patrones peligrosos pero se recomienda hacer una revisión manual.</h2>"; 11 else{ per++; if (per==100){tru=true; countd=settimeout('countdown()',25); result.innerhtml="<h1>"+per+"% Completado</h1>"; </script> <div id='credits'>n3t-datagrams / David Kotriksnov (a.k.a. SH4V)</div> </body> </html>

REDOS POR REGEXP INJECTION: Un tipo muy interesante de redos es este. Consiste en provocar una cadena vulnerable a redos y explotarla más adelante en un mismo formulario de verificación de campos. Veamos un ejemplo sacado de OWASP: String username = textbox1.text; String password = textbox2.text; Regex testpassword = new Regex(userName); Match match = testpassword.match(password); if (match.success) { MessageBox.Show("Do not include name in password."); 12 else { MessageBox.Show("Good password."); LECTURAS RECOMENDADAS: http://www.owasp.org/index.php/regular_expression_denial_of_se rvice_-_redos http://es.wikipedia.org/wiki/expresi%c3%b3n_regular AGRADECIMIENTOS: Gr33tz to Pr0x, Protos, Lix, OzX, C1c4Tr1Z, N0b0dy, Yoyahack, S[e]C, Seth, 1995, Dynamique and Undersec members.