A propos Skills
Interactive Sandbox Web3 Engineering Security Lab Engineering Infrastructure Portfolio Audit Publications Changelog Veille Techno CTF Writeups Uses / Setup Blog Stats Now
Projets Parcours Contact
Retour au portfolio
Lab actif

Security Lab

Exploration offensive & recherche en cybersécurité. Je documente mes recherches, challenges CTF et analyses techniques pour améliorer mes compétences en sécurité offensive.

Domaine Offensive Security
Outils Burp Suite, Nmap, Wireshark, SQLMap
Niveau CTF & Audit
Approche Problème → Analyse → Patch
0
Challenges CTF
0
Audits OWASP
0
Vulns patchées
0
Smart Contract Audits

Challenges & Write-ups

Web

Challenge Type Niveau Compétences
SQL Injection - Auth Bypass SQLi Facile Injection SQL, Contournement auth, UNION-based
XSS - Stored XSS Moyen DOM manipulation, Cookie stealing, CSP bypass
SSRF - Cloud Metadata SSRF Difficile Server-Side Request Forgery, Cloud pivoting, DNS rebinding
IDOR - User Profile IDOR Facile Broken Access Control, API enum, Horizontal privesc
JWT - Weak Secret & Algorithm Confusion JWT Moyen Token forgery, HMAC cracking, alg:none bypass
CSP Bypass - Inline Script CSP Difficile Content-Security-Policy, Nonce leak, Script gadgets
File Upload - Webshell Upload Difficile Double extension, Null byte, Content-Type spoof

Reverse / Bash VM

Challenge Type Niveau Compétences
Bash - VM Privilege Escalation System Moyen SUID exploitation, sudo misconfiguration, PATH hijacking
Bytecode Analysis - Custom VM Reverse Difficile Analyse bytecode, Réimplémentation Python, Instruction set
JS Deobfuscation - Packer Reverse Moyen Déobfuscation, AST analysis, Eval unpacking
ELF - Debugger Custom Reverse Difficile ptrace, Breakpoints, Register manipulation, ELF parsing
bytecode_vm.py — Custom VM Interpreter
1# Réimplémentation Python du bytecode custom
2def execute(bytecode, memory):
3 pointer = 0
4 stack = []
5 while pointer < len(bytecode):
6 opcode = bytecode[pointer]
7 if opcode == 0x01: # PUSH
8 stack.append(bytecode[pointer + 1])
9 pointer += 2
10 elif opcode == 0x02: # ADD
11 a, b = stack.pop(), stack.pop()
12 stack.append(a + b)
13 pointer += 1
14 elif opcode == 0x03: # STORE
15 addr = bytecode[pointer + 1]
16 memory[addr] = stack.pop()
17 pointer += 2
18 elif opcode == 0xFF: # HALT
19 break
20 return memory

Analyse technique détaillée

SQL Injection — Auth Bypass

Facile
Problème

Formulaire de login sans validation côté serveur. L'input utilisateur est concaténé directement dans la requête SQL.

Analyse

Interception avec Burp Suite. Le paramètre password est injecté dans une requête WHERE sans échappement. Pas de WAF détecté. Pas de prepared statements.

Méthode

Payload : ' OR 1=1 -- dans le champ password. La condition OR 1=1 rend la clause WHERE toujours vraie, le -- commente le reste de la requête.

Résultat

Accès admin obtenu. Extraction de la table users complète via UNION-based injection en 3 requêtes.

Leçon retenue

Toujours utiliser des prepared statements. Jamais de concaténation de strings dans les requêtes SQL. Implémenter un WAF en couche supplémentaire.

Bytecode Analysis — Custom VM

Difficile
Problème

Binaire inconnu qui exécute un bytecode custom. Pas de symboles, pas de documentation. Le flag est caché dans la mémoire après exécution.

Analyse

Reverse engineering avec Ghidra. Identification de 8 opcodes (PUSH, ADD, SUB, XOR, STORE, LOAD, JMP, HALT). Chaque instruction fait 1-3 bytes.

Méthode

Réimplémentation complète de la VM en Python. Exécution pas-à-pas du bytecode avec dump mémoire après chaque instruction pour tracer le déchiffrement du flag.

Résultat

Flag extrait après déchiffrement XOR en 3 passes. La clé était dérivée des 4 premiers bytes du bytecode lui-même.

Leçon retenue

La réimplémentation d'un interpréteur donne un contrôle total sur l'exécution. Toujours instrumenter avant de bruteforce.

JWT — Algorithm Confusion & Weak Secret

Moyen
Problème

Application avec authentification JWT. Le token est signé en HS256 mais le serveur accepte aussi alg: none.

Analyse

Décodage du token avec jwt.io. Header modifiable. Le secret est faible (4 caractères). Le serveur ne valide pas l'algorithme de manière stricte.

Méthode

Double approche : 1) Cracking du secret HMAC avec hashcat + rockyou.txt en 12 secondes. 2) Forge d'un token avec alg: none et payload admin.

Résultat

Escalade de privilèges : user → admin. Accès complet au panel d'administration.

Leçon retenue

Forcer l'algorithme côté serveur (whitelist). Secret ≥ 256 bits. Implémenter une expiration courte + refresh token rotation.

OWASP Top 10 — Mini Audit

A01 — Broken Access Control
IDOR, escalade de privilèges, manipulation de rôles, bypass d'autorisation via tampering de requêtes.
Vérifié
A02 — Cryptographic Failures
Stockage de mots de passe (bcrypt vs MD5), certificats TLS, algorithmes obsolètes, key management.
Vérifié
A03 — Injection
SQL, NoSQL, OS command, LDAP injection. Validation côté serveur, parameterized queries, input sanitization.
Vérifié
A07 — Auth Failures
Brute force, session fixation, credential stuffing, JWT weaknesses, absence de MFA.
Vérifié
A09 — Security Logging
Couverture des événements critiques, détection d'intrusion, alerting temps réel, log tamper protection.
En cours
A05 — Security Misconfiguration
Headers HTTP, CORS policy, ports ouverts, services par défaut, server hardening, debug mode en prod.
En cours

Vulnérabilité & Correction

SQL Injection — Requêtes paramétrées

vulnerable.py VULNÉRABLE
1# Requête SQL par concaténation
2def login(username, password):
3 query = "SELECT * FROM users"
4 query += " WHERE user='" + username
5 query += "' AND pass='" + password + "'"
6 cursor.execute(query)
7 return cursor.fetchone()
secure.py CORRIGÉ
1# Prepared statement
2def login(username, password):
3 query = "SELECT * FROM users"
4 query += " WHERE user = %s AND pass = %s"
5 cursor.execute(query, (username, password))
6 return cursor.fetchone()

XSS Stored — Échappement HTML

vulnerable.js VULNÉRABLE
1// Input injecté dans le DOM
2function addComment(text) {
3 const div = document.createElement('div');
4 div.innerHTML = text; // XSS!
5 comments.appendChild(div);
6}
secure.js CORRIGÉ
1// textContent pour l'échappement
2function addComment(text) {
3 const div = document.createElement('div');
4 div.textContent = text; // Safe
5 comments.appendChild(div);
6}

Broken Auth — JWT avec expiration & refresh

vulnerable-auth.js VULNÉRABLE
1// JWT sans expiration ni rotation
2const token = jwt.sign(
3 { userId: user.id, role: user.role },
4 'secret123'
5 // Pas d'expiration !
6);
secure-auth.js CORRIGÉ
1// JWT + expiration + refresh
2const accessToken = jwt.sign(
3 { userId: user.id, role: user.role },
4 process.env.JWT_SECRET,
5 { expiresIn: '15m' }
6);
7const refreshToken = jwt.sign(
8 { userId: user.id },
9 process.env.REFRESH_SECRET,
10 { expiresIn: '7d' }
11);

Sécurité des Smart Contracts

La cybersécurité appliquée aux smart contracts combine analyse de code, architecture système et compréhension des mécanismes DeFi. Voici les vulnérabilités que j'étudie et audite.

Reentrancy

Appels récursifs externes avant mise à jour d'état. Pattern checks-effects-interactions et ReentrancyGuard d'OpenZeppelin.

Critical

Integer Overflow

Dépassement arithmétique avant Solidity 0.8. SafeMath, checked arithmetic, et audit des calculs de tokens.

High

Access Control Flaws

Fonctions admin non protégées, modifier manquants, initializers non sécurisés sur les proxies.

Critical

Oracle Manipulation

Manipulation de prix via flash loans. Oracles décentralisés (Chainlink), TWAP, et validation multi-sources.

High

Upgradeable Proxy Risks

Storage collisions, uninitialized implementations, function selector clashes entre proxy et implementation.

Medium

Front-Running & MEV

Transaction ordering exploitation, sandwich attacks, commit-reveal schemes et private mempools.

Medium

Reentrancy — checks-effects-interactions

Vulnerable.sol VULNÉRABLE
1// Appel externe avant mise à jour
2function withdraw() public {
3 uint bal = balances[msg.sender];
4 (bool ok, ) = msg.sender.call
5 {value: bal}("");
6 require(ok);
7 balances[msg.sender] = 0; // Trop tard!
8}
Secure.sol CORRIGÉ
1// Checks-Effects-Interactions
2function withdraw() public
3 nonReentrant {
4 uint bal = balances[msg.sender];
5 require(bal > 0);
6 balances[msg.sender] = 0; // Avant!
7 (bool ok, ) = msg.sender.call
8 {value: bal}("");
9 require(ok);
10}

Rapport de Pentest (anonymisé)

Rapport d'Audit de Sécurité

Client : [CONFIDENTIEL] — Date : Janvier 2026

Confidentiel

Scope

scope.txt
$ cat scope.txt
Cible : Application web e-commerce
Périmètre : Front-end, API REST, Base de données
Méthode : Black-box → Grey-box
Durée : 5 jours ouvrés
Outils : Burp Suite Pro, Nmap, SQLMap, Nikto

Findings

Critical
SQL Injection sur /api/products

Le paramètre id est injectable. Extraction complète de la base via UNION-based injection.

High
Stored XSS dans les avis produits

Le champ commentaire accepte du HTML non filtré. Possible vol de session admin.

Medium
CORS trop permissif

Access-Control-Allow-Origin défini sur *. Requêtes cross-origin malveillantes possibles.

Low
Headers de sécurité manquants

Absence de X-Content-Type-Options, X-Frame-Options et Content-Security-Policy.

Recommandations

P1 Implémenter des requêtes paramétrées sur tous les endpoints API
P1 Sanitiser tous les inputs utilisateur avec DOMPurify côté front
P2 Restreindre CORS aux domaines autorisés uniquement
P3 Ajouter les headers de sécurité via reverse proxy

Sandbox Éducatif

XSS Sandbox

Éducatif

Testez une attaque XSS dans un environnement sécurisé. Entrez du HTML/JS et observez le rendu.

Rendu (iframe sandboxé) :

SQLi Sandbox

Éducatif

Simulez une injection SQL sur un formulaire de login. Observez comment la requête est construite.

Requête SQL générée :
SELECT * FROM users WHERE username = '' AND password = ''