Protéger son site web, c’est d’abord savoir hacker

13 Novembre 2018
hacker
Le piratage d’un site internet fait toujours peur, surtout lorsque le contenu de la page d’accueil est modifié (defacing) ou que les données sont rendues accessibles à la concurrence. Alors, pour se préserver du danger, il est nécessaire de comprendre les techniques d’attaque. Rappels des fondamentaux par Christophe Villeneuve.

Les pirates utilisent de nombreux procédés différents, grâce auxquels ils prennent le contrôle d’un site web avec ou sans outils. Mais, lorsqu’on s’en rend compte, il est déjà trop tard.

Comment éviter l’inévitable ?

Il faut apprendre les techniques d’attaque et les utiliser pour se défendre. Cette façon de faire est légale et est prisée des experts de la sécurité informatique, alors surnommés « Hacker Blanc » ou « White Hat ». Ils effectuent, entres autres, des tests d’intrusions afin de trouver et de corriger les éventuelles failles et ainsi assurer la sécurité des systèmes d’information d’une organisation. Cela rentre dans leur rôle de « pentesters », contraction de « penetration testers ». Une panoplie de solutions existe pour respecter by design les bonnes pratiques, trop souvent oubliées lors de la réalisation d’un projet web.

Le cybercriminel, quant à lui, aime à être discret. Il va commencer par une phase de reconnaissance visuelle du site web afin d’analyser le gain potentiel du hack. Ensuite, il effectuera un scan du réseau pour trouver une porte dérobée. Il finira son approche en mettant en place un processus de dissimulation de traces dans le but de ne pas être identifié lors de la phase d’exploitation.

Les attaques directes

attaque directe

C’est l’offensive la plus simple. Le hacker attaque directement le site à partir de son ordinateur personnel et ce, en utilisant des scripts ou des logiciels facilement trouvables sur le net et mis au point par d’autres. Ces hackers sont péjorativement appelés les « scripts kiddies » (enfant du script) du fait de leur manque de compétences techniques. L’identification de l’attaquant inexpérimenté est alors aisée.

Avec une gestion de logs, il est possible de déterminer l’adresse IP du hacker. La solution est donc de la blacklister. Elle peut être bloquée pendant une certaine durée au cas où la connexion serait faite à plusieurs reprises. L’attaque est ainsi stoppée.

Les attaques indirectes par rebond

pirate


Ce type d’attaque est prisé par les hackers car leurs identités restent masquées. Le principe est simple : l’offensive s'effectue via un ordinateur intermédiaire qui répercute l’action vers le site victime. L’intérêt des attaques indirectes est d’utiliser cette autre machine pour profiter de sa puissance CPU, de sa mémoire, de sa bande passante, etc. Ce mode d'attaque s'appuie, entre autres, sur le logiciel FTP Bounce et a pour but de voler une identité pour permettre d'accéder à des données confidentielles lorsque le serveur filtre les adresses IP entrantes.

L’identification de l’attaquant se complique. Il est possible de remonter jusqu’à l’intermédiaire, mais remonter à la source s’avère plus difficile.

Les attaques indirectes par réponse

attaque indirecte


Il s’agit d’un dérivé de l’attaque précédemment décrite contenant les mêmes avantages du point de vue du cybercriminel.

Dans le cas présent, l’ordinateur intermédiaire n’est pas directement attaqué. Le hacker lui envoie simplement une requête. Lors de l’utilisation de cette machine, la réponse est envoyée à l’ordinateur victime et l’attaque se déploie.

Du fait de l’utilisation d’un ordinateur tiers, l’identification de l’attaquant est compliquée.

Les attaques de pages web

Les navigateurs web sont des logiciels qui affichent les pages web. Il en existe de nombreux sur le marché. Les plus connus sont Firefox, Chrome, Edge, Opera et Safari. Leur rôle est d’interpréter ce qu’ils reçoivent et de répondre aux différentes demandes. Ces données sont publiques et, par conséquent, accessibles de tous. Si le code affiché ne respecte pas les bonnes pratiques, il y a un risque de se faire pirater car des techniques existent également pour récupérer des données à partir du navigateur.

Voici donc comment on procède pour pirater une page : 

La structure d’une page, voire son arborescence, est consultable à partir de celle-ci. Il suffit de presser sur le clavier [CONTROL]+[U] ou faire un clic droit ‘code source de la page’. Le contenu de la page peut être sélectionné [CONTROL] + [A], copié [CONTROL]+[C] dans n’importe quel éditeur de texte, comme Bloc-note ou Notepad, puis enregistré sur le disque dur sous format HTML. Il faut alors supprimer tous les scripts inutiles comme les Javascripts et les fonctions qui valident les champs. Ensuite, il est nécessaire de modifier la balise en ajoutant un chemin relatif (complet) dans la balise FORM : <_form………action = http://www.monsite.com/login ………>. Lors de l’exécution de la page en local, on doit rentrer à nouveau les identifiants et mots de passe qui sont alors enregistrés en base de données. Un compte utilisateur est désormais créé et accessible bien qu’originellement inexistant.

Pour contrer ce type d'attaque, il est nécessaire de tester la provenance des données avant leurs insertions dans la base de données. L’exemple sur le test d'un formulaire est de vérifier si l'URL de la page correspond à la bonne page, par exemple, si les données envoyées proviennent bien de la page "contact.php" :

<?php

if ($_SERVER['HTTP_REFERER']=="contact.php")

{

     echo "page identique";

}

else

{

die (Erreur de provenance");

}

?>

De nombreux dossiers communs sont accessibles à partir du code source de la page, comme :

  • includes, inc, lib,etc,ini, conf
  • admin, adm, admnistrateur, administrator, erreurs, classes
  • hidden, protected, archives, bills, factures

Mais aussi :

  • les images : img, image, images ;
  • les librairies Javascript : js, javascript, lib.

A partir du navigateur, taper l’un des dossiers cités donnera accès à plusieurs éléments. Par exemple, https://www.votreSite.fr/www redirigera l’utilisateur vers :

directory

A partir de ce dossier, il est possible de trouver des documents, factures ou encore des dossiers assistants : .svn, .git, .ssh, .bash_history… Le fichier robots.txt fournit les informations sur les fichiers protégés, comme les codes d’accès à la base de données et, par conséquent, à la table utilisateur.

La solution à ce problème consiste à insérer un fichier index.php dans tous les dossiers et sous-dossiers. Ce dernier peut se présenter de la façon suivante :

<?php

header("Location: ../index.php");

?>

La fonction header permet, avec le langage PHP, d'envoyer un entête HTTP, c'est-à-dire de charger une nouvelle page web en perdant le chemin du bouton précédent.

header

Pour tester cette protection, prenons le cas de l’accès à un document. On trouvera cette URL dans une page web : http://votreSite/download/categorie/famille1/document.pdf . Le cybercriminel va essayer d'accéder à ce dossier en gardant juste le chemin http://votreSite/download/categorie/famille1/ mais se retrouvera alors directement à la racine du site web car le fichier index.php s'exécutera.

La barre de navigation est un autre point d'entrée pour accéder aux pages web d’un site internet.

Les liens peuvent se présenter de deux façons : http://votreURL/page=index.php ou http://votreURL/page=contact.php . Ces URLs montrent que le site internet appelle un même template pour afficher le contenu de la page. Le hacker peut utiliser ces adresses pour envoyer du code malicieux : http://votreURL/page=<script>alert (‘coucou’) ;</script> ou http://votreURL/page=&lt;script&gt;alert (&apos ;coucou&apos ;) ;&lt;/script&gt; Quelle que soit la façon d'envoyer un caractère, le navigateur saura l'interpréter comme indiqué dans le tableau.


tableau


Même en utilisant des filtres, la solution reste limitée. La meilleure consiste à mettre des liens clairs comme : http://votreURL/index.php ou http://votreURL/contact.php .

Les attaques via les formulaires

Un formulaire est une page composée d’un ou plusieurs champs pour accéder à des pages supplémentaires.

Le formulaire d’identification permet d’entrer dans un espace personnel, c’est-à-dire qu’un seul utilisateur peut y pénétrer. Un hacker ne cherche pas impérativement à obtenir le mot de passe d’un utilisateur lambda, il va plutôt s’efforcer de découvrir le mot de passe de l’utilisateur qui possède le plus de droits, comme l’administrateur du site, un super admin ou un ID 1.

L’erreur la plus courante consiste à conserver le même mot de passe entre les parties développement et production. Il n’est pas rare de trouver des mots de passe comme ‘ROOT’ ou ‘admin’ en production. Toutefois, même si le mot de passe est inconnu, il est possible d’accéder directement à la base de données en effectuant une petite injection SQL, comme suit :

password


L’image montre un formulaire d’identification avec 2 champs : login et mot de passe. Ce formulaire permet ensuite d’accès à l’espace privé :

<?php

$login = $_POST['login'];

$motpasse = $_POST['password'];

$sql="

SELECT id FROM user WHERE

login = $login

AND

motpasse = $motpasse

");

$resultat=query ($sql);

if ($resultat)

echo "Bienvenue à votre espace";

else

echo "Compte inconnu";

?>

Si aucune quote (guillemets) n'existe dans la requête SQL, il y a un risque d'envoi de code non-souhaité. Lors de l'envoi des données du formulaire, les identifiants sont inconnus. Par conséquent, il est recommandé d’envoyer des informations de ce type à partir d'un formulaire de saisie :

<?php

$login=" '' OR 1 ";

$motpasse=" '' OR 1 ";

?>

On obtient alors la requête suivante :

sql = "SELECT id FROM user WHERE login = '' OR 1 AND motpasse = '' OR 1 ";

Une fois la requête exécutée, elle retourne ce message :

Bienvenue à votre espace

On est alors connecté sans posséder de compte. Les conséquences sont désastreuses car les comptes utilisateurs et leurs données associées peuvent être volés : emails, numéros de cartes bancaires, coupons, clefs d’activations, etc.

La protection consiste à greffer des caractères spéciaux contenus dans les chaînes de caractères saisies par l’utilisateur. L’ajout de ces quotes permettra de bloquer l’insertion de code malhonnête. Par exemple, en PHP, il est possible d’incorporer la fonction addslashes à la variable envoyée par le formulaire :

<?php

$login = addslashes($login);

$motpasse = addslashes($motpasse);

?>

Et, par conséquent, la requête devient :

SELECT id FROM user WHERE login = \'\' OR 1 AND motpasse = \'\' OR 1

La réponse de la requête sera alors :

Compte inconnu

Ainsi, le hacker ne pourra plus utiliser cette technique pour accéder à l’espace personnel. Une autre solution existe et comporte une étape intermédiaire, car elle passe par une requête préparée.

Le champ « action » des formulaires peut également être pris pour cible. Il est important de faire attention aux différentes attaques car un pirate peut envoyer plusieurs offensives différentes d’un coup.

Pour se prémunir de cela, il est peut être intéressant d’ajouter une variable PHP_SELF aux chaînes de caractères. Elle retourne le script en cours d’exécution et renvoie le nom et le chemin du fichier en cours. La majorité du temps, celle-ci est utilisée dans le champ « action » d'un formulaire. Effectivement, son intitulé est utile uniquement lors de la conception d’un formulaire.

La fonction PHP_SELF s’écrit sous cette forme :

<?php

echo $_SERVER['PHP_SELF'];

?>

Si elle se trouve dans la page http://votreSite.fr/contact.php , vous obtiendrez /contact.php en l’utilisant. Dans le cas d’un formulaire, elle se place dans le champ action de la balise <form> et se déclenche quand l'internaute appuie sur le bouton "Envoyer".

L'utilisation de cette variable n'est pas obligatoire mais très utile. En effet, sans celle-ci, il est impossible de savoir le nom de la page correspondant à un commentaire laissé en bas d’un article par exemple.

texte


La mise en place de PHP_SELF dans un formulaire, se présente de la manière suivante :

<?php

if (isset ($_POST) && (sizeof($_POST) > 0))

{

echo "Votre saisie : ".$_POST['saisie']."<br />";

}

?>

<html>

<body>

<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">

Votre texte : <input type="text" name="saisie" />

<input type="submit" value="Submit" />

</form>

</body>

</html>

L'exemple montre que, dans une même page, il existe une partie saisie et une partie traitement. Les données envoyées seront traitées si l'action a été déclenchée.

Cependant, cette variable comporte aussi un risque au niveau de la sécurité car elle peut subir des attaques du type XSS. La solution pour sécuriser ce type d’attaque en PHP est d’utiliser la fonction htmlentities(). La ligne <form> se composera alors de :

<form method="POST" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>">

Il est indispensable de faire la même chose pour les variables saisies afin d’obtenir le résultat ci-dessous, sinon l'injection sera traitée.

echo "Votre saisie : ".htmlentities($_POST['saisie'])."<br />";


saisie texte

Les attaques de réseau

Il existe différentes techniques d’attaques via la ligne de commande, disponible sous Windows avec ‘CMD’ et sous Linux avec la console.

Les attaques de type ‘Déni de Service’ (DoS) vont envoyer de nombreuses requêtes en même temps, dont le but est de rendre inaccessible le site internet à cause d’un débordement de mémoire, communément appelé « Buffer Overflow », et ce, le temps de redémarrer le serveur. Il existe plusieurs façons d’arriver à saturation du serveur ou du firewall : le sync storm, avec un maximum de liaison TCP/IP possible, le système lock flood qui entre dans le fichier de log du firewall de manière assez régulière pour le saturer, le data flood ou encore l’open-close. Ces attaques sont effectuées par un groupe de personnes ou par de nombreuses machines intermédiaires.

Il n'y a pas vraiment de solutions miracles pour pallier à cela. Toutefois, les offres cloud et la gestion de sécurité régulière limitent les problèmes. Du côté serveur, il est possible d’installer un pare-feu, qui filtre l'entrée et la sortie de la passerelle. Une autre solution est d'ajouter un outil de détection d'intrusion sur la passerelle. Cependant, seuls un audit régulier et la mise en place d'intégration continue permettront de limiter le déploiement de l'attaque.

Les attaques de CMS et Framework

Avec un peu de connaissances techniques, il est facile de déterminer le CMS ou le Framework utilisé pour réaliser un site internet spécifique. Il suffit de regarder le code source de la page à partir du navigateur.

Les trois CMS les plus utilisés sur le marché sont :

·         Pour WordPress : https://votreURL.com/wp-content/xxx

·         Pour Joomla : ‘/plugins/system/jcemediabox/xxx’

·         Pour Drupal : https://votreURL.com/sites/all/modules/xxx

Ces informations, disponibles en clair, indiquent les chemins d’accès aux fichiers, aux modules...

Les attaques listées préalablement sont difficilement réalisables sur ces CMS, qui proposent nativement toutes les protections et solutions citées. Un hacker utilisera toutefois d’autres approches, comme les failles venant des modules ou plugins associés, mais aussi, celles détectées sur les sites les référençant comme CVE security ou CVE détails. En consultant ces sites, il est non seulement possible de découvrir les failles de sécurité et mais aussi les techniques à utiliser pour hacker un site internet depuis son origine. 

vulnerability trends

Il est donc important de se tenir informé de ces failles et de voir les différentes alertes listées :


SQL injection vulnerability
CVSS Scores and Vulnerability Types


De plus, prévoir une mise à jour régulière du CMS est indispensable pour éviter les mauvaises surprises.

Les outils

Pour aider les administrateurs à gérer et simuler les attaques, de nombreux outils sont disponibles sur le marché. Parmi eux, les grandes familles les plus répandues sont :

  • les plateformes de tests d’intrusion comme métasploit, Aircrack-ng ;
  • les tests de résistance d’un mot de passe comme John the ripper;
  • les sniffeurs et analyseurs de protocoles réseau et applicatif comme Wireshark ;
  • les scanners de ports et vulnérabilités comme nmap ;
  • les récupérations mot de passe comme Cain & Abel ;
  • les émulations navigateur web comme Paros proxy, charles proxy ;
  • les captures de requêtes, proxy applicatif comme Zed Attack proxy, Parox proxy ;
  • les audits des applications web comme Burp suite, spiderfoot, cerveau.

La majorité de ces logiciels sont libres ou en open source et donc faciles à se procurer.

CONCLUSION

De nos jours, le développement passe par l’utilisation de CMS ou de frameworks, dont l'amélioration se fait grâce à des plugins, modules et librairies. Chacun d’eux proposent des bonnes pratiques que les programmeurs doivent mettre en œuvre.

Toutefois, on dénombre toujours autant de failles, souvent liées à des erreurs humaines. Effectivement, même si les CMS ou les frameworks ont des niveaux de sécurité très élevés, les éléments complémentaires, comme les plugins, restent un maillon faible.

Il faut donc anticiper et simuler les attaques dès les premières phases de développement web si on souhaite les bloquer. Il est nécessaire d’intervenir aux niveaux du design, du code, du réseau et des outillages d’intégration et de déploiement continus (outils de type Jenkins, Bamboo, TeamCity, etc). Evidemment, il faut suivre et appliquer les mises à jour de logiciels avec le maximum de réactivité afin de déployer les correctifs liés aux failles détectées.


Aussi n’hésitez pas à visiter notre page web dédiée à la cyber-sécurité.

Parlons ensemble de vos projets. 

bouton contact