La semana pasada creé un sitio web para otra persona y accidentalmente descubrí que había muchas lagunas en mi trabajo. En solo 20 segundos, utilicé la inyección SQL para solucionarlo. Así que verifiqué información sobre la inyección SQL y obtuve algunas ideas. Espero poder compartirla con los principiantes. ¡Los expertos se ríen!
La idea general del ataque de inyección SQL:
Descubra ubicaciones de inyección SQL;
Determinar el tipo de servidor y el tipo de base de datos en segundo plano;
Para determinar la ejecutabilidad
, algunos atacantes generalmente utilizan la inyección SQL. A continuación, también hablaré sobre mis propios conocimientos sobre el método de inyección SQL.
Método de inyección:
En teoría, la página web de autenticación tendría este aspecto:
Seleccione * del administrador donde nombre de usuario = 'XXX' y contraseña = 'YYY' declaración, si no se realiza el filtrado de caracteres necesario antes de ejecutar oficialmente esta declaración, es fácil implementar la inyección SQL.
Por ejemplo, ingrese en el cuadro de texto del nombre de usuario: abc' o 1=1-- Ingrese en el cuadro de contraseña: 123, luego la declaración SQL se convierte en:
seleccione * de admin donde nombre de usuario = 'abc' o 1 = 1 y contraseña = '123' No importa qué nombre de usuario y contraseña ingrese el usuario, esta declaración siempre se ejecutará correctamente y el usuario puede engañar fácilmente al sistema y obtener una autorización legal. identidad.
Adivina la solución:
La idea básica es: adivinar todos los nombres de las bases de datos, adivinar cada nombre de tabla en la base de datos, analizar los nombres de las tablas que pueden almacenar nombres de usuario y contraseñas, adivinar cada nombre de campo en la tabla, adivinar cada registro en el contenido de la tabla.
También hay una manera de obtener el nombre de su base de datos y el nombre de cada tabla.
Simplemente obtenga el nombre de su base de datos y el nombre de la tabla informando un error en el formulario: http://www.cn/news?id=10 '.
Para jsp, generalmente adoptamos las siguientes estrategias para solucionarlo:
1.Declaración preparada
Si ya es un desarrollador moderadamente avanzado, siempre debe utilizar PreparedStatement en lugar de Statement.
Aquí hay algunas razones
1. Legibilidad y mantenibilidad del código.
2. PreparedStatement mejora el rendimiento tanto como sea posible.
3. El punto más importante es que la seguridad ha mejorado enormemente.
Hasta ahora, algunas personas (incluyéndome a mí) ni siquiera conocen la sintaxis básica de SQL malvado.
String sql = "select * from tb_name donde nombre= '"+varname+"' y passwd='"+varpasswd+"'";
Si pasamos [' o '1' = '1] como nombre La contraseña es arbitraria, veamos cómo será la red de administración bitsCN.com
seleccione * de tb_name = 'o '1' = '1' y contraseña = 'casual';
Debido a que '1'='1' es definitivamente cierto, puede pasar cualquier verificación. Es más:
Pase ['; drop table tb_name ] como varpasswd, luego:
seleccione * de tb_name = 'any' y passwd = ''; drop table tb_name; Algunas bases de datos no le permitirán tener éxito, pero también hay muchas bases de datos que pueden ejecutar estas declaraciones.
Y si utiliza declaraciones precompiladas, cualquier contenido que pase no tendrá ninguna relación de coincidencia con las declaraciones originales (la premisa es que la base de datos en sí admite la precompilación, pero es posible que no haya bases de datos del lado del servidor que no admitan la compilación). Son solo unas pocas bases de datos de escritorio, es decir, aquellas con acceso directo a archivos, siempre que todas utilicen declaraciones precompiladas, no es necesario filtrar los datos entrantes. Si usa declaraciones ordinarias, es posible que deba gastar. mucho tiempo en caída, etc. Juicio intrigante y pensamiento excesivo.
2. Expresiones regulares
2.1. Expresión regular para detectar metacaracteres SQL/(%27)|(')|(--)|(%23)|(#)/ix.
2.2 Corregir la expresión regular para detectar metacaracteres SQL /((%3D)|(=))[^n]*((%27)|(')|(--) 54ne. es
|(%3B)|(:))/i
2.3. Expresión regular típica de ataque de inyección SQL/w*((%27)|('))((%6F)|o|(%4F))((%72)|r |( Alianza de gestión de redes de China www.bitscn.com
%52))/ix
2.4 Detectar inyección SQL, expresión regular de la palabra clave de consulta UNION /((%27)|('))union/ix(%27)|(') - single.
Comillas y su unión hexadecimal equivalente: la palabra clave union.
2.5. Expresión regular/exec(s|+)+(s|x)pw+/ix para detectar ataques de inyección SQL de MS SQL Server
3. Filtrado de cadenas.
contenido de filtro de cadena estática pública (contenido de cadena) {
Cadena flt="'|y|exec|insertar|seleccionar|eliminar|actualizar|recuento|*|%
|chr|mid|master|truncar|char|declarar|; |o|-|+|,";
Filtro de cadena[] = flt.split("|");
para(int i=0; i {
content.replace(filtro[i], "");
}
devolver contenido;
}
4. Enmascaramiento de personajes inseguro
Esta parte usa js para bloquear, lo que juega un papel muy pequeño. Aunque el método de bloqueo de palabras clave tiene cierto efecto, en aplicaciones reales, estas palabras clave SQL también pueden convertirse en palabras clave de consulta reales, y luego usted las bloqueará. El usuario no podrá utilizarlo normalmente. Simplemente haga un poco de esfuerzo en los estándares de codificación.
Cuando hay variables en el SQL ejecutado, simplemente use PreparedStatement proporcionado por JDBC (u otra capa de persistencia de datos. Recuerde no usar el método de empalme de cadenas).
Introducción a la función: compruebe si contiene "'"," \","/ "
Descripción del parámetro: la cadena que se va a comprobar Valor de retorno: 0: Sí 1: No Nombre de la función Sí
verificación de función (a)
{
devolver 1;
fibdn = nueva matriz ("'" ," \","/ ");
i=fibdn.longitud;
j=a.longitud;
para (ii=0; ii { para (jj=0; jj
{ temp1=a.charAt(jj);
temp2=fibdn[ii];
si (tem'; p1==temp2)
{ devolver 0 }
}
}
devolver 1;
}