|
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
|
HACKING 1.
Intro Cet article a pour but de vous présenter un type de faille présent sur de nombreux sites web utilisant une base de données de type (SQL par exemple) et qui permette aux visiteur de faire des requètes grâce à des applications en PHP/ASP/CFML/JSP. Ces requêtes sont effectuées par des applications comme une inscription à une newsletter, un post sur un forum en passant par les moteurs de recherche. Ces failles sont dues à un abus de confiance du programmeur envers le publique, soit les visiteurs dans ntore cas. J'étudierais
dans cet article que des cas de scripts PHP avec une connection à un serveur
MySQL mais de toute manière, la faille est identique pour les autres language
de scripting pour le web associé à des serveurs de bases de données SQL/PostGreSQL/Oracle/...
http://www.mysql.com 2.
Quelques bases en SQL Le SQL est
un language qui vous permet de communiquer avec les bases de données ;) Donc notre table newsletter avec nos 2 champs (nom,email). Pour sélectionner
la ligne avec le nom "billy" : Pour sélectionner
l'email et le nom de la personne qui à comme nom "billy"
: Pour remplacer
l'email de la personne nommée billy par billy@billy.fr : Pour effacer
l'inscrit nommé billy avec ses informations (email+nom) : Pour executer
plusieurs requêtes SQL sur 1 seule ligne il faut les finir par un ";". Pour insérer
des commentaires dans une requêtes SQL, Bon avec ces quelques requêtes SQL balancées en vrac, vous devriez un peu mieux cogiter. 3.
Explication de la faille Au
lieu de vous écrire un blabla imcompréhensif, je vais vous donner un exemple
: Si
on analyse la source de la page web , on devrait trouver quelque chose
comme : On va supposer que notre formulaire va envoyer les données à un script qui ajoutera une ligne dans notre table SQL qui est composée de 2 champs : nom et email. Donc
imaginons que note visiteur Billy a tappé son email et son nom sur le
formulaire et qu'il l'a validé. Le formulaire va passer les variables
à un script (PHP/ASP/CFML/JSP), ce script va interpréter ces variables
et va faire une requête SQL sur le serveur de base de données. <? Si
vous analyser mon code vous verrez que le nom des variables ($nom &
$email) correspondent aux noms que j'avais attribué aux tag <input>
de mon formulaire HTML. Dans ce cas, tout c'est bien passé, Billy est inscrit est heureux car il va recevoir la newsletter, le codeur est content parce que son script marche bien, bref tout va bien. Et
maintenant étant donné que nous sommes curieux, nous allons faire ce que
nous ne sommes pas censé faire ;) Donc si nous voulons executer une telle requête sur le serveur, il faudrait que notre script PHP execute ca sur le serveur, donc si on tappe ça dans les champs du formulaire : dans
le champ nom : "billy" En
fait le but est d'imbriquer une requête SQL dans notre variable $email. 4. La pratique Dans notre cas précédent, l'attaque était un peu facile car on connaissait le nom de la table et il n'y avait pas d'information subsidiaire à insérer dans la base de données et nous savions comment été structuré le script PHP. En réalité, il se pose plusieurs problèmes : -
si nous ne connaissions pas la requête SQL que le script envoie au serveur
MySQL, nous aurions eu une erreur lors de la validation du formulaire. -
Il peut très bien y avoir une clause WHERE dans la requête SQL, ce qui
fausserait notre attaque car nous aurions encore une fois, une requête
imcompréhensible. C'est à cause des WHERE ,que je vous conseille , à chaque
fois que vous essayerez de réaliser une telle attaque, de rajouter un
charactère de commentaires à la fin de la dernière variables envoyées.
Dans notre cas, c'était email, donc il est bien de rajouter un # ou --
à la fin pour empécher les clauses WHERE d'être prise en compte. - nous ne connaissons pas les noms de la table et des champs de la base de données. Nous aurions très bien pu avoir à la place du champs nom, quelque chose comme username. Pour passer ce problème, soit vous faites du Brute Force, soit vous êtes logique et vous vous mettez à la place du qebdéveloppeur qui à codé le script pour penser à utiliser des noms "logiques". -
le problème de l'affichage (pas très explicite :) ). En
fait la base de l'attaque est simple (enfin ...) mais il y a beaucoup
de facteurs qui compromettent l'attaque car on ne connaît pas le type
de serveur de base de données, le nom de la table, le nom des champs et
même la structure des requêtes SQL.
Bon en réalité c'est ça le plus important, aussi si bien pour les hacker que pour ceux qui sécurisent ou tout du moins qui essaye de sécuriser leurs applications. - commencez par analyer le code de la page qui envoie le formulaire. Sauvez la page sur votre disque dur et analyser la, regarder les noms des variables qui vont être envoyées, si il y a des des <input type=hidden> qui pourrait nous aider. - il faut se mettre à la place du programmeur pour les hackers et vis-versa pour les programmeurs. Donc normallement , un champ qui stockera des noms ne s'appellera pas "IUBFE". Donc il faut un peu d'intuition pour trouver les bons noms de table/champs. -
essayez de provoquer une erreur lors de l'execution du script car si le
script est mal programmé, votre browser vous affichera peut-être la ligne
de code qui bug, ce qui vous permetterait de voir le code source. Pour
provoquer des erreurs, essaye des techniques de Buffer Overflow, c'est
à dire, entrez un maximum de données dans les champs, entrez des caractères
non attendus : '"%x°@8\|{ (enfin des trucs dans le genre) Le mieux pour trouver une faille est d'avoir accés au code source du script, ce qui pourrait nous permettre de ne plus faire du Black-Boxing. Donc le mieux est d'utiliser un exploit sur le serveur web pour récupérer la source : - Utilisez showcode.asp sur IIS installé par défaut. - Si vous voyez un script sur le serveur qui permet de télécharger des fichiers en passant le nom du fichier en variable. (download.cgi?file=blabla.zip), il suffit d'un peu de créativité pour penser à tapper download.cgi?file=le fichier qu'on veut, sans oublier qu'il est peut-être possible de remonter dans les répertoire : download.cgi?file=../../../etc/passwd ;)) - Si le programmeur est un peu étourdit et qu'il a laissé les scripts de debbugage sur le serveur, tappez lescript.phps et si le serveur est configuré pour, vous verrezle code source à l'écran. 6. Sécuriser la faille Donc
comme d'habitude à tout problème, il existe une solution. Dans notre cas,
il existe même plusieurs solutions plus ou moins adaptée. - on sécurise au niveau du client : un javascript peut faire l'affaire. Donc le javascript vérifie si le champs "numéro de téléphone" contient autre chose que des nombres, et si c'est le cas, il n'envoie pas le formulaire au serveur. Cependant cette méthode n'est pas très efficace, car il y a un moyen de passer cette sécurité. En effet, supposons que le formulaire envoie les données en POST, si nous remplissont le formulaire avec des charactères non-conformes, la sécurité fonctionne. Maintenant, si au lieu de remplir le formulaire, on envoie directement la variable avec quelque chose comme : formulaire.php?tel=cequonveut . La variable sera interprétée par le serveur et non par le client, donc la sécurité aura été inefficace. C'est pour ça que je vous recommande de sécuriser au niveau du serveur. - on sécurise au niveau du serveur. C'est notre script php qui va analyser les données entrée, et si elles sont non-conformes, ils les refusent et renvoie un message d'erreur. Pour contrôler le contenu de variable on peut utiliser plusieurs procédés comme les Regex (ex: [^0-9] ou encore des fonctions intégrées au support du language sur le serveur comme (je ne les commenterais pas car si vous êtes webdéveloppeur, je suppose que vous connaissez déjà tout ça) : Pour PHP -
addslashes($votrevariable); Pour ASP Ba
je ne connais pas grand chose à l'ASP, mais je sais juste que vous pouvez
empêcher des ../ d'être insérer dans une variable et que vous pouvez désactiver
le système de fichier accéssible par un script ASP en tappant ca en commande
ms-dos : Vous pouvez aussi directement limiter les droits sur le serveur MySQL en créant un user qui ne pourra accéder à une certaine partie de la base de données ou qui ne pourra qu'executer que certains requêtes SQL. Le
mieux est encore de sécuriser au 2 niveaux, c-a-d, au niveau client et
au niveau serveur. Je conseille aussi au webdéveloppeur de ne pas sous-estimer
l'étendue de cette faille, car bien nombreux sont les webdéveloppeur qui
traittent (sécurisent) les variables où du texte est attendu et laisse
les variables où des nombres sont attendus. Bon j'éspère vous en avoir appris.
BIENTOT
LE RESEAU NET-ALL SERA FIN PRET ! ET CA VA CHANGER SUR LE NET ! Webmasters
gagnez de l'argent |
|
|||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||