{"id":9462,"date":"2024-05-30T10:12:14","date_gmt":"2024-05-30T08:12:14","guid":{"rendered":"https:\/\/www.vaadata.com\/blog\/?p=9462"},"modified":"2024-05-30T15:12:48","modified_gmt":"2024-05-30T13:12:48","slug":"sqlmap-loutil-pour-identifier-et-exploiter-des-injections-sql","status":"publish","type":"post","link":"https:\/\/www.vaadata.com\/blog\/fr\/sqlmap-loutil-pour-identifier-et-exploiter-des-injections-sql\/","title":{"rendered":"Sqlmap, l\u2019outil pour identifier et exploiter des injections SQL"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"807\" height=\"417\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/exploiting-sqli-with-sqlmap.png\" alt=\"Sqlmap, l\u2019outil pour identifier et exploiter des injections SQL (SQLi)\" class=\"wp-image-9463\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/exploiting-sqli-with-sqlmap.png 807w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/exploiting-sqli-with-sqlmap-300x155.png 300w\" sizes=\"(max-width: 807px) 100vw, 807px\" \/><\/figure>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p>S\u00fbrement l\u2019une des vuln\u00e9rabilit\u00e9s les plus connues, et ce depuis bien longtemps, l\u2019injection SQL fait toujours des ravages en 2024. Elle se retrouve chaque ann\u00e9e dans bons nombres de nos rapports de pentest. <\/p>\n\n\n\n<p>Par ailleurs, comparativement \u00e0 2022, en 2023, les failles d\u2019injection SQL ont \u00e9t\u00e9 identifi\u00e9es en tant que <a href=\"https:\/\/www.cvedetails.com\/vulnerability-list\/year-2023\/opsqli-1\/sql-injection.html\" target=\"_blank\" rel=\"noopener\" title=\"\">CVE 2159 fois<\/a>. Et dans le dernier Top 10 de l\u2019OWASP qui liste les vuln\u00e9rabilit\u00e9s les plus critiques et courantes dans les applications web, elles scrutent la troisi\u00e8me position.&nbsp;<\/p>\n\n\n\n<p>En fonction des cas, une injection SQL peut \u00eatre fastidieuse \u00e0 exploiter afin d\u2019\u00e9valuer son impact. Heureusement, des outils extr\u00eamement qualitatifs et d\u00e9velopp\u00e9s par la communaut\u00e9 open source tel que sqlmap nous facilitent grandement la t\u00e2che. <\/p>\n\n\n\n<p>Dans cet article, nous rappellerons le principe des injections SQL et pr\u00e9senterons de fa\u00e7on exhaustive, cas concrets \u00e0 l\u2019appui, le fonctionnement de sqlmap.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Guide complet sur sqlmap<\/h2>\n\n\n<div class=\"wp-block-aioseo-table-of-contents\"><ul><li><a class=\"aioseo-toc-item\" href=\"#petit-rappel-sur-les-injections-sql-sqli\">Petit rappel sur les injections SQL (SQLi)<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#quest-ce-quune-sqli\">Qu\u2019est-ce qu\u2019une SQLi\u00a0?<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#impact-dune-sqli\">Impact d\u2019une SQLi<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#quels-sont-les-differents-types-de-sqli-et-comment-les-prevenir\">Quels sont les diff\u00e9rents types de SQLi et comment les pr\u00e9venir\u00a0?<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#sqlmap-principes-et-fonctionnement\">Sqlmap : principes et fonctionnement<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#cest-quoi-sqlmap\">C\u2019est quoi Sqlmap ?<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#exploitation-dune-sqli-avec-sqlmap\">Exploitation d&#039;une SQLi avec Sqlmap<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#trouver-une-payload-adaptee-au-type-de-sqli\">Trouver une payload adapt\u00e9e au type de SQLi<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#exfiltrer-le-nom-des-bases-de-donnees\">Exfiltrer le nom des bases de donn\u00e9es<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#enumerer-le-nom-des-tables\">\u00c9num\u00e9rer le nom des tables<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#choisir-une-table-interessante\">Choisir une table int\u00e9ressante<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#enumerer-les-donnees-de-la-table\">\u00c9num\u00e9rer les donn\u00e9es de la table<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#utiliser-sqlmap-pour-recuperer-des-informations-systeme\">Utiliser Sqlmap pour r\u00e9cup\u00e9rer des informations syst\u00e8me<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#exploitation-de-blinds-sqli-avec-sqlmap\">Exploitation de blinds SQLi avec Sqlmap<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#options-avancees-de-sqlmap\">Options avanc\u00e9es de Sqlmap<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#proxy\">&#8211;proxy=<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#delay\">&#8211;delay=<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#force-ssl\">&#8211;force-ssl<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#threads\">&#8211;threads=<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#dbms\">&#8211;dbms=<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#level\">&#8211;level=<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#risk\">&#8211;risk=<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#string\">&#8211;string=<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#technique\">&#8211;technique=<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#file-read\">&#8211;file-read=<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#os-cmd\">&#8211;os-cmd=<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#flush-session\">&#8211;flush-session<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#tamper\">&#8211;tamper=<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#les-scripts-tampers-sqlmap\">Scripts tampers sqlmap<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#space2comment-py\">space2comment.py<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#randomcase-py\">randomcase.py<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#equaltolike-py\">equaltolike.py<\/a><\/li><\/ul><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#conclusion\">Conclusion<\/a><\/li><\/ul><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"petit-rappel-sur-les-injections-sql-sqli\">Petit rappel sur les injections SQL (SQLi)<\/h2>\n\n\n\n<p>Tout d\u2019abord, que signifie SQL&nbsp;? <strong>Le \u00ab&nbsp;Structured Query Language&nbsp;\u00bb est un langage informatique permettant de communiquer avec la base de donn\u00e9es et d\u2019y manipuler les donn\u00e9es stock\u00e9es<\/strong>.<\/p>\n\n\n\n<p>La grande majorit\u00e9 des applications web utilisent le SQL afin d\u2019interroger leur base de donn\u00e9es. Cependant, en fonction de l\u2019impl\u00e9mentation, des vuln\u00e9rabilit\u00e9s de type injection SQL, commun\u00e9ment appel\u00e9es \u00ab&nbsp;SQLi&nbsp;\u00bb, peuvent \u00e9merger.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-ede8c691c8d5f5a719709dcdf646b4a9\" id=\"quest-ce-quune-sqli\" style=\"color:#c0b800\">Qu\u2019est-ce qu\u2019une SQLi&nbsp;?<\/h3>\n\n\n\n<p><strong>Une injection SQL est une attaque permettant de manipuler les bases de donn\u00e9es relationnelles d\u2019une application web, comme MySQL, Oracle Database ou Microsoft SQL Server.<\/strong> \u00c0 ne pas confondre avec les injections NoSQL qui sont des attaques permettant de manipuler des bases de donn\u00e9es non relationnelles telles que MongoDB ou CouchDB.<\/p>\n\n\n\n<p>Par exemple, consid\u00e9rons le bout de code PHP suivant&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"140\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sql-query-1024x140.png\" alt=\"\" class=\"wp-image-9578\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sql-query-1024x140.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sql-query-300x41.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sql-query.png 1205w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Requ\u00eate SQL<\/figcaption><\/figure>\n\n\n\n<p>On peut voir sur la premi\u00e8re ligne que la variable $id prend en valeur le param\u00e8tre id de l\u2019URL. Cependant, cette variable $id est directement concat\u00e9n\u00e9e dans la requ\u00eate SQL de la ligne suivante.<\/p>\n\n\n\n<p>Ainsi, le param\u00e8tre id \u00e9tant contr\u00f4lable par n\u2019importe quel utilisateur, un attaquant peut injecter du code SQL dans le param\u00e8tre id de l\u2019URL et effectuer une multitude d\u2019actions sur la base de donn\u00e9es de l\u2019application web.<\/p>\n\n\n\n<p>Par exemple, pour s\u2019assurer de l\u2019injection, l\u2019attaquant peut injecter un d\u00e9lai de 5 secondes dans le param\u00e8tre id de l\u2019URL&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"136\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sql-injection-in-id-parameter-1024x136.png\" alt=\"\" class=\"wp-image-9581\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sql-injection-in-id-parameter-1024x136.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sql-injection-in-id-parameter-300x40.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sql-injection-in-id-parameter.png 1137w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Injection SQL dans le param\u00e8tre id de l\u2019URL<\/figcaption><\/figure>\n\n\n\n<p>C\u00f4t\u00e9 serveur, la requ\u00eate SQL sera la suivante&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"108\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/injected-sql-query-1024x108.png\" alt=\"\" class=\"wp-image-9584\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/injected-sql-query-1024x108.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/injected-sql-query-300x32.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/injected-sql-query.png 1191w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Requ\u00eate SQL inject\u00e9e<\/figcaption><\/figure>\n\n\n\n<p>Le serveur mettra donc 5 secondes \u00e0 r\u00e9pondre, ce qui confirme l\u2019injection SQL.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-e3536a837bf78ac05684bacdfe3685a1\" id=\"impact-dune-sqli\" style=\"color:#c0b800\">Impact d\u2019une SQLi<\/h3>\n\n\n\n<p>L\u2019impact d\u2019une injection SQL est dans la plupart des cas, critique. En effet, si l\u2019utilisateur de la base de donn\u00e9es a assez de droits, comme c\u2019est souvent le cas, une SQLi permet \u00e0 un attaquant d\u2019exfiltrer l\u2019enti\u00e8ret\u00e9 de la base de donn\u00e9es de l\u2019application web et parfois m\u00eame de gagner le contr\u00f4le du serveur.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-14391c9cf9002af7e1f85d9d0d4857cc\" id=\"quels-sont-les-differents-types-de-sqli-et-comment-les-prevenir\" style=\"color:#c0b800\">Quels sont les diff\u00e9rents types de SQLi et comment les pr\u00e9venir&nbsp;?<\/h3>\n\n\n\n<p>Il existe plusieurs types d\u2019injections SQL. Cela d\u00e9pend du point d\u2019injection et de la technique utilis\u00e9e pour exploiter l\u2019injection. Ci-dessous, une liste non exhaustive des types de SQLi&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>UNION-based<\/li>\n\n\n\n<li>Boolean-based blind<\/li>\n\n\n\n<li>Error-based<\/li>\n\n\n\n<li>Stacked queries<\/li>\n\n\n\n<li>Time-based blind<\/li>\n<\/ul>\n\n\n\n<p>Le meilleur moyen de se prot\u00e9ger des injections SQL est d\u2019utiliser des \u00ab&nbsp;requ\u00eates param\u00e9tr\u00e9es&nbsp;\u00bb aussi appel\u00e9es \u00ab&nbsp;requ\u00eates pr\u00e9par\u00e9es&nbsp;\u00bb qui permettent de d\u00e9finir la structure de la requ\u00eate SQL avant d\u2019y incorporer les variables.<\/p>\n\n\n\n<p>Ainsi si une variable est contr\u00f4l\u00e9e par un attaquant, celui-ci ne pourra pas s\u2019injecter dans la requ\u00eate SQL, car sa structure aura d\u00e9j\u00e0 \u00e9t\u00e9 d\u00e9finie auparavant.<\/p>\n\n\n\n<p>Si vous souhaitez plus d&rsquo;informations et des cas concrets sur les injections SQL en g\u00e9n\u00e9ral, nous vous renvoyons vers notre article complet : <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/injections-sql-principes-impacts-exploitations-bonnes-pratiques-securite\/\" target=\"_blank\" rel=\"noopener\" title=\"\">Injections SQL (SQLi) : principes, impacts, exploitations et bonnes pratiques de s\u00e9curit\u00e9<\/a>. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"sqlmap-principes-et-fonctionnement\">Sqlmap : principes et fonctionnement<\/h2>\n\n\n\n<p>Bien qu\u2019il soit possible d\u2019exploiter une injection SQL et d\u2019exfiltrer le contenu d\u2019une base de donn\u00e9es \u00e0 la main, il est beaucoup plus simple et rapide d\u2019\u00e9crire et d\u2019utiliser un script.<\/p>\n\n\n\n<p>Encore mieux, si vous ne voulez pas r\u00e9inventer la roue et \u00eatre encore plus efficace, sqlmap sera l\u00e0 pour vous aider.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-76117f895983e38bc3c5474440f578d0\" id=\"cest-quoi-sqlmap\" style=\"color:#c0b800\">C\u2019est quoi Sqlmap ?<\/h3>\n\n\n\n<p>Sqlmap est un outil open source qui permet d\u2019automatiser la d\u00e9tection et l\u2019exploitation d\u2019injections SQL. C\u2019est un outil tr\u00e8s complet qui propose une multitude de fonctionnalit\u00e9s et d\u2019options permettant d\u2019aller jusqu\u2019\u00e0 la compromission du serveur SQL si les conditions le permettent.<\/p>\n\n\n\n<p><em>Avant d\u2019aller plus loin, il est important de noter que sqlmap g\u00e9n\u00e8re potentiellement beaucoup de trafic et que son utilisation est ill\u00e9gale sans une autorisation de la part du propri\u00e9taire du syst\u00e8me test\u00e9.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-bea22363c9a7989204564dd479c0ddff\" id=\"exploitation-dune-sqli-avec-sqlmap\" style=\"color:#c0b800\">Exploitation d&rsquo;une SQLi avec Sqlmap<\/h3>\n\n\n\n<p>Lors d\u2019un pentest, sqlmap est g\u00e9n\u00e9ralement utilis\u00e9 apr\u00e8s qu\u2019une SQLi ait \u00e9t\u00e9 identifi\u00e9e. Cela permet notamment de ne pas g\u00e9n\u00e9rer du trafic pour rien. Ensuite, plusieurs \u00e9tapes sont \u00e0 suivre pour exploiter l\u2019injection SQL de mani\u00e8re classique.<\/p>\n\n\n\n<p>Voyons cela \u00e9tape par \u00e9tape. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"trouver-une-payload-adaptee-au-type-de-sqli\">Trouver une payload adapt\u00e9e au type de SQLi<\/h4>\n\n\n\n<p>La premi\u00e8re \u00e9tape consiste \u00e0 trouver un payload adapt\u00e9 au type de SQLi et qui permettra d\u2019exfiltrer la base de donn\u00e9es dans les \u00e9tapes suivantes.<\/p>\n\n\n\n<p><strong>Commande : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"482\" height=\"79\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-to-find-payload.png\" alt=\"\" class=\"wp-image-9586\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-to-find-payload.png 482w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-to-find-payload-300x49.png 300w\" sizes=\"(max-width: 482px) 100vw, 482px\" \/><\/figure>\n\n\n\n<p>L\u2019option \u00ab&nbsp;<strong>-r&nbsp;\u00bb<\/strong> indique \u00e0 sqlmap le fichier contenant la requ\u00eate HTTP qui contient le point d\u2019injection. Si l\u2019endroit du point d\u2019injection est connu par l\u2019attaquant, comme c\u2019est le cas pour cet exemple, il est possible de le pr\u00e9ciser en ajoutant un ast\u00e9risque \u00e0 l\u2019endroit pr\u00e9cis o\u00f9 doit \u00eatre faite l\u2019injection SQL&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"320\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/req-txt-file-content-1024x320.png\" alt=\"\" class=\"wp-image-9588\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/req-txt-file-content-1024x320.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/req-txt-file-content-300x94.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/req-txt-file-content.png 1287w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Contenu du fichier req.txt<\/figcaption><\/figure>\n\n\n\n<p>Ici, l\u2019attaquant sait qu\u2019une injection SQL est possible dans la valeur du cookie \u00ab&nbsp;TrackingId&nbsp;\u00bb.<\/p>\n\n\n\n<p>\u00c0 noter qu\u2019il est \u00e9galement possible d\u2019utiliser l\u2019option \u00ab&nbsp;<strong>-u&nbsp;\u00bb<\/strong> \u00e0 la place pour pr\u00e9ciser une URL dans le cas o\u00f9 une injection SQL est possible dans un param\u00e8tre d\u2019URL.<\/p>\n\n\n\n<p><strong>R\u00e9sultat : <\/strong><\/p>\n\n\n\n<p>Apr\u00e8s avoir test\u00e9 plusieurs payloads, sqlmap a enfin trouv\u00e9 le type d\u2019injection SQL&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"521\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/payload-and-dbms-identification-1024x521.png\" alt=\"\" class=\"wp-image-9590\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/payload-and-dbms-identification-1024x521.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/payload-and-dbms-identification-300x153.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/payload-and-dbms-identification.png 1420w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Identification du payload et du DBMS<\/figcaption><\/figure>\n\n\n\n<p>Ici, le type de l\u2019injection SQL est une \u00ab&nbsp;stacked query time based-blind&nbsp;\u00bb, c\u2019est-\u00e0-dire qu\u2019il est possible d\u2019exfiltrer des donn\u00e9es en jouant avec des d\u00e9lais, car il est impossible d\u2019avoir directement le r\u00e9sultat de l\u2019injection SQL. \u00c9galement, l\u2019injection est faite avec une nouvelle requ\u00eate apr\u00e8s l\u2019originale d\u2019o\u00f9 le \u00ab&nbsp;stacked query&nbsp;\u00bb.<\/p>\n\n\n\n<p>Dans le m\u00eame temps, sqlmap a \u00e9galement identifi\u00e9 le syst\u00e8me de base de donn\u00e9es utilis\u00e9 qui est PostgreSQL. Gr\u00e2ce \u00e0 ces informations, sqlmap peut maintenant utiliser des payloads qui respectent le type de l\u2019injection et le syst\u00e8me de base de donn\u00e9es afin d\u2019exfiltrer des donn\u00e9es.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"exfiltrer-le-nom-des-bases-de-donnees\">Exfiltrer le nom des bases de donn\u00e9es<\/h4>\n\n\n\n<p>La deuxi\u00e8me \u00e9tape consiste \u00e0 exfiltrer le nom des bases de donn\u00e9es. Cette \u00e9tape peut d\u2019ailleurs \u00eatre faite en m\u00eame temps que la premi\u00e8re pour gagner du temps.<\/p>\n\n\n\n<p><strong>Commande : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"655\" height=\"78\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-database-enumeration.png\" alt=\"\" class=\"wp-image-9592\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-database-enumeration.png 655w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-database-enumeration-300x36.png 300w\" sizes=\"(max-width: 655px) 100vw, 655px\" \/><figcaption class=\"wp-element-caption\">Commande sqlmap pour \u00e9num\u00e9rer les bases de donn\u00e9es<\/figcaption><\/figure>\n\n\n\n<p>Pour \u00e9num\u00e9rer les bases de donn\u00e9es, on rajoute l\u2019option \u00ab&nbsp;<strong>&#8211;dbs<\/strong>&nbsp;\u00bb.<\/p>\n\n\n\n<p><strong>R\u00e9sultat : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"648\" height=\"125\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/database-list.png\" alt=\"\" class=\"wp-image-9594\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/database-list.png 648w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/database-list-300x58.png 300w\" sizes=\"(max-width: 648px) 100vw, 648px\" \/><figcaption class=\"wp-element-caption\">Liste des bases de donn\u00e9es<\/figcaption><\/figure>\n\n\n\n<p>Ici, une seule base de donn\u00e9es a \u00e9t\u00e9 trouv\u00e9e, la base de donn\u00e9es \u00ab&nbsp;public&nbsp;\u00bb.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"enumerer-le-nom-des-tables\">\u00c9num\u00e9rer le nom des tables<\/h4>\n\n\n\n<p>\u00c0 la troisi\u00e8me \u00e9tape, maintenant que l\u2019on conna\u00eet le nom de la base de donn\u00e9es, on peut \u00e9num\u00e9rer le nom des tables.<\/p>\n\n\n\n<p><strong>Commande : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"954\" height=\"65\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sql-command-tables-enumeration.png\" alt=\"\" class=\"wp-image-9596\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sql-command-tables-enumeration.png 954w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sql-command-tables-enumeration-300x20.png 300w\" sizes=\"(max-width: 954px) 100vw, 954px\" \/><figcaption class=\"wp-element-caption\">Commande sqlmap pour \u00e9num\u00e9rer les tables<\/figcaption><\/figure>\n\n\n\n<p>L\u2019option \u00ab&nbsp;<strong>-D<\/strong>&nbsp;\u00bb pr\u00e9cise le nom de la base de donn\u00e9es, ici \u00ab&nbsp;public&nbsp;\u00bb, et l\u2019option \u00ab&nbsp;<strong>&#8211;tables<\/strong>&nbsp;\u00bb est utilis\u00e9e pour \u00e9num\u00e9rer le nom des tables pr\u00e9sentes dans la base de donn\u00e9es \u00ab&nbsp;public&nbsp;\u00bb.<\/p>\n\n\n\n<p><strong>R\u00e9sultat : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"408\" height=\"280\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/tables-list.png\" alt=\"\" class=\"wp-image-9598\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/tables-list.png 408w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/tables-list-300x206.png 300w\" sizes=\"(max-width: 408px) 100vw, 408px\" \/><\/figure>\n\n\n\n<p>Deux tables ont \u00e9t\u00e9 trouv\u00e9es, \u00ab&nbsp;tracking&nbsp;\u00bb et \u00ab&nbsp;users&nbsp;\u00bb. La deuxi\u00e8me table semble int\u00e9ressante et peut contenir des donn\u00e9es li\u00e9es aux utilisateurs de la plateforme.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"choisir-une-table-interessante\">Choisir une table int\u00e9ressante<\/h4>\n\n\n\n<p>La quatri\u00e8me \u00e9tape consiste donc \u00e0 choisir une table int\u00e9ressante \u00e0 creuser. Pour cela, nous \u00e9num\u00e9rons ses colonnes.<\/p>\n\n\n\n<p><strong>Commande : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"53\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-columns-enumeration-1024x53.png\" alt=\"\" class=\"wp-image-9600\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-columns-enumeration-1024x53.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-columns-enumeration-300x16.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-columns-enumeration.png 1160w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Commande sqlmap pour \u00e9num\u00e9rer les colonnes<\/figcaption><\/figure>\n\n\n\n<p>L\u2019option \u00ab&nbsp;<strong>-T<\/strong>&nbsp;\u00bb est utilis\u00e9e pour sp\u00e9cifier la table \u00ab&nbsp;users&nbsp;\u00bb et l\u2019option \u00ab&nbsp;<strong>&#8211;columns<\/strong>&nbsp;\u00bb pour \u00e9num\u00e9rer le nom des colonnes.<\/p>\n\n\n\n<p><strong>R\u00e9sultat : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"467\" height=\"397\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/columns-list.png\" alt=\"\" class=\"wp-image-9602\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/columns-list.png 467w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/columns-list-300x255.png 300w\" sizes=\"(max-width: 467px) 100vw, 467px\" \/><figcaption class=\"wp-element-caption\">Liste des colonnes<\/figcaption><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"enumerer-les-donnees-de-la-table\">\u00c9num\u00e9rer les donn\u00e9es de la table<\/h4>\n\n\n\n<p>Pour la cinqui\u00e8me et derni\u00e8re \u00e9tape, maintenant que nous avons une vue d\u2019ensemble sur la table \u00ab&nbsp;users&nbsp;\u00bb, on peut choisir d\u2019\u00e9num\u00e9rer l\u2019enti\u00e8ret\u00e9 des donn\u00e9es de la table ou seulement les donn\u00e9es de certaines colonnes. Dans notre cas, nous \u00e9num\u00e9rons les donn\u00e9es des colonnes \u00ab&nbsp;username&nbsp;\u00bb et \u00ab&nbsp;password&nbsp;\u00bb.<\/p>\n\n\n\n<p><strong>Commande : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"40\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmqp-command-data-dump-1024x40.png\" alt=\"\" class=\"wp-image-9605\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmqp-command-data-dump-1024x40.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmqp-command-data-dump-300x12.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmqp-command-data-dump.png 1416w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Commande sqlmap pour exfiltrer les donn\u00e9es d&rsquo;une table<\/figcaption><\/figure>\n\n\n\n<p>Avec l\u2019option \u00ab&nbsp;<strong>-C<\/strong>&nbsp;\u00bb, on choisit nos colonnes s\u00e9par\u00e9es par une virgule. L\u2019option \u00ab&nbsp;<strong>&#8211;dump<\/strong>&nbsp;\u00bb est l\u00e0 pour exfiltrer les donn\u00e9es de la table.<\/p>\n\n\n\n<p><strong>R\u00e9sultat : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"907\" height=\"443\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/dumped-data-list.png\" alt=\"\" class=\"wp-image-9607\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/dumped-data-list.png 907w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/dumped-data-list-300x147.png 300w\" sizes=\"(max-width: 907px) 100vw, 907px\" \/><figcaption class=\"wp-element-caption\">Liste des donn\u00e9es exfiltr\u00e9es<\/figcaption><\/figure>\n\n\n\n<p>On a donc r\u00e9ussi \u00e0 exfiltrer le nom et le mot de passe de chaque utilisateur de la plateforme gr\u00e2ce \u00e0 sqlmap.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-d3a641d59a920c7ed9a420bdf497413a\" id=\"utiliser-sqlmap-pour-recuperer-des-informations-systeme\" style=\"color:#c0b800\">Utiliser Sqlmap pour r\u00e9cup\u00e9rer des informations syst\u00e8me <\/h3>\n\n\n\n<p>Pour aller plus loin et \u00e9tablir une meilleure compr\u00e9hension de l\u2019environnement attaqu\u00e9, il est toujours int\u00e9ressant de r\u00e9cup\u00e9rer les informations li\u00e9es au syst\u00e8me de bases de donn\u00e9es. Avec sqlmap, on peut donc r\u00e9cup\u00e9rer&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>L\u2019utilisateur syst\u00e8me qui utilise actuellement la base de donn\u00e9es<\/li>\n\n\n\n<li>Si l\u2019utilisateur syst\u00e8me actuel a le r\u00f4le de DBA (Data Base Administrator) ou non<\/li>\n\n\n\n<li>Le nom d\u2019h\u00f4te<\/li>\n\n\n\n<li>Tous les utilisateurs syst\u00e8me de la base de donn\u00e9es<\/li>\n\n\n\n<li>Les privil\u00e8ges de tous les utilisateurs syst\u00e8mes<\/li>\n<\/ul>\n\n\n\n<p>Ci-dessous, les commandes permettant de r\u00e9cup\u00e9rer ces informations et leurs r\u00e9sultats&nbsp;:<\/p>\n\n\n\n<p><strong>Utilisateur syst\u00e8me qui utilise actuellement la base de donn\u00e9es<\/strong><\/p>\n\n\n\n<p><strong>Commande : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"779\" height=\"65\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-current-user.png\" alt=\"\" class=\"wp-image-9624\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-current-user.png 779w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-current-user-300x25.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-current-user-770x65.png 770w\" sizes=\"(max-width: 779px) 100vw, 779px\" \/><\/figure>\n\n\n\n<p><strong>R\u00e9sultat : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"595\" height=\"73\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/finding-user-sqlmap.png\" alt=\"\" class=\"wp-image-9627\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/finding-user-sqlmap.png 595w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/finding-user-sqlmap-300x37.png 300w\" sizes=\"(max-width: 595px) 100vw, 595px\" \/><\/figure>\n\n\n\n<p><strong>Est-ce que l\u2019utilisateur syst\u00e8me actuel est DBA&nbsp;?<\/strong><\/p>\n\n\n\n<p><strong>Commande : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"673\" height=\"62\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-dba.png\" alt=\"\" class=\"wp-image-9629\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-dba.png 673w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-dba-300x28.png 300w\" sizes=\"(max-width: 673px) 100vw, 673px\" \/><\/figure>\n\n\n\n<p><strong>R\u00e9sultat : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"632\" height=\"57\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/finding-dba-sqlmap.png\" alt=\"\" class=\"wp-image-9631\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/finding-dba-sqlmap.png 632w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/finding-dba-sqlmap-300x27.png 300w\" sizes=\"(max-width: 632px) 100vw, 632px\" \/><\/figure>\n\n\n\n<p><strong>Nom d\u2019h\u00f4te<\/strong><\/p>\n\n\n\n<p><strong>Commande :<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"737\" height=\"69\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-hostname.png\" alt=\"\" class=\"wp-image-9633\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-hostname.png 737w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-hostname-300x28.png 300w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/figure>\n\n\n\n<p><strong>R\u00e9sultat : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"664\" height=\"65\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/finding-hostname-sqlmap.png\" alt=\"\" class=\"wp-image-9635\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/finding-hostname-sqlmap.png 664w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/finding-hostname-sqlmap-300x29.png 300w\" sizes=\"(max-width: 664px) 100vw, 664px\" \/><\/figure>\n\n\n\n<p><strong>Liste des utilisateurs syst\u00e8me de la base de donn\u00e9es<\/strong><\/p>\n\n\n\n<p><strong>Commande : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"623\" height=\"64\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-users.png\" alt=\"\" class=\"wp-image-9637\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-users.png 623w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-users-300x31.png 300w\" sizes=\"(max-width: 623px) 100vw, 623px\" \/><\/figure>\n\n\n\n<p><strong>R\u00e9sultat : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"845\" height=\"111\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/finding-users-sqlmap.png\" alt=\"\" class=\"wp-image-9639\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/finding-users-sqlmap.png 845w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/finding-users-sqlmap-300x39.png 300w\" sizes=\"(max-width: 845px) 100vw, 845px\" \/><\/figure>\n\n\n\n<p><strong>Privil\u00e8ges des utilisateurs syst\u00e8mes de la base de donn\u00e9es<\/strong><\/p>\n\n\n\n<p><strong>Commande : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"791\" height=\"65\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-privileges.png\" alt=\"\" class=\"wp-image-9641\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-privileges.png 791w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-command-privileges-300x25.png 300w\" sizes=\"(max-width: 791px) 100vw, 791px\" \/><\/figure>\n\n\n\n<p><strong>R\u00e9sultat : <\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"148\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/finding-privileges-sqlmap-1024x148.png\" alt=\"\" class=\"wp-image-9643\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/finding-privileges-sqlmap-1024x148.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/finding-privileges-sqlmap-300x43.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/finding-privileges-sqlmap.png 1109w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><a href=\"https:\/\/portswigger.net\/web-security\/sql-injection\" target=\"_blank\" rel=\"noopener\" title=\"\">R\u00e9f\u00e9rences des labs sur Portswigger <\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-49d65072fed99f56ef83f3941ead8873\" id=\"exploitation-de-blinds-sqli-avec-sqlmap\" style=\"color:#c0b800\">Exploitation de blinds SQLi avec Sqlmap<\/h3>\n\n\n\n<p>Souvent, le r\u00e9sultat de l\u2019injection SQL n\u2019est pas retourn\u00e9 en r\u00e9ponse, c\u2019est le cas des blinds SQLi. Mais alors, comment sqlmap se d\u00e9brouille pour exfiltrer les donn\u00e9es&nbsp;?<\/p>\n\n\n\n<p>Si une injection SQL est de type blind, il faut trouver une condition qui renvoie une r\u00e9ponse serveur diff\u00e9rente en fonction de si elle est vraie ou fausse. Par exemple dans le cas d\u2019une SQLi blind bool\u00e9enne, le serveur r\u00e9pondra d\u2019une mani\u00e8re diff\u00e9rente si une condition bool\u00e9enne dans la requ\u00eate inject\u00e9e est fausse&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"159\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/boolean-sql-query-1024x159.png\" alt=\"\" class=\"wp-image-9613\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/boolean-sql-query-1024x159.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/boolean-sql-query-300x47.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/boolean-sql-query.png 1398w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Requ\u00eate SQL avec condition bool\u00e9enne<\/figcaption><\/figure>\n\n\n\n<p>Si le serveur r\u00e9pond bien de mani\u00e8re diff\u00e9rente, il est possible d\u2019exploiter cela et de r\u00e9cup\u00e9rer caract\u00e8re par caract\u00e8re d\u2019abord le nom des bases de donn\u00e9es, ensuite des tables, puis des colonnes et enfin les donn\u00e9es.<\/p>\n\n\n\n<p>Ainsi, avec l\u2019injection suivante par exemple, si nous gardons notre exemple d\u2019injection dans l\u2019ID du produit, on pourra savoir si le premier caract\u00e8re du mot de passe de l\u2019utilisateur \u00ab&nbsp;administrator&nbsp;\u00bb de la colonne \u00ab&nbsp;password&nbsp;\u00bb de la table \u00ab&nbsp;users&nbsp;\u00bb est \u00e9gal \u00e0 \u00ab&nbsp;5&nbsp;\u00bb ou non&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"67\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/boolean-based-blind-sqli-1024x67.png\" alt=\"\" class=\"wp-image-9616\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/boolean-based-blind-sqli-1024x67.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/boolean-based-blind-sqli-300x20.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/boolean-based-blind-sqli.png 1415w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Boolean-based blind SQLi<\/figcaption><\/figure>\n\n\n\n<p>La requ\u00eate compl\u00e8te c\u00f4t\u00e9 serveur sera donc&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"30\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/injected-sql-query-2-1024x30.png\" alt=\"\" class=\"wp-image-9619\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/injected-sql-query-2-1024x30.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/injected-sql-query-2-300x9.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/injected-sql-query-2.png 1418w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Le mot de passe commen\u00e7ant bien par \u00ab&nbsp;5&nbsp;\u00bb, le serveur nous r\u00e9pond diff\u00e9remment contrairement \u00e0 si nous avions mis un autre chiffre ou une lettre \u00e0 la place.<\/p>\n\n\n\n<p>On peut passer aux caract\u00e8res suivants en incr\u00e9mentant le deuxi\u00e8me param\u00e8tre de la fonction SQL SUBSTRING(). \u00c0 noter que cette m\u00e9thode fonctionne, car nous savons que le syst\u00e8me de base de donn\u00e9es est PostgreSQL et que le type de SQLi est une boolean-based blind.<\/p>\n\n\n\n<p>Ce processus peut \u00eatre automatis\u00e9 en cr\u00e9ant un script, ce qui est une tr\u00e8s bonne id\u00e9e pour apprendre \u00e0 exploiter des injections SQL, sinon il est possible d\u2019utiliser sqlmap.<\/p>\n\n\n\n<p>La puissance de sqlmap r\u00e9side donc dans l\u2019automatisation et la prise en compte de la majorit\u00e9 des cas en termes d\u2019injection SQL. L\u2019outil sqlmap est tr\u00e8s complet et est utile pour exploiter bien d\u2019autres types d\u2019injection SQL et pas seulement des blinds. Dans la partie suivante, nous pr\u00e9senterons quelques-unes des nombreuses options \u00ab&nbsp;avanc\u00e9es&nbsp;\u00bb de sqlmap et nous verrons \u00e9galement la notion de \u00ab&nbsp;tampers&nbsp;\u00bb.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-e7ee6a2eb2f1db95bbdd1068db69d7de\" id=\"options-avancees-de-sqlmap\" style=\"color:#c0b800\">Options avanc\u00e9es de Sqlmap<\/h3>\n\n\n\n<p>Ce n\u2019est pas exag\u00e9r\u00e9 de dire que sqlmap est un outil complet en termes de SQLi. Essayez d\u2019afficher l\u2019aide compl\u00e8te avec l\u2019option \u00ab&nbsp;-hh&nbsp;\u00bb et vous aurez d\u00e9j\u00e0 une id\u00e9e de la puissance de cet outil. <\/p>\n\n\n\n<p>Dans cette partie, nous listons certaines options qui peuvent \u00eatre pratiques lors d\u2019un pentest, mais ne vous y limitez pas, je vous conseille fortement d\u2019explorer par vous-m\u00eames les nombreuses nuances de cet outil.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"proxy\">&#8211;proxy=<\/h4>\n\n\n\n<p>Pour comprendre ce qu\u2019envoie exactement sqlmap, il est possible de visualiser chaque requ\u00eate envoy\u00e9e et leur r\u00e9ponse en sp\u00e9cifiant un proxy. On peut par exemple faire passer tout le trafic g\u00e9n\u00e9r\u00e9 par sqlmap \u00e0 travers l\u2019outil <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/introduction-burp-outil-dedie-securite-plateformes-web\/\" target=\"_blank\" rel=\"noopener\" title=\"\">Burp Suite<\/a>. <\/p>\n\n\n\n<p>Cela peut notamment permettre de comprendre et de r\u00e9soudre les cas o\u00f9 sqlmap ne fonctionne pas comme pr\u00e9vu en voyant directement comment le serveur r\u00e9pond par rapport aux requ\u00eates envoy\u00e9es par sqlmap.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"delay\">&#8211;delay=<\/h4>\n\n\n\n<p>Il arrive parfois qu\u2019un <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/quest-ce-que-le-rate-limiting-fonctionnement-et-techniques-dimplementation\/\" target=\"_blank\" rel=\"noopener\" title=\"\">rate limiting<\/a> soit impl\u00e9ment\u00e9 sur certaines applications web. <\/p>\n\n\n\n<p>Ainsi, le fort trafic g\u00e9n\u00e9r\u00e9 par sqlmap peut activer des alertes sur le serveur qui bloquera toutes nouvelles requ\u00eates de notre part. Pour rem\u00e9dier \u00e0 ce probl\u00e8me, on peut utiliser l\u2019option \u00ab&nbsp;&#8211;delay&nbsp;\u00bb qui pr\u00e9cisera un d\u00e9lai en seconde entre chaque requ\u00eate envoy\u00e9e par sqlmap. <\/p>\n\n\n\n<p>En jouant avec ce d\u00e9lai on peut potentiellement contourner le rate limiting, mais l\u2019exfiltration des donn\u00e9es sera donc plus longue.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"force-ssl\">&#8211;force-ssl<\/h4>\n\n\n\n<p>Lorsque le serveur n\u2019accepte pas l\u2019usage du protocole HTTP et que vous sp\u00e9cifiez un fichier de requ\u00eate avec l\u2019option \u00ab&nbsp;-r&nbsp;\u00bb, l\u2019option \u00ab&nbsp;&#8211;force-ssl&nbsp;\u00bb permet de forcer l\u2019usage du HTTPS sur les requ\u00eates envoy\u00e9es. <\/p>\n\n\n\n<p>C\u2019est une option toute simple, mais importante \u00e0 ajouter dans votre commande pour une exfiltration des donn\u00e9es de mani\u00e8re s\u00e9curis\u00e9e.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"threads\">&#8211;threads=<\/h4>\n\n\n\n<p>Si vous savez que le serveur est capable d\u2019assumer un fort trafic, il est int\u00e9ressant d\u2019augmenter le nombre de threads dans votre commande sqlmap pour r\u00e9cup\u00e9rer les donn\u00e9es plus rapidement. Attention donc \u00e0 ne pas en abuser au risque de faire crasher le serveur SQL.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"dbms\">&#8211;dbms=<\/h4>\n\n\n\n<p>Pour des raisons d\u2019optimisation, si vous connaissez le syst\u00e8me de base de donn\u00e9es utilis\u00e9 par le serveur SQL, il est possible de le pr\u00e9ciser \u00e0 sqlmap. Cela diminue le temps de d\u00e9tection du type de SQLi, car sqlmap ne testera que les payloads en lien avec le DBMS pr\u00e9cis\u00e9.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"level\">&#8211;level=<\/h4>\n\n\n\n<p>L\u2019option \u00ab&nbsp;&#8211;level&nbsp;\u00bb permet de pr\u00e9ciser \u00e0 sqlmap l\u2019exhaustivit\u00e9 des tests \u00e0 effectuer. La valeur est de 1 \u00e0 5 et par d\u00e9faut elle est \u00e0 1. Plus la valeur augmente, plus le nombre de payloads test\u00e9s sera grand. <\/p>\n\n\n\n<p>C\u2019est une option pratique pour des cas complexes d\u2019injection SQL. Si sqlmap ne trouve pas de payload d\u2019injection la premi\u00e8re fois, il est int\u00e9ressant d\u2019incr\u00e9menter la valeur de cette option.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"risk\">&#8211;risk=<\/h4>\n\n\n\n<p>Un peu \u00e0 la mani\u00e8re de l\u2019option pr\u00e9c\u00e9dente, l\u2019option \u00ab&nbsp;&#8211;risk&nbsp;\u00bb permet de pr\u00e9ciser un niveau de risque accept\u00e9 de 1 \u00e0 3. Plus la valeur de cette option est grande, plus les payloads inject\u00e9es par sqlmap sont nombreux, mais \u00e9galement risqu\u00e9s. <\/p>\n\n\n\n<p>En fonction de l\u2019endroit de l\u2019injection dans la requ\u00eate SQL originale, augmenter le risque peut amener \u00e0 des modifications de donn\u00e9es non voulues. Par d\u00e9faut, cette valeur est \u00e0 1.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"string\">&#8211;string=<\/h4>\n\n\n\n<p>Dans les cas des injections SQL boolean-based, il est possible de pr\u00e9ciser \u00e0 sqlmap une cha\u00eene de caract\u00e8re \u00e0 chercher dans la r\u00e9ponse serveur si la condition inject\u00e9e est vraie. <\/p>\n\n\n\n<p>Comme nous l\u2019avons pu voir pr\u00e9c\u00e9demment, dans le cas d\u2019une boolean-based blind, la r\u00e9ponse serveur est diff\u00e9rente si la condition inject\u00e9e est vraie ou fausse. Si elle est vraie, la diff\u00e9rence peut se jouer \u00e0 une simple chaine de caract\u00e8re dans la r\u00e9ponse serveur, d\u2019o\u00f9 l\u2019int\u00e9r\u00eat de la pr\u00e9ciser \u00e0 sqlmap.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"technique\">&#8211;technique=<\/h4>\n\n\n\n<p>Il est possible de pr\u00e9ciser \u00e0 sqlmap le type des payloads \u00e0 tester et leur ordre. Une injection SQL peut \u00eatre de plusieurs types diff\u00e9rents et peut par exemple en m\u00eame temps \u00eatre une boolean-based blind et une time-based blind. Cependant, un payload boolean-based blind sera plus rapide \u00e0 exploiter qu\u2019un payload time-based blind. Avec l\u2019option \u00ab&nbsp;&#8211;technique&nbsp;\u00bb on peut imposer \u00e0 sqlmap le type de SQLi \u00e0 chercher et trouver. Ci-dessous, la valeur que peut prendre l\u2019option et sa signification&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>B : Boolean-based blind<\/li>\n\n\n\n<li>E : Error-based<\/li>\n\n\n\n<li>U : Union query-based<\/li>\n\n\n\n<li>S : Stacked queries<\/li>\n\n\n\n<li>T : Time-based blind<\/li>\n\n\n\n<li>Q : Inline queries<\/li>\n<\/ul>\n\n\n\n<p>On peut choisir de ne mettre qu\u2019une valeur ou de toute les mettre dans un ordre pr\u00e9cis que suivra sqlmap. Par d\u00e9faut, l\u2019ordre est le suivant&nbsp;: BEUSTQ.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"file-read\">&#8211;file-read=<\/h4>\n\n\n\n<p>Sur certains syst\u00e8mes de base de donn\u00e9es, comme MySQL, PostgreSQL ou Microsoft SQL Server, il arrive parfois que l\u2019utilisateur de la base de donn\u00e9es ait les droits suffisant pour lire des fichiers sur le syst\u00e8me. Ainsi, avec l\u2019option \u00ab&nbsp;&#8211;file-read&nbsp;\u00bb on peut sp\u00e9cifier le chemin du fichier \u00e0 r\u00e9cup\u00e9rer.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"os-cmd\">&#8211;os-cmd=<\/h4>\n\n\n\n<p>Comme pour l\u2019option pr\u00e9c\u00e9dente, l\u2019option \u00ab&nbsp;&#8211;os-cmd&nbsp;\u00bb permet d\u2019ex\u00e9cuter une commande sur le serveur SQL. Cette option n\u2019est fonctionnelle que sur les DBMS MySQL, PostgreSQL ou Microsoft SQL Server et l\u2019utilisateur de la base de donn\u00e9es doit avoir les droits suffisants.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"flush-session\">&#8211;flush-session<\/h4>\n\n\n\n<p>Par d\u00e9faut, lorsque vous utilisez sqlmap sur une cible, celui-ci cr\u00e9e une session relative \u00e0 la cible qu\u2019il gardera en m\u00e9moire sur votre machine. <\/p>\n\n\n\n<p>Ainsi, si vous fournissez \u00e0 sqlmap la m\u00eame requ\u00eate, il pourra tout de suite continuer l\u2019exploitation de la SQLi, car il aura toutes les informations n\u00e9cessaires d\u00e9j\u00e0 en m\u00e9moire (payload, structure de la base de donn\u00e9es d\u00e9j\u00e0 trouv\u00e9es, etc.) et il n\u2019aura pas besoin de recommencer depuis le d\u00e9but. <\/p>\n\n\n\n<p>Si vous voulez au contraire que sqlmap recommence \u00e0 z\u00e9ro sur votre cible, utilisez une fois cette option pour supprimer la session sauvegard\u00e9e.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"tamper\">&#8211;tamper=<\/h4>\n\n\n\n<p>Cette option permet d\u2019\u00e9tendre la flexibilit\u00e9 de sqlmap. Gr\u00e2ce \u00e0 cette option, il est possible de pr\u00e9ciser un ou plusieurs scripts, qui modifient le payload avant d\u2019\u00eatre envoy\u00e9 \u00e0 la cible. <\/p>\n\n\n\n<p>Dans la partie suivante, nous d\u00e9velopperons la notion des scripts tampers et verrons quelques cas concrets. <\/p>\n\n\n\n<p>Pour plus d\u2019informations sur toutes les options de sqlmap, je vous redirige vers le <a href=\"https:\/\/github.com\/sqlmapproject\/sqlmap\/wiki\/Usage\" target=\"_blank\" rel=\"noopener\" title=\"\">wiki<\/a>. <\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-f8bcf0b0839f562967a585c89699e3d1\" id=\"les-scripts-tampers-sqlmap\" style=\"color:#c0b800\">Scripts tampers sqlmap<\/h3>\n\n\n\n<p>Les scripts tampers sont des scripts permettant de modifier les payloads envoy\u00e9s par sqlmap afin de contourner certains filtres applicatifs ou WAF mis en place par l\u2019application test\u00e9e. Par exemple, une application web pourrait tr\u00e8s bien interdire l\u2019utilisation d\u2019espaces sur une entr\u00e9e utilisateur.<\/p>\n\n\n\n<p>L\u2019auditeur ayant identifi\u00e9 une injection SQL dans cette m\u00eame entr\u00e9e, il lui faudra trouver un moyen de contourner ce filtre afin d\u2019exploiter l\u2019injection SQL. C\u2019est pour ce genre de cas que les scripts tampers peuvent \u00eatre utilis\u00e9s. Il existe des scripts d\u00e9j\u00e0 impl\u00e9ment\u00e9s par sqlmap que l\u2019utilisateur peut utiliser, mais il est tout \u00e0 fait possible d\u2019en cr\u00e9er, soit m\u00eame, pour des situations uniques. &nbsp;<\/p>\n\n\n\n<p>Pour lister les scripts tampers d\u00e9j\u00e0 impl\u00e9ment\u00e9s par sqlmap, on peut utiliser la commande suivante&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"577\" height=\"65\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-tampers-list.png\" alt=\"\" class=\"wp-image-9621\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-tampers-list.png 577w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/05\/sqlmap-tampers-list-300x34.png 300w\" sizes=\"(max-width: 577px) 100vw, 577px\" \/><figcaption class=\"wp-element-caption\">Commande pour lister les scripts tampers<\/figcaption><\/figure>\n\n\n\n<p>Parmi la soixantaine de tampers d\u00e9j\u00e0 disponible, on peut en citer quelques-uns :<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"space2comment-py\">space2comment.py<\/h4>\n\n\n\n<p>Ce script permet de remplacer tous les espaces dans un payload par des commentaires du type \u00ab&nbsp;\/**\/&nbsp;\u00bb. Ainsi en ouvrant et en fermant tout de suite un commentaire, cela est interpr\u00e9t\u00e9 comme un espace par certains syst\u00e8mes de base de donn\u00e9es. <\/p>\n\n\n\n<p>Ce script permet donc de contourner de simples filtres \u00ab&nbsp;anti-SQLi&nbsp;\u00bb impl\u00e9ment\u00e9s par certaines applications web qui bloqueraient uniquement les entr\u00e9es utilisateurs contenant des espaces.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"randomcase-py\">randomcase.py<\/h4>\n\n\n\n<p>Le script \u00ab&nbsp;randomcase.py&nbsp;\u00bb permet de changer la casse de tous les mots cl\u00e9s SQL comme \u00ab&nbsp;SELECT&nbsp;\u00bb, \u00ab&nbsp;WHERE&nbsp;\u00bb, etc. Ainsi, \u00ab&nbsp;SELECT&nbsp;\u00bb peut devenir \u00ab&nbsp;SelEcT&nbsp;\u00bb. Certains filtres applicatifs ou WAF contr\u00f4lent qu\u2019il n\u2019y ait aucun mot cl\u00e9 SQL dans les entr\u00e9es utilisateurs pour se prot\u00e9ger des injections SQL. Cependant, si ce filtre est mal impl\u00e9ment\u00e9, le fait de changer la casse peut potentiellement contourner la protection.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"equaltolike-py\">equaltolike.py<\/h4>\n\n\n\n<p>Ce script change tous les signes \u00ab&nbsp;=&nbsp;\u00bb d\u2019un payload avec l\u2019\u00e9quivalent \u00ab&nbsp;LIKE&nbsp;\u00bb pour contourner les filtres applicatifs qui emp\u00eachent l\u2019utilisation du signe \u00e9gal dans les entr\u00e9es utilisateur.<\/p>\n\n\n\n<p>Il est important de noter que ces scripts peuvent \u00eatre utilis\u00e9s en m\u00eame temps afin de contourner plusieurs filtres \u00e0 la fois.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h2>\n\n\n\n<p>Sqlmap est donc un outil incontournable pour toute personne voulant d\u00e9tecter et exploiter une injection SQL. Il met \u00e0 disposition un \u00e9ventail de fonctionnalit\u00e9s pouvant r\u00e9pondre tant \u00e0 des besoins basiques qu\u2019\u00e0 des besoins plus avanc\u00e9s. Toutes ces qualit\u00e9s en font un outil puissant, essentiel pour le m\u00e9tier de pentester.<\/p>\n\n\n\n<p><strong>Auteur : Lorenzo CARTE &#8211; Pentester @Vaadata<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"","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-9462","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\/9462","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=9462"}],"version-history":[{"count":21,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/9462\/revisions"}],"predecessor-version":[{"id":9736,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/9462\/revisions\/9736"}],"wp:attachment":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=9462"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=9462"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=9462"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}