Falsification de requête intersite (CSRF)
Description :
L'idée de base est d'attirer un utilisateur vers une page où son navigateur lancera une requête POST ou GET vers le CMS que vous attaquez.
Imaginez que vous connaissez l'adresse électronique d'un administrateur de site utilisant un CMS. Envoyez-lui une page web amusante avec ce que vous voulez dedans. Dans cette page, vous créez un formulaire avec les données utilisées par le panneau d'administration du CMS pour créer un nouvel utilisateur administrateur. Envoyez ces données au panneau d'administration du site, avec le résultat dans une iframe cachée de votre page web. Voilà, vous avez créé votre propre compte administrateur.
Comment la prévenir :
La méthode habituelle consiste à générer un nonce aléatoire de courte durée (15 minutes à une heure) dans tous vos formulaires. Lorsque votre CMS reçoit les données d'un formulaire, il vérifie d'abord si le nonce est correct. Si ce n'est pas le cas, les données ne sont pas utilisées.
Exemples de CMS :
Plus d'informations :
Sur le wikipedia et sur la page Projet OWASP .
Mauvais stockage des mots de passe
Description :
Imaginez que votre base de données soit piratée et publiée sur quelque chose comme wikileak. Sachant qu'une grande partie de vos utilisateurs utilisent le même login et mot de passe pour de nombreux sites web, voulez-vous qu'ils soient faciles à obtenir ?
Non. Vous devez atténuer les dommages causés si les données de votre base deviennent publiques.
Comment la prévenir :
- Une première idée est de les hacher. Ce qui est une mauvaise idée à cause de tables arc-en-ciel (même si le hachage n'est pas md5 mais sha512 par exemple).
- Deuxième idée : ajouter un sel aléatoire unique avant le hachage pour que les pirates aient à forcer chaque mot de passe. Le problème est que le pirate peut calculer beaucoup de hashs rapidement.
- L'idée actuelle est donc de faire en sorte que le hachage des mots de passe soit lent : vous ne vous en souciez pas car vous ne le faites pas souvent. Mais l'attaquant pleurera quand il passera de 1000 hashs générés par ms à 1.
Pour faciliter le processus, vous pouvez utiliser la bibliothèque phpass développé par un gourou des mots de passe.
Exemples de CMS :
Plus d'informations :
Le site page phpass .
Cross Site Scripting (XSS)
Description
Le but de ces attaques est de faire en sorte que votre site Web affiche un script qui sera exécuté par votre utilisateur légitime.
Il en existe deux sortes : persistants ou non. La première provient généralement de quelque chose que votre utilisateur peut sauvegarder, l'autre compte sur les paramètres donnés par une requête envoyée. Voici un exemple, non persistant :
<?php
if(!is_numeric($_GET['id'])){
die('The id ('.$_GET['id'].') is not valid');
}
?>
Maintenant, votre attaquant peut juste envoyer des liens comme http://www.example.com/vulnerable.php?id=<script>alert('XSS')</script>
Comment la prévenir
Vous devez filtrer tout ce que vous envoyez au client. Le moyen le plus simple est d'utiliser htmlspecialchars si vous ne voulez pas laisser votre utilisateur sauvegarder du html. Mais, lorsque vous les laissez produire du html (soit leur propre html, soit du html généré par d'autres choses comme le bbcode), vous devez être très prudent. Voici un vieil exemple utilisant l'événement "onerror" de la balise img : Vulnérabilité de vBulletin . Ou vous avez l'ancien Samy de Myspace .
Exemples de CMS :
Plus d'informations :
Vous pouvez vérifier wikipedia y OWASP . Vous avez également beaucoup de vecteur XSS sur ha.ckers page.
Injection d'en-tête de courrier
Description :
Les en-têtes de courrier sont séparés par le CRLF ( \r\n
) séquence. Lorsque vous utilisez certaines données de l'utilisateur pour envoyer des courriers (par exemple, pour le champ "From :" ou "To :"), il peut injecter d'autres en-têtes. Avec cela, ils peuvent envoyer des mails anonymes depuis votre serveur.
Comment la prévenir :
Filtrez tous les \n
, \r
, %0a
y %0d
dans vos en-têtes.
Exemples de CMS :
Plus d'informations :
Wikipedia est un bon début, comme d'habitude.
Injection SQL
Description :
Le vieux classique. Cela se produit lorsque vous formulez une requête SQL en utilisant une entrée directe de l'utilisateur. Si cette entrée est conçue comme il se doit, l'utilisateur peut faire exactement ce qu'il veut.
Comment la prévenir :
Simple. Ne formez pas de requêtes SQL avec la saisie de l'utilisateur. Utilisez requêtes paramétrées . Considérez toute entrée qui n'est pas codée par vous-même comme une entrée utilisateur, qu'elle provienne du système de fichiers, de votre propre base de données ou d'un service Web, par exemple.
Exemple de CMS :
Plus d'informations :
Wikipedia y OWASP ont de très bonnes pages sur le sujet.
Fractionnement de la réponse Http
Description :
Comme les en-têtes de courrier électronique, les en-têtes http sont séparés par la séquence CLRF. Si votre application utilise l'entrée de l'utilisateur pour produire des en-têtes, il peut utiliser cette séquence pour créer les siens.
Comment la prévenir :
Comme pour les e-mails, filtrez \n
, \r
, %0a
y %0d
des caractères de la saisie de l'utilisateur avant de l'utiliser comme partie d'un en-tête. Vous pouvez également urlencode vos en-têtes.
Exemples de CMS :
Plus d'informations :
Je vous laisse deviner un peu où vous pouvez trouver beaucoup d'informations sur ce type d'attaque. OWASP y Wikipedia .
Détournement de session
Description :
Dans ce cas, l'attaquant veut utiliser la session d'un autre utilisateur légitime (et, espérons-le, authentifié). Pour cela, il peut soit changer son propre cookie de session pour qu'il corresponde à celui de la victime, soit faire en sorte que la victime utilise son propre identifiant de session (celui de l'attaquant).
Comment la prévenir :
Rien ne peut être parfait ici : - si l'attaquant vole le cookie de la victime, vous pouvez vérifier que la session de l'utilisateur correspond à son IP. Mais cela peut rendre votre site inutile si les utilisateurs légitimes utilisent un proxy qui change souvent d'IP. - si l'attaquant fait en sorte que l'utilisateur utilise son propre ID de session, utilisez simplement session_regenerate_id pour changer l'ID de session d'un utilisateur lorsque ses droits changent (connexion, déconnexion, accès à la partie admin du site web, etc.)
Exemples de CMS :
Plus d'informations :
Wikipedia page sur le sujet.
Autre
- User DoSing : si vous empêchez le bruteforcing des tentatives de login en désactivant les noms d'utilisateurs essayés et non l'IP d'où proviennent les tentatives, n'importe qui peut bloquer tous vos utilisateurs en 2mn. Même chose lors de la génération de nouveaux mots de passe : ne désactivez pas l'ancien jusqu'à ce que l'utilisateur confirme le nouveau (en se connectant avec lui par exemple).
- Utiliser l'entrée de l'utilisateur pour faire quelque chose sur votre système de fichiers. Filtrez cela comme s'il s'agissait d'un cancer mélangé à du sida. Cela concerne l'utilisation de include et require sur des fichiers dont le chemin est fait en partie à partir de l'entrée de l'utilisateur.
- Utilisation de eval , système , exec ou quoi que ce soit de ce genre avec l'entrée de l'utilisateur.
- Ne mettez pas les fichiers que vous ne voulez pas rendre accessibles sur le web dans le répertoire accessible sur le web.
Vous avez beaucoup de choses que vous pouvez lire sur le OWASP page.
4 votes
+1 grande question, quelque chose de spécial à savoir pour tout le monde :)
3 votes
Il n'y a pas assez de cms php sur le marché ?
7 votes
Devrait être un wiki communautaire ?
0 votes
@Byron - Je pensais que quelqu'un pourrait dire quelque chose de ce genre. Pour répondre, aucun des populaires ne répondait à mes besoins pour la façon dont je voulais travailler en tant que développeur. J'ai aussi l'impression que l'interface d'administration pourrait être plus facile pour l'utilisateur final. Le temps nous dira si d'autres ressentent la même chose ;-)
1 votes
Je me demande pourquoi tout le monde saute pour upvoter une question aussi inutile. Cela n'a rien à voir avec la sécurité. On ne peut pas apprendre la sécurité à partir des erreurs stupides de quelqu'un. La sécurité doit être un système, pas quelques rustines.
4 votes
Shrapnel - N'hésitez pas à suggérer des approches de sécurité au niveau du système. Comme je suis en train de créer le CMS, tout, de l'architecture aux détails les plus infimes, peut faire l'objet de suggestions.
0 votes
Ce serait hors sujet par rapport à cette question
1 votes
Ça me paraît tout à fait pertinent. Beaucoup de gens peuvent négliger des choses simples comme la vérification de chaque entrée non seulement pour l'injection SQL mais aussi pour l'injection JS.
0 votes
L'injection SQL est un mythe. Il n'y a pas d'injection sur syntaxiquement correct données. Allez savoir. La protection contre l'injection de XSS doit être un système, basé sur des connaissances approfondies, et non sur des histoires drôles que le PO semble avoir recueillies.
0 votes
Duplicata possible de Ce qu'un programmeur doit savoir avant de créer un site Web
0 votes
@George - Bien que la question à laquelle cette question fait référence soit très utile, elle est plus généralisée. Celle-ci est axée spécifiquement sur la sécurité, avec la demande supplémentaire d'exemples historiques de sécurité dans d'autres CMS PHP.
0 votes
@Col. Shrapnel - La question a été modifiée pour que la sécurité au niveau du système soit plus proche du sujet. Encore une fois, vos suggestions spécifiques seraient appréciées.