Академический Документы
Профессиональный Документы
Культура Документы
A
Auteur
Ilia Alshanetsky est le principal dveloppeur de logiciels chez Advanced
Internet Designs Inc., socit spcialise
dans les audits de scurit, l'analyse de
performance et le dveloppement d'applications. Il est galement l'auteur de
FUDforum (http://fudforum.org), panneau
d'affichage lectronique Open Source
trs populaire, dont le principal objectif
est de proposer le maximum de fonctionnalits au niveau de scurit et de performance le plus lev. Ilia est galement
dveloppeur de Core PHP, dont il a cr,
seul ou en quipe, une srie d'extensions
comme par exemple SHMOP, PDO,
SQLite, GD et ncurses. Il est un membre
actif de l'quipe assurance qualit de
PHP, et compte prs d'une centaine de
corrections de bogues son actif ainsi
qu'un grand nombre de performances et
de fonctionnalits.
Attaques XSS
et CSRF : origines
Avant de nous plonger dans les caractristiques de ces attaques, nous allons vous
prsenter de manire gnrale la nature
des attaques de type XSS et CSRF. Ces
vulnrabilits reposent toutes deux sur
le principe suivant : le pirate peut insrer
certains contenus arbitraires dans une
page. Ce contenu peut ensuite tre utilis pour raliser des actions que l'auteur
du site n'aurait jamais faites, comme par
exemple, voler les cookies d'un utilisateur
malchanceux.
www.phpsolmag.org
XSS, CSRF
Surveiller la prsence
d'images inconnues
Premire attaque
de type CSRF
www.phpsolmag.org
Projets
Projets
XSS, CSRF
Malheureusement, ce mcanisme de
protection peut tre aisment contourn.
Nous allons expliquer ici comment. Tout
d'abord, le pirate va tenter si les contrles
lmentaires d'extension passent, puis va
proposer une URL vraiment similaire un
lien vers une image, comme par exemple
http://hacker.com/me.jpg. Ce qui lui permettra de ne pas alerter les validateurs
la recherche de l'extension correcte de
l'image. Le pige suivant consiste rcrire me.jpg par mod_rewrite dans un script
PHP qui prendra ainsi l'action convenable
tout en laissant au pirate toute la flexibilit
dont il a besoin.
RewriteEngine on
RewriteRule ^/me.jpg$ hacker.php
Listing 1. Envoi d'une image inoffensive au serveur que nous savons en train de
raliser un contrle, tout en redirigeant les requtes vers d'autres URL
if ($_SERVER['REMOTE_ADDR'] = '1.2.3.4') {
header("Content-Type: image/jpeg");
readfile("./me.jpg");
} else {
header("Location: http://foobar.com/admin/delete_msg.php?=1");
}
Listing 2. Le code pirate dtermine s'il doit raliser une attaque fonde sur le
champ HTTP_REFERER
if (empty($_SERVER['HTTP_REFERER'])) {
header("Content-Type: image/jpeg");
readfile("./me.jpg");
} else {
header("Location: http://foobar.com/admin/delete_msg.php?=1");
www.phpsolmag.org
XSS, CSRF
afin d'viter toute violation de l'espace sur
le disque. Enfin, nous renommons le fichier, en lui donnant une extension image
selon son type, afin d'tre sr que les navigateurs pourront afficher l'image.
Il est essentiel de NE PAS utiliser l'extension extraite de l'URL fournie par l'utilisateur, mais de dterminer la sienne, afin
d'viter toute exploitation d'un bogue rcemment dcouvert sur Internet Explorer.
Ce bogue est gnr par un fichier image,
dont l'extension est diffrente de l'en-tte
de l'image. Par exemple, le fichier peut
tre appel me.jpg, alors que l'image est
en ralit au format GIF. Dans un tel cas
de figure, Internet Explorer se comporte
bizarrement et analyse le fichier de telle
sorte qu'une analyse est galement lance sur toutes chanes HTML comprises
dans l'image, ce qui peut ventuellement
conduire lancer des attaques de type
XSS et CSRF, lorsque le fichier image est
directement accessible :
<GIF89a 8 f >
Projets
<html>
<head>
<script>alert("XSS");</script>
</head>
<body></body>
</html>
(Discovered by Marc Ruef,
http://www.securiteam.com/windowsntfocus/
6F00B00EBY.html)
Cette image trs intressante va dclancher le problme et sera capable de passer avec succs la fonction de validation
getimagesize(), puisque ce test n'examine que l'en-tte du fichier, qui dans ce cas
est parfaitement valide. Toutefois, dans la
mesure o l'extension que nous donnons
notre image repose sur son en-tte, l'inconsistance entre l'image et son extension
n'a pas lieu d'tre, et l'attaque sera ainsi
vite.
Mais, s'il ne s'agissait l que du seul
problme, plus de personnes seraient
peut-tre capables de le grer. Malheureusement, il existe plusieurs autres problmes avec cette approche. Tout d'abord,
le stockage de toutes ces images localement peut se rvler une opration trs
lourde pour le disque, difficile justifier
pour les oprateurs du site dont l'espace
disponible est limit. Par ailleurs, grer
toutes les images envoyes par l'utilisateur partir du serveur peut entraner une
utilisation considrablement accrue de la
Listing 4. Tlchargement de l'image localement, validation, stockage et modification du lien vers l'image afin de dsamorcer l'attaque
$img = "http://hacker.com/me.jpg";
file_put_contents($img_store_dir.md5($img), file_get_contents($img));
$i = getimagesize($img_store_dir.md5($img));
if (!$i && $i[0] < $max_width && $i[1] < $max_height) {
unlink($img_store_dir.md5($img));
}
rename($img_store_dir.md5($img),
$img_store_dir.md5($img).image_type_to_extension($i[2]));
www.phpsolmag.org
Projets
XSS, CSRF
url('http://hacker.com/
www.phpsolmag.org
XSS, CSRF
port une image compromise qui s'affiche
dans le navigateur sous forme d'icne ou
d'une lment de ce type.
Heureusement, cet exemple illustre
bien les raisons pour lesquelles l'autorisation de balises de la fonction strip_tags()
ne doit pas tre utilise. Il vaut mieux
envisager d'implmenter un petit sousensemble de BBcode, lequel ne supporte
pas les attributs. Pour ceux qui ne sont
pas familier avec le BBcode, il s'agit d'un
ensemble de balises de mise en page,
trs semblables l'HTML, mais charges de fournir un sous-ensemble limit
d'attributs de mise en page du texte. Les
balises sont converties par l'analyseur de
BBcode en quivalents HTML, permettant
ainsi l'utilisateur d'ajuster le texte sans
avoir crer une faille pour des attaques
de type XSS et CSRF. Vous n'avez pas
besoin d'crire votre propre analyseur,
puisque certains outils existent dj, comme par exemple, la classe PEAR intitule
HTML_BBCodeParser, qui fonctionne trs
bien pour cette tche. Vous pouvez la tlcharger partir de l'adresse suivante :
http://pear.php.net/package/HTML_BBCodeParser. Vous pouvez galement avoir
recours au package SafeHTML PHP,
tlchargeable l'adresse suivante : http:
//pixel-apes.com/safehtml. Celui-ci limine
tous les lments et attributs HTML incertains d'un texte donn.
En plus des piges relatifs aux arrires plans et aux balises images, n'importe
quelle balise susceptible d'entraner un
tlchargement d'une ressource lie
automatiquement peut tre utilise par
une attaque de type CSRF. Toutefois, les
balises de type <iframe>, <script>, etc.
ne sont gnralement pas accessibles
l'utilisateur et sont donc sres en raison
de leur contenu statique. Cependant, si
elles peuvent tre modifies par une variable non-contrle, elles menacent alors
l'application dans la mme mesure que les
mcanismes voqus plus haut.
Projets
www.phpsolmag.org
Projets
XSS, CSRF
cods ainsi que celle des guillemets simples, puisqu'ils agissent dsormais en tant
que fermeture d'attribut. En dpit d'une
apparente complexit, cette manoeuvre
est en ralit assez simple raliser,
grce deux fonctions de JavaScript :
String.fromCharCode() permettant de
convertir une liste de code ASCII dans
les caractres correspondants, et la
fonction eval(), charge d'excuter la
chane donne. Si, par exemple, le pirate
dsire afficher une alerte JavaScript avec
le message XSS, il lui suffit d'injecter la
chane suivante :
' onMouseOver='eval(String.fromCharCode
(97,108,101,114,116,40,39,88,83,83,39,
41,59))' '
www.phpsolmag.org
Le
rsultat
est
le suivant : $_
est dsormais quivalent <script> ou ventuellement
une attaque encore plus dangereuse. Le
mme genre de piges peuvent tre appliqus sur d'autres en-ttes comme Via
(HTTP_VIA) et X-Forwarded-For (HTTP_X_
FORWARDED_FOR),normalement utiliss par
des serveurs mandataires pour indiquer
l'adresse de l'utilisateur derrire le serveur
mandataire. Au lieu d'une adresse IP ou
SERVER['HTTP_HOST']
XSS, CSRF
Projets
Conclusion
www.phpsolmag.org