Métodos de detección de vulnerabilidades de inyección
Buscar y reparar
Primero, busque el punto de inyección
Cuando queremos probar un sitio, generalmente usamos la herramienta de inyección en el estante para realizar bombardeo. Aunque a veces es posible encontrar el punto de inyección, todavía es un poco ciego. Mi opinión personal es: si hay código fuente, comience con él y busque el punto de inyección en el código fuente. Para el código fuente, algunos amigos pueden tener dificultades. De hecho, el código fuente no es misterioso, pero también tiene ciertas reglas gramaticales. Mirar un excelente conjunto de código fuente es como ver una buena película. Siempre que insista en leer un código fuente excelente todos los días y agregue la guía de Baidu, no pasará mucho tiempo antes de que se le revelen los secretos del código fuente. Sin más preámbulos, comenzamos a buscar puntos de inyección. Hay dos objetivos: uno es la solicitud y el otro es la declaración SQL.
Hablando de solicitudes, este es un objeto integrado en los programas ASP. ¿Por qué? no lo sabes? ¡Entonces déjame hacer las paces contigo primero! Existen cinco métodos para obtener información del cliente y generalmente hay tres puntos de inyección:
1. QueryString: obtiene la información enviada por el cliente. Este método se utiliza cuando se reciben datos en el lado del servidor cuando el formulario envía información a través del método Get o envía valores variables directamente en la URL.
2. Solicitud. Formulario: también obtiene la información enviada por el cliente, pero recibe la información enviada por el formulario en el método Publicación.
3. Solicitud. Cookie: obtiene la información de las cookies del navegador del cliente. Las cookies son cookies que se refieren a cierta información privada, como nombres de usuario y contraseñas.
Para reducir errores, algunos programadores utilizarán Solicitud para obtener la información enviada por el cliente, para los dos primeros tipos de información. Aunque este método puede obtener toda la información enviada por la solicitud. Cadenas de consulta y solicitudes. Si la forma y el filtrado no son buenos, las lagunas le morderán.
Después de adquirir algunos conocimientos sobre las solicitudes, ingrese "solicitud" en "Buscar" para buscar, ¡de acuerdo! Después de encontrar las tres declaraciones de solicitud enumeradas anteriormente, veamos si el programa ha filtrado estas declaraciones de solicitud, por ejemplo, si el valor de ID se filtra por INT, por ejemplo: ID = INT (Solicitud (ID)); mediante reemplazar () o instr () y otras funciones para filtrar comillas simples o ciertos caracteres especiales, por ejemplo, nombre de usuario = reemplazar (solicitud (nombre de usuario),, o si el programa usa algunas de sus propias funciones de filtrado para filtrar los enviados). valores. Desde encontrar los parámetros de solicitud hasta usar los valores enviados en la declaración SQL, si no hay niveles superiores, entonces básicamente tienes un punto de inyección.
Hablando de sentencias SQL, debemos mencionar las siguientes sentencias de uso común:
1. Sentencia de consulta: select[([AND | OR lt; expresión condicional>...]
2. Actualizar declaración: actualizar...]
3. Eliminar declaración: Eliminar FROM
Las sentencias SQL no se presentan aquí. Entre las sentencias SQL enumeradas anteriormente, el punto de inyección más común es la sentencia Select, y los parámetros inyectados suelen estar en la condición posterior a Where cuando se realiza una solicitud sin filtrar. Cuando la declaración ingresa a la declaración SQL, es hora de que se muestre la inyección, pero antes de inyectar, depende de si el parámetro se introduce directamente o con comillas simples. Además, el parámetro también se usa en otras declaraciones SQL. y luego elija según información diferente. Diferentes métodos de procesamiento, o explosión directa o consulta UNION. Por supuesto, si el programa con el punto de inyección usa una base de datos SQL, no es así.
Lo siguiente utiliza un código fuente en la versión "Ant Cinema 3.0" para cerrar la sesión de los usuarios (wantlogin.asp):
Cita
lt
if request(userid 1) lt; gtthen
set rst = server . createobject(adodb . recordset)
sql=seleccione dinero, en línea desde userid = amp; (ID de usuario 1) y contraseña = ampmd5(solicitud(pws)) &
conn 1,3
si rst.eof y rst.bof entonces
respuesta .write ltscriptgtAlert (¡nombre de usuario o contraseña incorrectos!); History.back(); lt/Scriptgt;
Otro
response.write ltscript gt alert (restauración exitosa) Puede iniciar sesión ¡ahora! lt/Script gt;
respuesta.escribir lenguaje ltScript = Javascript gtlocation href = index.asp/script gt; >Establecer rst=Ninguno
Conexión cerrada
Establecer conexión=Ninguno
Terminará si...
Terminará si ...
gt
En este proceso, primero determine si el valor enviado userid1 está vacío. Si son inconsistentes, ingrese la declaración SQL para verificar si el nombre de usuario y la contraseña obtenidos son consistentes con los de la base de datos. De lo contrario, aparecerá la ventana "Nombre de usuario y contraseña incorrectos"; de lo contrario, aparecerá la ventana "Restaurar correctamente". Este también es un código fuente de vulnerabilidad de inyección típico. El método de recepción sigue siendo una solicitud, lo que nos brinda la mayor comodidad para enviar declaraciones de inyección. Si enviamos los siguientes caracteres en la dirección URL: http://127.0.0.1/quiero iniciar sesión. ¿ASP? ID de usuario 1 = aa & Pws=bb, debido a que no hay ningún usuario aa, aparecerá una ventana de error. Si reemplazamos AA con los siguientes caracteres: AA o 1 = 1 o 1, Pws permanece sin cambios, entonces la declaración enviada se convierte en The. siguiente declaración en la declaración SQL:
Seleccione dinero, en línea desde el ID de usuario 1=aa o 1=1 o 1=1 y contraseña=MD5 (bb). Los códigos de prueba que vimos antes eran generalmente "o 1 = 1", pero aquí. Para explicar, entre los operadores lógicos, y tiene mayor precedencia que o. Después de ejecutar el programa, primero calculará lo siguiente 1 = 1, contraseña = MD5 (bb). Debido a que la contraseña se ingresa casualmente, el valor de la contraseña después de y es falso, y el valor antes de y es verdadero, pero verdadero y falso = falso. El valor de esta operación y es falso. Veamos la operación o nuevamente. Debido a que el nombre de usuario anterior no existe, su valor es, por supuesto, falso. De esta manera, la operación lógica después de dónde se convierte en la siguiente expresión: falso o verdadero o falso, y el valor del resultado sigue siendo verdadero, por lo que aparecerá la ventana "Restauración exitosa". Si cambia o 1=1 a o 1=2 de esta manera, dependiendo de la ventana emergente, podemos construir algunos caracteres especiales y luego adivinar los datos requeridos, como una declaración para consultar la ID del administrador y cambiar 1= 1 después o hasta: 1 = (seleccione el 1 ID superior de admin), donde admin se usa temporalmente para representar el nombre de la tabla del administrador.
Si hay un administrador con ID 1, aparecerá la ventana "Restaurar correctamente". De lo contrario, se demostrará que el ID del administrador no es 1 y se utilizarán otros números para la prueba. Después de adivinar el ID del administrador, cambie este carácter a la longitud del nombre del administrador: 5
El método de inyección requerido. Cadenas de consulta y solicitudes. La forma es la descrita anteriormente, mientras que se requiere el método de inyección. Las cookies se implementan modificando los valores de las cookies locales. Se recomienda utilizar algunas herramientas especiales de modificación de cookies. Sin embargo, inyectar cookies es relativamente problemático, pero el principio es el mismo que el de la inyección anterior, por lo que no lo presentaré aquí.
2. Reparación del punto de inyección
En lo anterior, nos centramos en cómo encontrar el punto de inyección y los métodos de utilización simples. Cuando sabemos atacar, también sabemos defender. Aunque la ofensiva y la defensa son opuestas, también son mutuas. Una vez que sepa dónde está el punto de inyección, la reparación será mucho más sencilla. Cuando busqué el punto de inyección anteriormente, también mencioné verificar si los parámetros enviados se han filtrado en el programa. Cada programa tiene diferentes capacidades de filtración con jeringa. Al reparar puntos de inyección en su propio sitio, puede consultar las funciones de filtrado en otros programas o filtrar algunos caracteres confidenciales individualmente según sus propias necesidades. Aquí, utilizamos el ejemplo anterior para ilustrar cómo reparar el punto de inyección. Existe una oración de este tipo en la declaración SQL anterior: userid =; Solicitud (userid 1) amp Entre ellos, los parámetros enviados se introducen con comillas simples. Podemos cerrar sus declaraciones agregando comillas simples a los parámetros enviados, por lo que la inyección es exitosa. . Esto agrega una función de reemplazo () para filtrar comillas simples. La declaración modificada es: userid = ;replace(request(userid1),) amp de modo que cuando el usuario envíe caracteres con comillas simples nuevamente, Reemplazar () reemplazará las comillas simples con. El filtro de comillas está vacío, por lo que los caracteres especiales enviados pierden su significado.
Por supuesto, también podemos determinar la longitud de userid1 antes de ingresar la declaración SQL. Si se excede la longitud especificada, aparecerá un error, se detendrá la ejecución de la página y se devolverá la página especificada. Por supuesto, también puedes aprender de algunos excelentes métodos de filtrado de código fuente. En definitiva, se pueden evitar los agujeros de inyección, e incluso si se produce un punto de inyección, ¡se puede reparar fácilmente siempre que analicemos la causa!