La semaine dernière, j'ai créé un site Web pour quelqu'un d'autre et j'ai accidentellement découvert qu'il y avait de nombreuses failles dans mon travail. En seulement 20 secondes, j'ai utilisé l'injection SQL pour le corriger. J'ai donc vérifié quelques informations sur l'injection SQL et obtenu quelques informations, j'espère pouvoir les partager avec les novices. Les experts rient !
L'idée générale de l'attaque par injection SQL :
Découvrez les emplacements d'injection SQL ;
Déterminez le type de serveur et le type de base de données en arrière-plan ;
Pour déterminer l'exécutabilité
, certains attaquants utilisent généralement l'injection SQL. Ensuite, je parlerai également de mes propres idées sur la méthode d'injection SQL.
Méthode d'injection :
En théorie, la page Web d'authentification ressemblerait à ceci :
Sélectionnez * depuis l'administrateur où l'instruction username='XXX' et password='YYY', si le filtrage des caractères nécessaire n'est pas effectué avant l'exécution officielle de cette instruction, il est facile d'implémenter l'injection SQL.
Par exemple, entrez dans la zone de texte du nom d'utilisateur : abc' ou 1=1-- Entrez dans la zone de mot de passe : 123, l'instruction SQL devient alors :
sélectionnez * from admin où username='abc' ou 1=1 et password='123' Quels que soient le nom d'utilisateur et le mot de passe saisis par l'utilisateur, cette instruction sera toujours exécutée correctement et l'utilisateur peut facilement tromper le système et obtenir un accès légal. identité.
Devinez la solution :
L'idée de base est la suivante : devinez tous les noms de bases de données, devinez chaque nom de table de la base de données, analysez les noms de tables pouvant stocker des noms d'utilisateur et des mots de passe, devinez chaque nom de champ de la table, devinez chaque enregistrement du contenu de la table.
Il existe également un moyen d'obtenir le nom de votre base de données et le nom de chaque table.
Obtenez simplement le nom de votre base de données et le nom de votre table en signalant une erreur sous la forme : http://www .cn/news?id=10' !
Pour jsp, nous adoptons généralement les stratégies suivantes pour y faire face :
1.Déclaration préparée
Si vous êtes déjà un développeur moyennement avancé, vous devez toujours utiliser PreparedStatement au lieu de Statement.
Voici quelques raisons
1. Lisibilité et maintenabilité du code.
2. PreparedStatement améliore les performances autant que possible.
3. Le point le plus important est que la sécurité est grandement améliorée.
Jusqu'à présent, certaines personnes (y compris moi-même) ne connaissent même pas la syntaxe SQL maléfique de base.
String sql = "select * from tb_name où name= '"+varname+"' et passwd='"+varpasswd+"'";
Si nous passons [' ou '1' = '1] comme nom. Le mot de passe est arbitraire, voyons à quoi il ressemblera ? Réseau de gestion de réseau bitsCN.com
sélectionnez * from tb_name = 'or '1' = '1' et mot de passe = 'occasionnel' ;
Parce que '1'='1' est définitivement vrai, il peut passer n'importe quelle vérification. De plus :
Passez ['; drop table tb_name; ] comme varpasswd, puis :
select * from tb_name = 'any' and passwd = ''; drop table tb_name; Certaines bases de données ne vous permettront pas de réussir, mais il existe également de nombreuses bases de données qui peuvent exécuter ces instructions.
Et si vous utilisez des instructions précompilées, tout contenu que vous transmettez n'aura aucune relation de correspondance avec les instructions d'origine (le principe est que la base de données elle-même prend en charge la précompilation, mais il se peut qu'aucune base de données côté serveur ne prenne en charge la compilation. Il n'y a que quelques bases de données de bureau, c'est-à-dire celles avec accès direct aux fichiers. Tant qu'elles utilisent toutes des instructions précompilées, vous n'avez pas besoin de filtrer les données entrantes. Si vous utilisez des instructions ordinaires, vous devrez peut-être dépenser. beaucoup de temps passé en abandon, etc. Jugement intrigant et réflexion excessive.
2. Expressions régulières
2.1. Expression régulière pour détecter les méta-caractères SQL/(%27)|(')|(--)|(%23)|(#)/ix
2.2. Corrigez l'expression régulière de détection des méta-caractères SQL /((%3D)|(=))[^n]*((%27)|(')|(--) 54ne. com
|(%3B)|(:))/i
2.3. Expression régulière d'attaque par injection SQL typique/w*((%27)|('))((%6F)|o|(%4F))((%72)|r |( Alliance chinoise de gestion de réseau www.bitscn.com
%52))/ix
2.4. Détecter l'injection SQL, expression régulière du mot-clé de requête UNION /((%27)|('))union/ix(%27)|(') - single
Citations et son équivalent hexadécimal union - le mot-clé union.
2.5. Expression régulière/exec(s|+)+(s|x)pw+/ix pour détecter les attaques par injection SQL MS SQL Server
3. Filtrage de chaînes
chaîne statique publique filterContent (contenu de la chaîne) {
Chaîne flt="'|et|exec|insert|select|delete|update|count|*|%
|chr|mid|master|truncate|char|declare|; |or|-|+|,";
Stringfilter[] = flt.split("|");
pour(int je=0; je {
content.replace(filter[i], "");
}
renvoyer du contenu ;
}
4. Masquage de caractères dangereux
Cette partie utilise js pour bloquer, ce qui joue un très petit rôle. Bien que la méthode de blocage des mots-clés ait un certain effet, dans les applications réelles, ces mots-clés SQL peuvent également devenir de véritables mots-clés de requête, puis ils seront bloqués par vous. l'utilisateur ne pourra pas l'utiliser normalement. Faites simplement des efforts dans les normes de codage.
Lorsqu'il y a des variables dans le SQL exécuté, utilisez simplement PreparedStatement fourni par JDBC (ou une autre couche de persistance des données). N'oubliez pas de ne pas utiliser la méthode d'épissage des chaînes.
Introduction de la fonction : Vérifiez s'il contient "'"," \","/ "
Description du paramètre : La chaîne à vérifier Valeur de retour : 0 : Oui 1 : Non Nom de la fonction Oui
contrôle du fonctionnement(a)
{
renvoyer 1 ;
fibdn = nouveau tableau ("'" ," \","/ ");
je = fibdn.longueur;
j=a.longueur;
pour (ii=0; ii { pour (jj=0; jj
{ temp1=a.charAt(jj);
temp2=fibdn[ii];
si (tem'; p1==temp2)
{ renvoie 0 ;
}
}
renvoie 1
;