Parties

  1. culture générale
    1. culture générale-1
  2. disques
    1. commande df
    2. df peripherique
    3. disque principal
    4. fdisk
    5. table de partition actuelle
    6. swap
    7. création d'une partition
  3. après redemarrage
    1. création d'un système de fichiers
    2. types de systèmes de fichiers
    3. types de systèmes de fichiers et OS
    4. mount
    5. mount utilisation
    6. mount vérification
    7. umount
    8. umount
    9. fstab
    10. fstab, exemple
    11. fstab, exemple2
  4. donéées et sauvegardes - importance des données / RAID
    1. durée de vie
    2. importance de données
    3. importance de données
    4. raid
    5. raid-5
    6. raid-5
    7. raid-5 parité
    8. raid-5 parité
    9. raid risques
  5. données et sauvegardes - copies, machines distantes
    1. transfert de données
    2. ftp non securise
    3. scp
    4. scp distant vers local
    5. scp ethereal
    6. rsync
    7. sauvegarde par duplication
    8. sauvegarde incrementale
    9. sauvegarde lourde
  6. sécurité
  7. buffer overflow
    1. buffer overflow - le programme
    2. bufer overflow: gdb
    3. buffer overflow: hexa A
    4. buffer overflow: hexa B
    5. bufer overflow: adresse de retour AAA
    6. bufer overflow: adresse de retour BBB
    7. bufer overflow: explication, recherche d'adresse
    8. bufer overflow: protection
    9. buffer overflow: problème
  8. Sécurité et PHP
    1. vulnerabilités php: installation
    2. php: include dangereux
    3. php:system
    4. unlink

1. culture générale

1.1 culture générale

1.2 culture générale-1

Pour chacun des composants logiciels suivants (apache, cygwin, gtk...) :
- prenez le temps de faire une recherche internet. Au minimum, visitez la page principale du logiciel en plus de sa page wikipedia.
- vérifiez que vous comprenez les grandes lignes du logiciel. A quoi il sert, comment il s'insère dans le fonctionnement du système. A quoi il pourrait vous être utile. Imaginez des scénarios d'utilisation.

2. disques

2.1 disques

Dans les questions suivantes nous allons manipuler des disques, des partitions et des systèmes de fichiers.

Voici quelques transparents du cours sur ce sujet:
xxxxxxxx

2.2 commande df

Quelle est la commande permettant d'afficher la quantité d'espace libre restant sur les différents disques montés sur le système?

2.3 df peripherique

Sur cet ordinateur, quel est le périphérique associé au répertoire racine du système de fichiers ?

2.4 disque principal

le péripherique associé au répertoire racine se trouve sur quel type de controleur?

2.5 fdisk

fdisk


"fdisk" est un petit utilitaire en mode texte qui permet de manipuler la table des partitions.

x

Souvenez vous, la table des partitions se trouve au tout début du disque (MBR). Elle définit, entre autres, le début et la fin de chaque partition.

Attention: la table des partitions se trouve sur le disque (c'est à dire /dev/sda ) et pas sur une partition particulière ( comme /dev/sda1 )

Lancez la commande "sudo fdisk /dev/sda "

Appuyez sur la touche "m" pour lister les différentes options possibles.

Quelle touche permet d'afficher la table des partitions?

2.6 table de partition actuelle

Combien de partitions est-ce qu'il y a actuellement sur votre disque?

2.7 swap

La deuxième partition (/dev/sda2) n'était pas visible avec la commande "df". En effet, il s'agit d'une partition pour le "swap" : lorsque votre ordinateur n'a pas assez de mémoire vive, il utilise cette partition comme un "prolongement" de sa mémoire.

Swap (mémoire)

Dans un ordinateur, opération fréquente consistant à vider une portion moins utilisée des données situées en mémoire (page) et à la stoker sur le disque temporairement, permettant à d'autres données d'être traitées pendant ce temps.
Cette opération ralentie le traitement des données, mais permet de disposer d'une mémoire de traitement supérieure à la mémoire réellement disponible : la mémoire virtuelle.


Source : http://www.guideinformatique.com/definition-s...

Voir aussi : http://fr.wikipedia.org/wiki/M%C3%A9moire_virtuelle

2.8 création d'une partition

Création d'une partition


"fdisk" n'écrit rien sur le MBR tant que vous n'utilisez pas la commande "w".
N'hésitez donc pas à expérimenter: en quittant ("q") vous abandonnez tous vos changements.

Si vous regardez de près, vous remarquerez qu'il reste beaucoup de place libre (non partitionné) sur votre disque.

Créez deux nouvelles partitions primaires (no. 3 et 4). La partition 3 fera 1Go et la 4 prendra toute la place restante.

Une fois que vous êtes 100% surs de vous, écrivez votre table de partions sur le disque avec "w".

Comme le disque dont vous changez la MBR est en cours d'utilisation, vous devez redémarrer votre ordinateur pour que les changements soient pris en compte.

Indications:

fdisk affiche le début et la fin de chaque partition en cylindres, ce qui n'est pas très intuitif.
Quand vous créez une partition, fdisk vous demande le cylindre ou vous voulez qu'elle commence.
fdisk vous propose une valeur par défaut (appuyez sur entrée pour la valider).
fdisk vous demande aussi le cylindre ou vous voulez qu'elle termine.
Il est souvent plus pratique de spécifier la taille avec un "+"
Par exemple: +2G pour une partition de deux gigaoctets


3. après redemarrage

3.1 après redemarrage

après redemarrage

3.2 création d'un système de fichiers

Création d'un système de fichiers


Vous venez de créer deux partitions. Pour l'instant elles ne contiennent rien : c'est juste une série d'octets disponibles. Tapez "sudo fdisk -l" pour obtenir une liste des partitions des périphériques branchés.

Dans des cas rarissimes, on pourrait utiliser ces partitions directement (en "brut"), mais en général on souhaite y mettre des fichiers, il nous faut donc créer un système de fichiers dessus:

Pour créer un système de fichiers sur la 3ème partition du disque /dev/sda , tapez la commande "sudo mkfs -t ext3 /dev/sda3"


3.3 types de systèmes de fichiers

parmi les suivants, lesquels sont des types de systèmes de fichiers?

(dans le doute, regardez votre cours ou recherchez sur internet)

3.4 types de systèmes de fichiers et OS

En général, un système d'exploitation a un système de fichiers natif préféré.
(Ca ne veut pas pour autant dire qu'un système d'exploitation utilise necesairement ce système de fichier)

Faites les liens:
(en cas de doute, cherchez sur internet)

3.5 mount

Quel est le nom de la commande (juste son nom) permettant d'associer un peripherique à un répertoire ?

3.6 mount utilisation

Utilisation de la commande "mount"


Pour l'instant nous avons:
  1. crée une partition
  2. crée un système de fichiers sur la partition
Pour pouvoir utiliser notre système de fichiers, il faut l'associer à un répertoire.

Tapez la commande "df" et vérifiez que /dev/sda3 n'est encore associé à aucun répertoire.

En tant que root, créez un répertoire /root/essai-mount

Créez un fichier dedans et vérifiez qu'il est bien là.
Ensuite, sortez de ce répertoire.

Quelle commande faut-il taper pour associer le périphérique /dev/sda3 au répertoire /root/essai-mount ?

3.7 mount vérification

Vérification du montage


Vérifiez avec "df" que la commande mount a bien fonctionné.

Rentrez dans le répertoire /root/essai-mount et regardez son contenu.

Est-ce que le fichier crée toute à l'heure est là ?

3.8 umount


Lorsqu'un rentre dans le repertoire /root/essai-mount on est redirigé vers notre système de fichiers, grace à l'association faite avec "mount".

Créez quelques fichiers et répertoires dans le nouveau système de fichiers (donc dans /root/essai-mount).

Umount

Pour des-associer le système de fichiers d'un répertoire, on utilise la commande "umount".

Tout en restant dans "/root/essai-mount" tapez la commande "umount /root/essai-mount".

Que se passe-il?

3.9 umount

Utilisation de umount


Il arrive souvent qu'un fichier ou répertoire soit encore en utilisation sur un péripherique que l'on veut démonter (umount). Vous devez trouver le programme (souvent un shell) coupable.

Sortez du répertoire /root/essai-mount puis tapez la commande "sudo umount /root/essai-mount"

vérifiez avec "df" que le disque n'est plus là.

rentrez dans le répertoire /root/essai-mount et vérifiez que son contenu (celui d'avant "mount") est bien revenu.

3.10 fstab

Le fichier /etc/fstab


Le fichier /etc/fstab enregistre les correspondances entre des périphériques et des répertoires (points de montage), utilisés par défaut (par exemple, au démarrage).

Sur votre machine, à quel répertoire est associé le périphérique /dev/fd0 (lecteur disquette) ?

3.11 fstab, exemple

Dans le fichier fstab suivant:

#
# /etc/fstab
#
/dev/hdb1 / ext2 defaults 1 1
/dev/hdb5 /usr ext2 defaults 1 2
/dev/hdb2 /usr/X11R6 ext2 defaults 0 2
/dev/hdb7 /usr/local ext2 defaults 0 2
/dev/hdb6 /home ext2 defaults 1 2
/dev/sbpcd /mnt/cdrom iso9660 ro,noauto
/dev/fd0 /mnt/floppy ext2 defaults,noauto
/dev/hda1 /root/dosc msdos defaults
/dev/hdb8 /root/dosd msdos defaults
/dev/hdb3 none ignore
/dev/hdb4 none ignore
/proc /proc proc defaults
/dev/hda2 none swap sw


A quel répertoire est associé la deuxième partition primaire se trouvant sur le deuxième disque de la première nappe (contrôleur) IDE ?

3.12 fstab, exemple2

Dans le fichier fstab suivant:

#
# /etc/fstab
#
/dev/hdb1 / ext2 defaults 1 1
/dev/hdb5 /usr ext2 defaults 1 2
/dev/hdb2 /usr/X11R6 ext2 defaults 0 2
/dev/hdb7 /usr/local ext2 defaults 0 2
/dev/hdb6 /home ext2 defaults 1 2
/dev/sbpcd /mnt/cdrom iso9660 ro,noauto
/dev/fd0 /mnt/floppy ext2 defaults,noauto
/dev/hda1 /root/dosc msdos defaults
/dev/hdb8 /root/dosd msdos defaults
/dev/hdb3 none ignore
/dev/hdb4 none ignore
/proc /proc proc defaults
/dev/hda2 none swap sw


A quel type de système de fichier est associé la première partition primaire se trouvant sur le premier disque de la première nappe (contrôleur) IDE ?

4. donéées et sauvegardes - importance des données / RAID

4.1 donéées et sauvegardes - importance des données / RAID

Dans les exercices suivant nous allons travailler sur la protection et la sauvegarde des données.

Voici quelques transparents du cours:
xxxxx

4.2 durée de vie

Durée de vie d'un disque dur


La tête de lecture d'un disque dur vole sur un coussin d'air a un dizaine de nanomètres de la surface du disque dur (voir http://fr.wikipedia.org/wiki/Disque_dur) ... par comparaison un cheveu humain a un diamètre d'environ 100 micromètres (soit 10 000 fois plus).

Un disque standard tourne à 7200 tours par minute.

A votre avis, que se passe-il si une poussière rentre dans votre disque dur ?
A votre avis, que se passe-il si votre disque dur prend un coup lorsqu'il est en fonctionnement ?

Les fabriquants de disque dur donnent des durées de vie de leurs disques durs de l'ordre de 3 à 5 ans. Et des garanties de l'ordre de 1 à 3 ans.

Sur des serveurs très sollicités, il arrive de devoir changer des disques tous les ans.


4.3 importance de données

Importance des données

Considérons une personne payé 15 euros de l'heure, donc coûtant 30 euros de l'heure à une entreprise.
Cette personne travaille 35 heures par semaine, 4 semaines par mois.

Quel est le coût pour l'entreprise si suite a un crash de disque dur, 6 mois de travail sont perdus?

4.4 importance de données

Par comparaison le prix d'un disque dur est de l'ordre de 100 euros. (un peu moins)
Combien de disque durs peut-on acheter avec la somme calculée précédemment?

4.5 raid

Disques RAID


Vous trouverez des informations sur le RAID dans votre cours et sur:
http://fr.wikipedia.org/wiki/Raid_(informatique)
http://www.commentcamarche.net/protect/raid.php3

Combien de Go pouvez vous stocker dans un raid-1 formé de deux disques de 300 Go ?

4.6 raid-5

Considerons une configuration raid-5 de 3 disques de 300 Go, combien de Go pouvez vous stocker ?

4.7 raid-5

Considerons une configuration raid-5 de 10 disques de 300 Go, combien de Go pouvez vous stocker ?

4.8 raid-5 parité

Le raid-5 utilise la parité pour pouvoir recuperer des données en cas de perte d'un disque.
La parité peut-etre implementé simplement en utilisant l'operateur binaire "ou exclusif".

Donnez la table de verité de cet opérateur:

4.9 raid-5 parité

Supposons que des données soient sur un raid-5 composé de trois disques : A, B et C

Dans cet exemple, les données de parité sont sur C
Une panne survient sur le disque B.
Recalculez, à l'aide de l'opérateur xor les données perdues sur le disque B.

num. ligne
disque
A
disque
B
disque
C
1
0
?
0
2
1
?
0
3
1
?
1
4
1
1
0
5
0
1
1
6
1
?
1


4.10 raid risques

Risques


Un raid-5 vous protège contre quels risques?

Indications

RAID: N'oubliez pas: une donnée écrite/effacée sur le disque "virtuel" formée par un raid est immédiatement écrite/effacée sur l'ensemble des disques le constituant.

Piratage: Lorsqu'une machine est piratée, le pirate modifie des fichiers. Il est souvent très difficile de trouver quels fichiers ont été modifiés. On souhaite donc pouvoir restaurer les fichiers tels qu'ils étaient avant le piratage.

Interruption de service: un serveur très utilisé (exemple: serveur web) doit tourner en permanence. On ne peut pas se permettre que le service qu'il fournit soit interrompu.

5. données et sauvegardes - copies, machines distantes

5.1 données et sauvegardes - copies, machines distantes



xx

5.2 transfert de données

Transfert de données entre machines


De nombreux moyens existent pour transferer des données entre deux machines.
Lisez (sur internet ou avec dans man) des elements sur les trois protocoles suivants:




5.3 ftp non securise

Service FTP


Nous allons démarrer un serveur ftp et voir les informations qui circulent sur le réseau lorsqu'on s'y connecte. Vous pouvez faire cet exercice sur votre propre machine, ou le faire avec votre voisin (c'est plus parlant).

Demandez à votre voisin de modifier d'installer un serveur ftp (vsftpd), et de modifier son fichier de config (/etc/vsftpd.conf) en de-commentant la ligne : "local_enable=YES"

  1. Demandez à votre voisin de démarrer le service "vsftpd" (le serveur ftp).
  2. Lancez le programme sudo wireshark (anciennement "ethereal"). wireshark est un "sniffer", qui permet d'écouter et enregistrer (capturer) les paquets circulant sur le réseau.
  3. Lancez la capture (menu capture -> interface -> eth0 -> start ... ou bien eth1 selon la config de votre machine).
  4. Ensuite connectez vous sur le serveur ftp avec le client ftp (commande "ftp"). Utilisez le login et mot de passe d'un des comptes utilisateur de la machine.
  5. Une fois connecté, arrêtez la capture des paquets. Cherchez les paquets correspondant au protocole "ftp" (vous pouvez trier les paquets par protocole, en cliquant tout en haut de cette colonne). Vous devriez voir votre login/mot de passe apparaître!

5.4 scp

La commande "scp" permet de copier des fichiers d'une machine à l'autre en utilisant ssh.

En lisant la page man de "scp" (ou en cherchant sur internet), quelle commande faut-il taper pour copier un fichier "essai.txt" se trouvant sur votre machine, vers le répertoire personnel d'un utilisateur "toto" sur une machine appelé "zozo.org" ?
(on utilisera le compte de "toto" sur la machine distante zozo.org)

5.5 scp distant vers local

Quelle commande taper pour copier un fichier "essai.txt" se trouvant dans le répertoire "/tmp" d'une machine distante "zozo.org" vers le répertoire courant (de votre machine)? L'utilisateur à utiliser sur la machine distante est "toto".

5.6 scp ethereal

Lancez wireshark (anciennement appelé "ethereal") et démarrez la capture de paquets.
Ensuite copiez des fichiers avec scp, puis arrêtez la capture.
Cherchez les paquets correspondants (ssh).
Est-ce que votre mot de passe apparaît?

5.7 rsync

La commande "rsync" est très utilisé. Elle a une syntaxe très proche de celle de "scp".
On peut l'utiliser pour copier des fichiers d'une machine à une autre, ou bien pour copier des fichiers sur une même machine.

Quelques options très courantes (voir "man rsync" pour plus de détails):
"-a"  : à la place de "-r" et "-p".
"-v"  : verbose, la commande décrit tout ce qu'elle fait.
"--delete" : effacer les fichiers absents présents dans le répertoire destination mais pas dans le source.

Un petit détail: "rsync" est sensible à la presence d'un / à la fin d'un nom de répertoire.

Utilisez "rsync" pour copier les fichier et répertoires précedents de votre machine vers celle de votre voisin et reciproquement. On utilisera ce type de commandes:
rsync -av --delete repertoire-source/  toto@adresse_ip_voisin:/tmp/essai/


5.8 sauvegarde par duplication

Conscient de la faible fiabilité des disques durs, vous achetez un deuxième disque dur que vous installez sur la même machine. Vous utilisez un programme qui duplique automatiquement votre premier disque sur le deuxième toutes les semaines.

Contre quels risques êtes vous protégés?

percu=on remarque bien l'existence du problème avant la sauvegarde
inapercu=on ne remarque pas l'existence du problème avant la sauvegarde

5.9 sauvegarde incrementale

Sur une machine sans raid, on met en place une politique de sauvegarde incrémentale.
Ce type de sauvegarde permet de conserver un historique complet des fichiers.
Vous pouvez lire, par exemple: http://fr.wikipedia.org/wiki/Sauvegarde

La machine contenant les sauvegardes est dans un bâtiment différent.

Contre quels risques êtes vous protégés?

5.10 sauvegarde lourde

Dans un service administratif d'une université, l'administrateur système équipe tous les ordinateurs d'un graveur de CD-ROM et demande au personnel du service de sauvegarder régulièrement leurs propres données importantes.

Est-ce que cela vous parait être une bonne politique de sauvegarde?
Imaginez quelques scénarios.

Quelle espace est disponible sur un CD?

Quel est la taille du disque dur de chaque utilisateur?

Combien de temps à votre avis est-ce que chaque utilisateur doit passer à chaque sauvegarde pour choisir les données importantes ?

Est-ce que vous pensez que les utilisateurs vont réellement faire ces sauvegardes ?

Est-ce que ce système de sauvegarde est efficace ?

6. sécurité

6.1 sécurité

Dans les exercices suivants nous allons aborder des problèmes de sécurité.

Les failles de sécurité dans les systèmes informatiques ne sont pas faites exprès.
Elles résultant souvent d'erreurs ou oublis subtils dans des systèmes complexes.
L'exploitation de ces erreurs est souvent difficile et donne lieu a des manipulations complexes.

xxxx

7. buffer overflow

7.1 buffer overflow

Pour faire ces exercices, vous pouvez relire votre cours (transparents du cours 2) à propos des buffer overflow, et aussi la page suivante: http://fr.wikipedia.org/wiki/Buffer_overflow

x

7.2 buffer overflow - le programme

Saisissez le programme overflow.c suivant et lisez le très attentivement.
Essayez de comprendre en détail chaque ligne.

#include<stdio.h>
void ma_fonction()
{
char chaine[10];
printf("saisissez une chaine:");
scanf("%s",chaine);
printf("vous avez ecrit:%s\n",chaine);
}
int main()
{
ma_fonction();
printf("de retour dans main\n");
return 0;
}

  1. compilez-le avec "gcc -g overflow.c -o overflow"
  2. ensuite exécutez-le
  3. Faites plusieurs essais, en saisissant des chaînes de caractères de tailles différentes (entre 0 et 50 caractères)
Quelle est la ligne d'erreur affichée?

7.3 bufer overflow: gdb

"gdb" est un debugger vous permettant de suivre l'exécution de votre programme.

Tapez "gdb ./overflow"
Puis tapez "run" pour lancer le programme.
Saisissez une longue chaîne, et regardez le résultat.

Maintenant, nous voulons exécuter le programme pas-par-pas.
Tapez "break ma_fonction"pour arrêter l'exécution à ma_fonction
Puis relancez le programme avec "run".
pour avancer d'un pas, tapez "next".
Saisissez une longue chaîne.
et tapez next, jusqu'à ce que le programme plante.

A quel moment est-ce que le programme plante?


7.4 buffer overflow: hexa A

Quel est la valeur ascii de la lettre 'A' (majuscule) en hexadécimal?
(cherchez sur internet, ou écrivez un programme C simple)

7.5 buffer overflow: hexa B

Quel est la valeur ascii de la lettre 'B' (majuscule) en hexadécimal?

7.6 bufer overflow: adresse de retour AAA

Quittez gdb (quit), puis relancez le.
Lancez le programme dans gdb, et saisissez la chaîne de caractères:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Le programme plante avec le message suivant:

Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
(gdb)

Gdb vous dit que le programme est en train de s'exécuter à l'adresse mémoire 0x41414141
Réfléchissez bien à ce que ca veut dire.
Un programme C compilé est une suite d'instructions en langage machine.
Chaque instruction se trouve à une adresse dans la mémoire.
Est-ce que cette adresse 0x41414141 mémoire vous semble être une adresse normale à la quelle on trouverait un bout de notre programme?
Qu'est-ce qu'il s'est passé ?


7.7 bufer overflow: adresse de retour BBB

Recommencez cette opération, en saissisant la chaine:
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB

A quelle adresse de la mémoire se retrouve l'execution du programme lors du plantage?

7.8 bufer overflow: explication, recherche d'adresse

Comme vous l'avez vu, en dépassant le nombre de caractères permis dans le tampon "chaine", on a réussi à modifier l'adresse d'exécution du programme.

En effet, normalement, à la fin de "ma_fonction", le programme retourne à la fonction appelante (main) dont l'adresse est mémorisé en fin de la pile. Or, nous avons écrasé cette adresse de retour par notre saisie trop longue. Si, en plus, on avait réussi a placer un programme à cette nouvelle adresse, on pourrait faire exécuter au programme d'origine un code à nous.

Regardez votre cours pour bien comprendre le mécanisme.
x


Une difficulté ici pour un pirate serait de trouver exactement combien de caractères il faut saisir pour remplacer l'adresse de retour d'origine par une adresse à nous. Il ne connaît pas forcément la taille de la pile et les autres données qui pourraient y figurer.

En saisissant des chaînes contenant un grand nombre de "A" suivi d'un grand nombre de "B", du type:
AAAAAAAAAAAAAAAAAABBBBBBBBB

déterminez combien de lettres A faut-il saisir pour obtenir l'adresse de retour suivante:
0x42424141

faites de nombreux essais, en sachant que :
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB
retournerait sur 0x41414141 -> on a ecrasé l'adresse de retour avec des 'A'
et que
AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
retournerait sur 0x42424242 -> on a ecrasé l'adresse de retour avec des 'B'

7.9 bufer overflow: protection

bufer overflow: protection


Le buffer overflow peut se retrouver dans de nombreux contextes. Ici c'est la fonction scanf qui est fautive. Mais ca pourrait être une autre fonction.

Dés qu'un programme reçoit des données, il est susceptible d'être abusé par ce genre d'attaques. Pour éviter ce type d'attaques, la gestion de toutes les données reçues d'une source extérieure doit être faite avec prudence.

Est-ce que le problème dans "overflow.c" est résolu en augmentant la taille de la chaîne de caractères (par exemple 1000 au lie de 10) ?

7.10 buffer overflow: problème

Le problème dans le programme "overflow.c" est la fonction "scanf". Elle ne vérifie pas une taille maximale de la saisie. On peut utiliser un tableau aussi grand qu'on veut, l'utilisateur pourra rentrer une saisie plus grande.

Certaines fonctions comme scanf ne doivent donc pas être utilisés.

Parmi les fonctions suivantes, lesquelles ne doivent jamais être utilisées pour traiter des données fournies par une source extérieure?

Il faut vérifier qu'elles permettent d'indiquer la taille maximale des données.

(regardez leurs page "man" pour comprendre)

Dans chaque cas, imaginez un scénario ou ces fonctions pourraient être abusées.
Écrivez un petit programme C pouvant être abusé.
Ensuite, écrivez un programme ayant la même fonctionnalité, mais utilisant les fonctions sécurisés.

8. Sécurité et PHP

8.1 Sécurité et PHP

Dans ces exercices nous allons aborder quelques exemples de failles de sécurité en PHP.

xx

8.2 vulnerabilités php: installation

Installation du PHP

Installez les paquets php5 et php5-gd puis redémarrez apache, pour qu'il en tienne compte.

Créez le fichier "essai.php" suivant dans votre document root apache, et vérifiez son bon fonctionnement.
<?php
echo "bonjour";
phpinfo();
?>

Demandez de l'aide à votre enseignant s'il y a un problème.

Les erreurs courantes sont:
- vous n'avez pas installé PHP
- vous avez installé php4 et pas php5
- vous n'avez pas redémarré apache2
- votre navigateur a gardé en cache le fichier PHP erroné ... videz votre cache

8.3 php: include dangereux

Une grande partie des failles de sécurité en PHP provient d'une validation insuffisante des données fournies par l'utilisateur. Les variables $_GET et $_POST proviennent directement de l'utilisateur qui peut (s'il est hostile) leur donner des valeurs arbitraires.

Pour que cet exercice puisse fonctionner, votre voisin doit changer l'option allow_url_include (=On) dans le fichier de configuration du php : /etc/php5/apache2/php.ini et redemarrer le serveur web.

Attention, cet exercice peut-etre un peu déroutant. On vous conseille vivement de faire un schéma sur un papier. Travaillez à deux (sur deux machines : "pirate" et "victime" ) et ne désarchivez ces fichiers que sur la machine "victime". N'oubliez pas que le but, ici c'est que le pirate, à partir de la machine "pirate", réussisse à lire des informations confidentielles qui se trouvent sur la machine "victime".

Important: pour faire cet exercice vous n'avez pas besoin de modifier les fichiers sur la machine victime (ce serait trop facile..., si le pirate a déjà accès à la machine, il n'a pas besoin de la pirater...). Vous devez donc laissez les fichiers index.php, vendre.php et acheter.php tels quels.
  1. Des-archivez le fichier insecure.tar.gz dans le document root (normalement /var/www) de la machine "victime"
  2. Dans votre navigateur, prenez connaissance des pages.
  3. Lisez attentivement le code PHP.
  4. Ajoutez votre nom dans le fichier "secret.txt" (pour le personnaliser et qu'il le fichier soit diffèrent de celui de votre voisin) et deplacez-le dans /tmp sur la machine "victime"
  5. La directive "include" lit un fichier php et l'exécute. Elle peut aussi inclure un fichier distant (http://....). C'est sur cette faille que le pirate va jouer. Au lieu d'inclure les fichiers sur la machine "victime" comme c'est prévu dans le programme, il va faire en sorte d'inclure des fichiers sur la machine "pirate".
  6. Dans le navigateur de la machine "pirate", modifiez l'URL pour inclure un fichier qui se trouve sur la machine "pirate"
    IMPORTANT: Faites un schéma détaillé, sur un papier, ou figurent les deux machines, les serveurs apache, les fichiers PHP, le fichier "secret.txt" et l'interpréteur PHP. Représentez sur ce schéma les différentes requêtes et les informations qui circulent. Les aller-retours d'information sont complexes, si vous ne faites pas de schéma, vous avez peu de chances de comprendre ce qui se passe et de réussir à pirater la machine de votre voisin.
  7. Le but du pirate est d'exécuter du php qu'il a écrit sur la machine "victime". Écrivez des fichiers contenant du code php sur la machine "pirate" pour qu'ils soient inclus par le programme sur la machine "victime". Attention: ne donnez pas un nom en '.php' à ces fichiers, sinon il seront exécutés d'abord par le serveur apache de la machine "pirate".
  8. Piratez le site de votre voisin de façon à afficher son fichier "secret.txt". Attention essayez de bien comprendre sur quelle machine s'exécute le script et ce qu'il doit générer.
    Aidez vous des fonctions PHP system("pwd") ou system("cat nom_fichier") qui permettent d'exécuter des commandes shell.
Que se passe-il si votre voisin a laissé les droits d'écriture sur son répertoire et ses fichiers?
(par exemple en faisant un chmod 777 ... sans réfléchir)

8.4 php:system

Demandez à votre voisin de copier le fichier suivant dans un répertoire accessible par le web.
Ce programme php comporte une faille.

Comme souvent, la faille est liée au fait qu'on ne v'a pas vérifié les données vennant de l'exterieur: $_GET['nom']. Donc, quelqu'un de l'extérieur peut faire prendre à la variable "$nom" la valeur qu'il veut.

Exploitez cette faille pour exécuter d'autres commandes shell que celle qui est prévue (touch) et affichez le contenu du fichier /etc/passwd de la machine de votre voisin.

<?php
// .....

$nom=$_GET['nom'];
echo "mise à jour des données de l'utilisateur $nom<br/>";
system("touch donnees/fichier-$nom.xml");

// ....
?>

Ensuite, protégez le programme pour qu'il ne soit plus vulnérable, tout en ayant l'effet prévu.

8.5 unlink

Considérez le programme suivant:

<?php
// .....

$nom=$_GET['nom'];
echo "supression des données de l'utilisateur $nom<br/>";
unlink("donnees/$nom");

// ....
?>

Qu'arrive-il si des répertoires du système ont le droit d'écriture pour l'utilisateur avec le quel tourne le serveur web?

Supposons qu'un administrateur système debutant lance le serveur web en tant que root. Que faut-il faire pour supprimer le fichier /etc/passwd ?