Los ataques basados en la web actuales son generalmente de inyección. El motivo de la inyección es generalmente un filtrado incompleto de variables, lo que permite a los intrusos ejecutar programas ilegalmente o consultar y modificar datos arbitrarios. A medida que los ataques de inyección se vuelven cada vez más intensos, han surgido algunos códigos de filtrado especializados. Sin embargo, las imperfecciones en algunos códigos de filtrado pueden dar lugar a nuevos ataques. A continuación se utiliza el código de filtrado más utilizado, el programa antiinyección universal SQL, para explicar las causas, los métodos de utilización y las medidas preventivas de la vulnerabilidad.
El programa antiinyección universal SQL está escrito por Feng Zhiqiu de Firefox. Es un código antiinyección bastante completo. Puede implementar el filtrado de envío para los caracteres de filtro definidos y puede registrar la información de datos enviada por la IP del atacante. Al usarlo, solo necesita agregar el código <--#Include File="WrSky_Sql.Asp"--> al encabezado del archivo para evitar la inyección y lograr el filtrado de variables. Si agrega código de programa después del archivo de conexión de la base de datos (como conn.asp), puede lograr un filtrado variable de todo el sitio, logrando así el efecto anti-inyección.
Bien, primero veamos el código de la parte de filtrado de variables:
'--------Parte de definición------------------
Atenuar Fy_Post,Fy_Get,Fy_In,Fy_Inf,Fy_Xh,Fy_db,Fy_dbstr
'Personaliza las cadenas que necesitan ser filtradas, separadas por "maple"
Fy_In = "' arce; arce y arce ejecutivo arce insertar arce seleccionar arce eliminar arce actualizar recuento de arce arce * arce% arce chr arce medio arce maestro arce truncar arce char arce declarar"
'----------------------------------
%>
<
Fy_Inf = dividir(Fy_In,"Arce")
'--------Parte POST------------------
Si Solicitud.Form<>Entonces
Para cada Fy_Post en Request.Form
para Fy_Xh=0 a Ubound(Fy_Inf)
Si Instr(LCase(Request.Form(Fy_Post)),Fy_Inf(Fy_Xh))<>Entonces
'--------OBTENER parte------------------
Si Request.QueryString<>Entonces
Para cada Fy_Get In Request.QueryString
para Fy_Xh=0 a Ubound(Fy_Inf)
Si Instr(LCase(Request.QueryString(Fy_Get)),Fy_Inf(Fy_Xh))<>Entonces
este código define el filtrado de variables comúnmente inyectadas como "'", "y", etc. Si cree que el filtrado no es suficiente o demasiado, puedes hacerlo tú mismo Agrega o resta caracteres. Obviamente, siempre que los datos enviados al servidor a través de get o post contengan caracteres filtrados, el programa los prohibirá. Esto genera un problema. Si agrega código de programa después del archivo de conexión de la base de datos del foro, siempre que el contenido de la publicación contenga caracteres filtrados, será prohibido. Según el filtrado de contenido predeterminado, parece que es casi imposible publicar si el contenido está en inglés. Además, a veces se utilizan algunos caracteres especiales (como el signo de porcentaje "%") al definir el estilo del foro. Si se filtran estos caracteres especiales, todo el foro no funcionará correctamente. Con respecto al problema mencionado anteriormente, utilicé dvbbs para probarlo y el resultado fue exactamente el que esperaba.
La forma de resolver el problema anterior es evitar la inyección de declaraciones de conexión solo en los archivos que deben filtrarse. Pero esta carga de trabajo es relativamente grande y, en general, los webmasters no saben qué archivos deben filtrarse. Por lo tanto, mi sugerencia es agregar el código de filtrado a conn.asp, luego crear un connl.asp que no contenga el código de filtrado y conectar los archivos que definitivamente no necesitan filtrado y el código de filtrado tiene un impacto en el funcionamiento de este archivo a conn1.asp, pero debe tener en cuenta que el contenido básico de los dos archivos de conexión de datos debe ser coherente. Además, es mejor no utilizar caracteres filtrados en la configuración de estilo. Si realmente necesita utilizarlos, puede eliminar el filtrado de estos caracteres en el programa anti-inyección.
Lo anterior trata sobre el impacto del programa anti-inyección en el funcionamiento del sitio y no puede causar ningún daño. De hecho, el verdadero daño proviene de la parte de registro de datos. Echemos un vistazo a esta parte del código:
''--------Escribir en la base de datos-------Encabezado----. ----
Fy_dbstr="DBQ="+server.mappath("SqlIn.mdb")+";DefaultDir=;DRIVER={Controlador de Microsoft Access (*.mdb)};"
Establecer Fy_db=Server.CreateObject("ADODB.CONNECTION")
Fy_db.open Fy_dbstr
Fy_db.Execute("insertar en SqlIn(Sqlin_IP,SqlIn_Web,SqlIn_FS,SqlIn_CS,SqlIn_SJ) valores('"&Request.ServerVariables("REMOTE_ADDR")&"','"&Request.ServerVariables("URL")&"',' GET','"&Fy_Get&"','"&replace(Request.QueryString(Fy_Get),"'","''")&"')")
Fy_db.cerrar
Establecer Fy_db = Nada
'--------Escribir en la base de datos-------Cola--------
Respuesta.Escribir "<Lenguaje de script=JavaScript>alert('Solicitud del sistema antiinyección universal Fengwang SQL↓ nnNo intente inyectar caracteres ilegales en los parámetros nnHTTP://WwW.WrSkY.CoM Versión del sistema: V2.0 (ASP) versión perfecta');<Script>
Response.Write "¡Operación ilegal! El sistema realizó los siguientes registros↓<br>"
Respuesta.Escribir "IP de operación:"&Request.ServerVariables("REMOTE_ADDR")&"<br>"
Respuesta.Escribir "Tiempo de operación:"&Ahora&"<br>
respuesta.Escribir "Página de operación:"&Request.ServerVariables("URL")&"<br>"
Response.Write "Método de envío: GET<br>"
Respuesta.Escribir "Enviar parámetros:"&Fy_Get&"<br>"
Respuesta.Escribir "Enviar datos:"&Request.QueryString(Fy_Get)
Respuesta.Fin
Terminar si
Próximo
Próximo
Terminar si
'---------------------------------
La función de este código es registrar la información y las acciones del atacante. que podamos tomar las contramedidas necesarias. Se puede ver en el código que el programa registra la IP del atacante, la dirección de envío, el contenido del envío, etc., pero obviamente hay varias lagunas aquí:
1. Los ataques frecuentes no se procesan. En otras palabras, no importa cómo enviemos datos legales, el programa los registrará, lo que probablemente dará lugar a ataques maliciosos de DOS. Hice un experimento sobre esto. Envío la siguiente declaración después de la URL de un archivo protegido: y (seleccione top l asc(mid (username,l,l)) from admin)>0, use el asistente de claves para registrar el proceso de envío y luego repita automáticamente el envío . Después de un tiempo, el tamaño de la base de datos cambió significativamente (como se muestra en las Figuras 1 y 2). Como puede imaginar, si utiliza herramientas como Shuoxue para habilitar el envío de subprocesos múltiples, DOS definitivamente no será un problema.
Figura 1
Figura 2
2. La longitud de los datos del registro no se trunca. Esto es lo que descubrí durante mis pruebas de programas anti-inyección que afectan las operaciones del foro. Como se muestra en la Figura 3, si el contenido de la publicación contiene caracteres filtrados, el contenido de la publicación se registrará completamente en la base de datos. Los foros generales o los sistemas de artículos tienen límites en la extensión de los artículos publicados, pero el programa antiinyección universal SQL no impone ninguna restricción al respecto. Si un atacante envía un contenido demasiado largo después de la URL del archivo protegido, es probable que el programa se bloquee. Debido a que el daño es relativamente alto, no lo probé, pero el contenido que envié hasta 100K se grabó como de costumbre.
Figura 3
3. Problema de conversión de contenido de datos y explosión de bases de datos. A juzgar por el código, el programa registra los datos enviados ilegalmente directamente en la base de datos sin conversión. En otras palabras, no importa lo que envíes, siempre que contenga contenido filtrado, el programa registrará todo el contenido que envíes. Originalmente, este problema no es grave, pero por motivos de "seguridad", a algunos webmasters les gusta cambiar todos los archivos mdb al sufijo asp. Además, solo hay una tabla en la base de datos del programa anti-inyección, por lo que podemos obtener el webshell escribiendo directamente la URL del archivo protegido en la base de datos. Durante el proceso de prueba, cambiamos sqlin.mdb a sqlin.asp. y luego agregó Después de ingresar la URL del archivo protegido, se ingresó una puerta trasera micro ASP de Binglangzi. Después de conectarse con el cliente Ice Fox, se obtuvo con éxito wedshll.
Debido a que este método para obtener webshell requiere asegurarse de que la base de datos de la otra parte se esté ejecutando en formato ASP y conozca la ruta de los datos, debemos encontrar una manera de obtener la ruta de esta base de datos. En circunstancias normales, podemos adivinar directamente la ruta de la base de datos, pero de hecho, esta ruta puede quedar expuesta. Al observar todo el programa anti-inyección, no encontramos ninguna declaración de biblioteca a prueba de explosiones, por lo que solo necesitamos acceder o usar directamente. el método %5C La base de datos está expuesta si el código del programa se coloca directamente después del archivo de conexión de la base de datos, dado que el archivo de conexión de datos generalmente contiene declaraciones a prueba de explosiones, no podemos exponer la dirección de la base de datos.
Los mencionados anteriormente son todos problemas en el proceso de registro de datos. Los webmasters competentes pueden solucionar las lagunas relevantes por sí mismos, como el bloqueo automático de IP para grandes cantidades de envíos repetidos de datos. De hecho, podemos eliminar por completo la parte del código que registra los datos, lo que no afectará el filtrado de variables, e incluso si se registra la información del atacante, no será de mucha utilidad. Por lo tanto, sugiero que lo mejor sea eliminar este código, para que ya no existan todas las vulnerabilidades.
Bien, eso es todo por este artículo. Finalmente, me gustaría recordarle que cuando utilice programas de protección de seguridad, también debe prestar atención a los problemas de seguridad del programa en sí.
Recordatorio especial: el programa antiinyección 3.0 también tiene lagunas. las lagunas son más graves.