web-dev-qa-db-fra.com

Quels caractères dangereux doivent être filtrés à partir d'une entrée utilisateur avant utilisation dans une requête SQL DB2?

Je cherche à bien comprendre comment filtrer/échapper correctement aux caractères dangereux de l'entrée de l'utilisateur qui sera interpolée dans une requête SQL DB2.

Le routage de l'assainissement que j'an analyse fonctionne comme celui-ci:

  • Supprimer toutes les backslashes (S/\\ //)
  • Remplacez toutes les guillemets simples avec des guillemets simples doubles (S/'/' '/)

Mon premier instinct était d'examiner une fonction de désinfectation DB2 existante, de vérifier toutes les différences. J'ai donc pris un coup d'oeil db2_real_escapape_string qui, il s'avère, est assez différent: il se répand à des caractères spéciaux dans l'argument de la chaîne. Les caractères préparés avec une barre oblique inverse sont\x00,\n,\r, \, ', "et\x1a.

Quelques questions spécifiques que j'ai sont:

  1. Pourquoi db2_real_escapape_string () backslash-échapper au citations au lieu de les doubler? Cela semble incorrect.
  2. La fonction d'assainissement que j'analyse ne parvient pas à échapper ou à filtrer\x00,\n,\r,\x1a, ". Comment ces personnages pourraient-ils être abusés par un attaquant? C'est ma question principale.
  3. Une autre déficience de ma fonction d'assainissement est que ce n'est pas au courant, mais je suppose que ce n'est pas un problème, car DB2, dans ce cas, est configuré pour utiliser le charlet par défaut (qui devine ISN ' t multi-octets). Donc, AFAIK, à moins que un charert multi-octets comme GBK ait été configuré, des attaques d'injection SQL multi-octets comme cette vulnérabilité connue dans MySQL GBK ne devrait pas être un problème.
  4. Y a-t-il d'autres considérations/étapes que la fonction d'assainissement que j'analyse est manquante?

Je comprends que l'utilisation de requêtes paramétrées est la solution évidente. Cependant, dans ce cas, je suis responsable de: a) déterminer si la conception actuelle est exploitable et b) fournissant un correctif pour la fonction d'assainissement (si l'on est nécessaire).

Edit Je cherche essentiellement à construire une preuve de la charge utile d'injection SQL Concept SQL, compte tenu de la fonction de désinfection ci-dessus et de l'utilisation suivante: execute( " SELECT foo FROM bar WHERE col='" + my_sanitize($_GET['input']) + "'" )

Compte tenu de la conception de la fonction de désinfectation actuelle (supprimez les backslashes et les guillemets simples de double up), existe-t-il un moyen de sortir des guillemets simples comme dans l'exemple d'utilisation ci-dessus?

Merci pour votre aide!

6
octagonC

"La fonction d'assainissement que je suis analysant ne parvient pas à échapper ou à filtrer\x00,\n,\r,\x1a,". Comment ces personnages peuvent-ils être maltraités par un attaquant? C'est ma question principale..

Les représentations hexagonales\x00 et\x1a pour un espace vide et un caractère de substitution.\n et\r sont des retours d'alimentation en ligne et de chariot.

Dans la plupart des cas, je ne pense pas que ce serait des personnages terriblement explosifs. Pensant que je tape ici, vous pourrez peut-être utiliser\x00 (vide) pour inonder un tampon statique. Un caractère\x1a (SUB) peut avoir un potentiel si le système est en mode binaire, ou si vous streamez binaire, pour tromper le système en pensant que vous avez atteint la fin d'un fichier prématurément.

Quant à\N &\... Je ne peux pas penser à beaucoup.

En fonction de la quantité d'informations que vous avez/pouvez obtenir sur le système, vous souhaiterez peut-être enquêter sur les différents codages de caractères possibles. Parfois, vous pouvez faire des choses comme Passer un UTF-8 dans un processus défini sur UTF-7 (exemple aléatoire, pas une application pratique que je pense) et obtenir des résultats passionnants de la magie des erreurs de conversion.

Bonne chance avec votre stylo-test.

3
grauwulf

"Assainement" est fragile. Vous devez penser à chaque détail de la base de données interprète les "caractères spéciaux" et vous devez en garder une trace de près, au cas où une nouvelle sous-version de la base de données introduit des caractères spéciaux supplémentaires. C'est un travail épuisant et il échoue souvent.

La voie préférée (beaucoup) d'insérer des données utilisateur dans les requêtes SQL est d'utiliser instruction préparée . Cela vous sera plus facile pour vous (le programmeur), plus robuste, plus sûr et probablement plus rapide.

8
Thomas Pornin

Pour la validation de l'entrée d'utilisateur critique, cela peut casser vos chaînes SQL, je créerais un "tableau de caractères valide/chaîne", puis vérifiez que chaque caractère de l'utilisateur doit être dans la chaîne autorisée.

Comme si vous ne permetriez que des chiffres que la chaîne pourrait être fait quelque chose comme:

function ParseIntoValid(userinput)
{
    string validOutput = "";
    Array allowedChars = new Array("0123456789");

    foreach (char c in userinput[])
    {

        if (c.instr(allowedChars))
        {

            // if this is a parser, then add valid chars to new output
            validOutput += c;
         }
         else
         { 
            // exit loop and return false/error if you just need a check or just ignore the illigal chars
         }
    }
}

vous pouvez facilement envelopper cette vérification dans une simple "CheckIfflValid (entrée)" ou "Paysintovalid (entrée)" en fonction de votre objectif.

En analysant et non seulement en vérifiant, vous obtenez une sortie valide, peut-être qu'il a moins de caractères, mais si l'utilisateur entre en une seule image illigique, cette fonction aidera le "bon utilisateur" et le "mauvais utilisateur" ne gagnera toujours pas Accès en utilisant eux.

0
BerggreenDK