Julien Charpentier – Directeur R&D
Cyrille Grandval – Directeur Général
ZF2 Sécurité
« Sécuriser mes applications avec ZF2...
Qui sommes nous?
Cyrille Grandval
Zend Evangelist (membre Z-Team)
Consultant PHP / Sécurité
Professeur / Formateur PHP et
...
ZF2 – Composants de sécurité
• ZendAuthentification
• ZendDb
• ZendCaptcha
• ZendCrypt
• ZendEscaper
• ZendFilter
• ZendIn...
Première (et seule) vérité
Ne vous fiez à
personne…
Les hackers ne se soucient pas de mon
site !
Sécurité – Mantra du No®ris (que)
Filtre et valide les
données entrantes,
encode les données
sortantes !
Sécurité ZF2 – données entrantes
• S’assurer de la provenance des données
(ZendCaptcha)
• Filtrer les données utilisateurs...
ZendCaptcha
• Captcha => Test de défi-réponse utilisé en
informatique
• S'assure qu'une réponse n'est pas générée par
un o...
ZendCaptcha
Plusieurs adaptateurs
• ZendCaptchaDumb
• ZendCaptchaFiglet
• ZendCaptchaImage
• ZendCatpchaReCaptcha
ZendCaptchaImage
Création et configuration du captcha
Ajout dans un formulaire
ZendCaptchaImage
ZendCaptcha
ZendFilter
• Appliquer un ou plusieurs traitement sur une donnée
• Un filtre est un transformateur -> retourne une donnée
...
ZendFilter
• ZendFilterBlacklist
• ZendFilterBoolean
• ZendFilterCallback
• ZendFilterDigits
• ZendFilterDecrypt
• ZendFil...
ZendFilter - utilisation
• ZendFilterStripTags
• ZendFilterToInt
• ZendFilterWhitelist
Exemples de filtrage d’une donnée e...
ZendFilter - utilisation
Intégration dans un formulaire
ZendFilter - utilisation
ZendFilter – aller plus loin
• Appeler un filtre de manière statique (ZendFilterStaticFilter)
• Définir un filtre avec une...
ZendFilter
ZendValidator
• Valide le fait qu’une donnée reçue en entrée
respecte certains critères prédéfinis
Un validateur contient ...
ZendValidator
• ZendValidatorDbRecordExi
sts
• ZendValidatorCallback
• ZendValidatorCreditCard
• ZendValidatorDigits
• Zen...
ZendValidator - utilisation
Exemples de validation d’une donnée entrante
• ZendValidatorDigits
• ZendValidatorEmailAddress
ZendValidator - utilisation
Intégration dans un formulaire
ZendValidator - utilisation
ZendValidator – aller plus loin
• Appeler un validator de manière statique
(ZendValidatorStaticValidator)
• Définir un val...
ZendValidator
ZendInputFilter
Un filtre d’entrée permet de définir une collection de filtres et de validateurs
applicable sur n’importe ...
ZendInputFilter - utilisation
Exemple de création d’un filtre d’entrée
ZendInputFilter - utilisation
ZendInputFilter - utilisation
Exemple d’utilisation du filtre d’entrée
Avec un formulaire
ZendInputFilter
Sécurité – données sortantes
Composants ZF2
• ZendEscaper
• ZendViewHelperEscape*
• EscapeCss
• EscapeHtml
• EscapeHtmlAtt...
ZendEscaper
• Permet de transformer une donnée destinée à
l’affichage afin que celle-ci ne soit pas interprétable par
le n...
ZendEscaper - utilisation
Exemple d’encodage de données sortantes
Ou directement dans une vue
ZendEscaper
Top 10 OWASP 2013
A1 – Injection
A2 – Violation de Gestion d’Authentification et de Session
A3 – Cross-Site Scripting (XSS...
A1 – Injection
• Une donnée entrante brute est insérée dans une
commande liée à une interprétation
• Plus connu : injectio...
A1 – Injection
• Paramètres anonymes
• Paramètres nommés
A2 – Violation de Gestion d’Authentification et de Session
• Mot de passes utilisateurs incorrectement stockés
• Divinatio...
A2 – Violation de Gestion d’Authentification et de Session
Exemple d’utilisation de ZendSessionConfig et
ZendSessionSessio...
Exemple de configuration
Exemple d’utilisation de ZendSessionManager
A2 – Violation de Gestion d’Authentification et de Se...
A3 – Cross-Site Scripting (XSS)
• Faille la plus répandue
• Inclusion direct de code script fourni par l’utilisateur
dans ...
A4 – Références directes non sécurisées à un objet
• Objet interne fait directement référence à une ressource (fichier,
ré...
A4 – Références directes non sécurisées à un
objet
Gestion des droits
Vérifier qu’un utilisateur a bien accès à un type de...
A4 – Références directes non sécurisées à un
objet
ZendAuthentification
Fournit une API permettant de gérer l’authentifica...
A4 – Références directes non sécurisées à un
objet
Exemple d’utilisation de ZendAuthentification
ZendPermissionsAcl et ZendPermissionsRbac
Gestion des ACL (Access Control List) et des Rbac (Role-
based Access Control) d...
A4 – Références directes non sécurisées à un
objet
Exemple d’utilisation des Acl
A4 – Références directes non sécurisées à un
objet
A4 – Références directes non sécurisées à un
objet
A4 – Références directes non sécurisées à un
objet
A4 – Références directes non sécurisées à un
objet
A5 – Mauvaise configuration sécurité
Configuration sécurisée doit être définie, mise en œuvre, et
maintenue au jour le jou...
A6 – Exposition de donnés sensibles
• Crypter les données sensibles
• Hacher les mots de passes avec des
algorithmes forts...
A6 – Exposition de donnés sensibles
ZendCrypt
Ce composant permet de mettre en œuvre une cryptographie
poussée de manière ...
A6 – Exposition de donnés sensibles
ZendCryptBlockCipher
C’est ce composant que nous allons utiliser pour encrypter et déc...
A6 – Exposition de donnés sensibles
BlockCipher - options par défaut
• Algorithme AES (clé de 256 bits)
• Mode CBC
« Ciphe...
A6 – Exposition de donnés sensibles
Exemple d’utilisation de ZendCryptBlockCipher
A6 – Exposition de donnés sensibles
ZendCryptPasswordBCrypt
Composant utilisé pour encrypter et décrypter les mots de pass...
A6 – Exposition de donnés sensibles
Exemple d’utilisation de ZendCryptPasswordBcrypt
A8 – Cross-site Request Forgery (CSRF)
• Faire envoyer une requête par le navigateur d’un
utilisateur, à son insu, pour ef...
A8 – Cross-site Request Forgery (CSRF)
Mise en place d’un token anti-CSRF dans vos formulaires
A9 – Utilisation de composants avec des vulnérabilités
connues
Liste de diffusion des failles de sécurité ZF2
http://frame...
Des questions ??
Merci !
Sécuriser mes applications avec ZF2
Sécuriser mes applications avec ZF2
Prochain SlideShare
Chargement dans…5
×

Sécuriser mes applications avec ZF2

992 vues

Publié le

Conférence sur la sécurité des applications avec Zend Framework 2 de Julien Charpentier et Cyrille Grandval au Darkmira Tour, le 18 Juin 2015 à l'ESGI.

Publié dans : Internet
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
992
Sur SlideShare
0
Issues des intégrations
0
Intégrations
3
Actions
Partages
0
Téléchargements
12
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive
  • Alors on peut se demander si, 100% de couverture de code correspond à une application bien testée.

    J’aimerai le croire.
  • Sécuriser mes applications avec ZF2

    1. 1. Julien Charpentier – Directeur R&D Cyrille Grandval – Directeur Général ZF2 Sécurité « Sécuriser mes applications avec ZF2 » 18.06.2015 Darkmira Tour Zend Day 2015
    2. 2. Qui sommes nous? Cyrille Grandval Zend Evangelist (membre Z-Team) Consultant PHP / Sécurité Professeur / Formateur PHP et Sécurité des applications Web cgrandval@darkmira.fr @CyrilleGrandval Julien Charpentier Consultant / Architecte PHP Professeur / Formateur PHP jcharpentier@darkmira.fr @jcharpentier_ Co-auteur du livre « Préparation à la certification Zend Certified PHP Engineer - ZCPE » aux éditions ENI
    3. 3. ZF2 – Composants de sécurité • ZendAuthentification • ZendDb • ZendCaptcha • ZendCrypt • ZendEscaper • ZendFilter • ZendInputFilter • ZendPermissions • ZendMath • ZendValidator
    4. 4. Première (et seule) vérité Ne vous fiez à personne…
    5. 5. Les hackers ne se soucient pas de mon site !
    6. 6. Sécurité – Mantra du No®ris (que) Filtre et valide les données entrantes, encode les données sortantes !
    7. 7. Sécurité ZF2 – données entrantes • S’assurer de la provenance des données (ZendCaptcha) • Filtrer les données utilisateurs (ZendFilter) • Valider les données utilisateurs (ZendValidate) • Etablir une stratégie de filtrage (ZendInputFilter)
    8. 8. ZendCaptcha • Captcha => Test de défi-réponse utilisé en informatique • S'assure qu'une réponse n'est pas générée par un ordinateur L'acronyme « CAPTCHA » est basé sur le mot capture, et vient de l'anglais completely automated public Turing test to tell computers and humans apart Permet de s’assurer qu’un formulaire est bien soumis par un utilisateur.
    9. 9. ZendCaptcha Plusieurs adaptateurs • ZendCaptchaDumb • ZendCaptchaFiglet • ZendCaptchaImage • ZendCatpchaReCaptcha
    10. 10. ZendCaptchaImage Création et configuration du captcha Ajout dans un formulaire
    11. 11. ZendCaptchaImage
    12. 12. ZendCaptcha
    13. 13. ZendFilter • Appliquer un ou plusieurs traitement sur une donnée • Un filtre est un transformateur -> retourne une donnée après l’avoir nettoyée, tronquée, cryptée, compressée voire même traduite ou convertie • Méthode filter qui retourne la donnée d’entrée « nettoyée » Permet de transformer une source de données externe
    14. 14. ZendFilter • ZendFilterBlacklist • ZendFilterBoolean • ZendFilterCallback • ZendFilterDigits • ZendFilterDecrypt • ZendFilterEncrypt • ZendFilterHtmlEntities • ZendFilterPregReplace • ZendFilterStripNewlines • ZendFilterStripTags • ZendFilterToInt • ZendFilterWhiteList • ZendI18nFilter* Listes non exhaustive des filtres prédéfinis
    15. 15. ZendFilter - utilisation • ZendFilterStripTags • ZendFilterToInt • ZendFilterWhitelist Exemples de filtrage d’une donnée entrante
    16. 16. ZendFilter - utilisation Intégration dans un formulaire
    17. 17. ZendFilter - utilisation
    18. 18. ZendFilter – aller plus loin • Appeler un filtre de manière statique (ZendFilterStaticFilter) • Définir un filtre avec une fonction de callback (ZendFilterCallback) • Créer ses filtres personnels (étendre ZendFilterAbstractFilter et en informer le PluginManager)
    19. 19. ZendFilter
    20. 20. ZendValidator • Valide le fait qu’une donnée reçue en entrée respecte certains critères prédéfinis Un validateur contient une méthode isValid qui retourne la valeur TRUE si la donnée reçue respecte les critères, FALSE dans le cas contraire. Permet de s’assurer que le format d’une source de données externe est conforme à nos attentes.
    21. 21. ZendValidator • ZendValidatorDbRecordExi sts • ZendValidatorCallback • ZendValidatorCreditCard • ZendValidatorDigits • ZendValidatorEmailAddress • ZendValidatorGreaterThan • ZendValidatorInArray • ZendValidatorLessThan • ZendValidatorRegexp • ZendValidatorStringLengt h • ZendValidatorUri • ZendI18nValidator* Listes non exhaustive des validateurs prédéfinis
    22. 22. ZendValidator - utilisation Exemples de validation d’une donnée entrante • ZendValidatorDigits • ZendValidatorEmailAddress
    23. 23. ZendValidator - utilisation Intégration dans un formulaire
    24. 24. ZendValidator - utilisation
    25. 25. ZendValidator – aller plus loin • Appeler un validator de manière statique (ZendValidatorStaticValidator) • Définir un validateur avec une fonction de callback (ZendValidatorCallback) • Créer ses validators personnels (étendre ZendValidatorAbstractValidator et en informer le
    26. 26. ZendValidator
    27. 27. ZendInputFilter Un filtre d’entrée permet de définir une collection de filtres et de validateurs applicable sur n’importe quel type de données d’entrées (formulaires, paramètres GET, COOKIE, entête HTTP, etc…) dont le nom est connu. Il est ainsi possible de définir des filtres et validateurs pour l’ensemble des données utilisées par une application. Un filtre d’entrée contient une méthode isValid qui retourne la valeur TRUE si la donnée reçue respecte les critères, FALSE dans le cas contraire Permet de définir une stratégie globale de validation d’une source de données externe.
    28. 28. ZendInputFilter - utilisation Exemple de création d’un filtre d’entrée
    29. 29. ZendInputFilter - utilisation
    30. 30. ZendInputFilter - utilisation Exemple d’utilisation du filtre d’entrée Avec un formulaire
    31. 31. ZendInputFilter
    32. 32. Sécurité – données sortantes Composants ZF2 • ZendEscaper • ZendViewHelperEscape* • EscapeCss • EscapeHtml • EscapeHtmlAttr • EscapeJs • EscapeUrl
    33. 33. ZendEscaper • Permet de transformer une donnée destinée à l’affichage afin que celle-ci ne soit pas interprétable par le navigateur • Un encodeur contient plusieurs méthodes permettant l’encodage suivant le contexte d’affichage (html, css, js, url ou attribut html) Permet de s’assurer que les données s’affichent telles que nous le voulons.
    34. 34. ZendEscaper - utilisation Exemple d’encodage de données sortantes Ou directement dans une vue
    35. 35. ZendEscaper
    36. 36. Top 10 OWASP 2013 A1 – Injection A2 – Violation de Gestion d’Authentification et de Session A3 – Cross-Site Scripting (XSS) A4 – Références directes non sécurisées à un objet A5 – Mauvaise configuration Sécurité A6 – Exposition de données sensibles A7 – Manque de contrôle d’accès au niveau fonctionnel A8 - Falsification de requête intersite (CSRF) A9 - Utilisation de composants avec des vulnérabilités connues A10 – Redirections et Renvois Non Validés
    37. 37. A1 – Injection • Une donnée entrante brute est insérée dans une commande liée à une interprétation • Plus connu : injection SQL mais bien d’autres : LDAP, Xpath, ... 1. Valider les données entrantes 2. Requêtes paramétrées (préparées, procédures stockées)
    38. 38. A1 – Injection • Paramètres anonymes • Paramètres nommés
    39. 39. A2 – Violation de Gestion d’Authentification et de Session • Mot de passes utilisateurs incorrectement stockés • Divination des mots de passes utilisateurs et des identifiants de session • Permettre l’utilisation des identifiants de session dans l’URL • Pas de timeout de session • Pas de renouvellement d’identifiant de session après changement de droits • Utilisation de connexion non sécurisées • Mauvaise configuration
    40. 40. A2 – Violation de Gestion d’Authentification et de Session Exemple d’utilisation de ZendSessionConfig et ZendSessionSessionManager
    41. 41. Exemple de configuration Exemple d’utilisation de ZendSessionManager A2 – Violation de Gestion d’Authentification et de Session
    42. 42. A3 – Cross-Site Scripting (XSS) • Faille la plus répandue • Inclusion direct de code script fourni par l’utilisateur dans la réponse au navigateur • XSS réfléchi • XSS stocké • XSS basé sur DOM Validation des données d’entrées et encodage des données de sortie
    43. 43. A4 – Références directes non sécurisées à un objet • Objet interne fait directement référence à une ressource (fichier, répertoire, enregistrement en base de données) sans contrôle d’accès spécifique • Par exemple, modification d’un id dans l’url pour accéder à une autre ressource Vérifier systématiquement si un utilisateur à accès à une ressource • Mise en place d’ACL simple, maintenable et clair • Vérifier en base de données à chaque action
    44. 44. A4 – Références directes non sécurisées à un objet Gestion des droits Vérifier qu’un utilisateur a bien accès à un type de ressource défini • ZendAuthentification • ZendPermissionsAcl ou ZendPermissionsRbac
    45. 45. A4 – Références directes non sécurisées à un objet ZendAuthentification Fournit une API permettant de gérer l’authentification d’un utilisateur ZendAuthentificationAdapter Plusieurs adaptateurs disponibles : • Base de données • Digest • HTTP • LDAP • Callback
    46. 46. A4 – Références directes non sécurisées à un objet Exemple d’utilisation de ZendAuthentification
    47. 47. ZendPermissionsAcl et ZendPermissionsRbac Gestion des ACL (Access Control List) et des Rbac (Role- based Access Control) de manière souple et intuitive. A4 – Références directes non sécurisées à un objet
    48. 48. A4 – Références directes non sécurisées à un objet Exemple d’utilisation des Acl
    49. 49. A4 – Références directes non sécurisées à un objet
    50. 50. A4 – Références directes non sécurisées à un objet
    51. 51. A4 – Références directes non sécurisées à un objet
    52. 52. A4 – Références directes non sécurisées à un objet
    53. 53. A5 – Mauvaise configuration sécurité Configuration sécurisée doit être définie, mise en œuvre, et maintenue au jour le jour • Ne pas afficher les messages d’erreurs / stacktrace • Modifier les login et mot de passes par défaut des applications utilisées • Mettre à jour sa version de PHP • Mettre à jour ses bibliothèques tierces • Bloquer tous les ports inutilisés
    54. 54. A6 – Exposition de donnés sensibles • Crypter les données sensibles • Hacher les mots de passes avec des algorithmes forts • Protéger les données sensibles comme données patients, cartes bleues, ... • md5 ou sha1 avec ou sans grain de sel n’est plus suffisamment sécurisée • Recommandé d’utiliser aujourd’hui bcrypt, scrypt ou PBKDF2
    55. 55. A6 – Exposition de donnés sensibles ZendCrypt Ce composant permet de mettre en œuvre une cryptographie poussée de manière simple et intuitive. Liste des composants • ZendCryptBlockCipher • ZendCryptHash • ZendCryptHmac • ZendCryptKeyDerivation • ZendCryptPassword • ZendCryptPublicKey • ZendCryptSymmetic
    56. 56. A6 – Exposition de donnés sensibles ZendCryptBlockCipher C’est ce composant que nous allons utiliser pour encrypter et décrypter les données sensibles de l’application (cryptage symétrique). Il gère aussi l’authentification (HMAC). L’encryptage utilise l’adapter Mcrypt. Liste des méthodes utiles de l’API • setKey($key) • encrypt($data) • decrypt($data)
    57. 57. A6 – Exposition de donnés sensibles BlockCipher - options par défaut • Algorithme AES (clé de 256 bits) • Mode CBC « Cipher Block Chaining » ou Enchaînement des blocs • HMAC (SHA-256) « keyed-hash message authentication code » • Mode PKCS7 (RFC 5652) « Public Key Cryptographic Standards » ou Standard de syntaxe de message cryptographique • PBKDF2 « Password-Based Key Derivation Function 2» comme fonction de dérivation de clé pour la génération des clés de cryptage et d’authentification • Random IV pour générer le grain de sel
    58. 58. A6 – Exposition de donnés sensibles Exemple d’utilisation de ZendCryptBlockCipher
    59. 59. A6 – Exposition de donnés sensibles ZendCryptPasswordBCrypt Composant utilisé pour encrypter et décrypter les mots de passe de l’application Liste des méthodes utiles de l’API • create($password) • verify($password, $hash) • setSalt($salt) avec $salt chaine optionnelle de 16 caractères minimum • setCost($cost) avec $cost entier compris entre 4 et 31 (14 par défaut)
    60. 60. A6 – Exposition de donnés sensibles Exemple d’utilisation de ZendCryptPasswordBcrypt
    61. 61. A8 – Cross-site Request Forgery (CSRF) • Faire envoyer une requête par le navigateur d’un utilisateur, à son insu, pour effectuer une action • Les navigateurs envoient automatiquement les informations d’authentification tels que les cookies de session Inclure un jeton unique dans un champ caché (pour un formulaire), dans une url( pour les liens)
    62. 62. A8 – Cross-site Request Forgery (CSRF) Mise en place d’un token anti-CSRF dans vos formulaires
    63. 63. A9 – Utilisation de composants avec des vulnérabilités connues Liste de diffusion des failles de sécurité ZF2 http://framework.zend.com/security/advisories/
    64. 64. Des questions ?? Merci !

    ×