Les attaques directes
L’injection de code “côté serveur”

Que s’est-il passé ?
École municipale de Kelkepare
Inscription d’un nouvel élève
Prénom :
Le code ressemble à ça :
public void inscrireEleve(String prenom){
String maRequeteSQL = "INSERT INTO Students VALUES ('" + prenom + "')";
connectionSql.createStatement().executeQuery(maRequeteSQL);
}
Si on remplit dans le formulaire Robert'); DROP TABLE Students;--
La requète envoyée au serveur devient :
INSERT INTO Students VALUES ('Robert'); DROP TABLE Students;--')
Application Security Nightmare
Consulter tous les messages du forum en forgeant les requêtes
localhost:8080/api/messages/admin' and classified --
Injection SQL
Pourquoi ?
- Consulter des données confidentielles
- Altérer la base de données
Attaque DIRECTE
On remarque que ce type d’attaque se produit quand un langage fait appel à un autre langage. Un code java par exemple lance des requetes sql ou ldap moyennant ces chaines de caracteres.
"SELECT * FROM USER WHERE identifiant='" + username + "' AND password='" + password + "'";
à renseigner avec username=robichu et password=' OR '1'='1' -- pour se connecter en tant que M Robichu
La sécurité va donc consister essentiellement à repérer ces possibles manipulation de la chaînes, c’est à dire repérer les caracteres spéciaux du langage cible et les échapper selon les modes d’échappement du langages.
On réécriera ' OR '1'='1' -- en '' OR ''1''=''1'' --
Protection ACTIVE
Concrètement, on n’est pas les premieres à se dire qu’il faut échapper des caractères, il faut s’appuyer au maximum sur des bibliotheques éprouvées. Toujours dans le cas de sql :
- Utiliser des PreparedStatement
- Mieux, Utiliser des Frameworks qui font le boulot sans que l’on gère vraiment le sql (hibernate, …)
- Des bibliothèques que l’on garde à jour bien entendu
L’injection de code : le retour de la revanche
Security Nightmare
Nous allons maintenant déposer le fichier suivant sur le site
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h1>test</h1>
</body>
<%
Runtime.getRuntime().exec("notepad");
%>
</html>
Que se passe-t-il en essayant d’ouvrir le fichier ?
Exécution de code sur le serveur
- Mettre un fichier malicieux sur le serveur permettant l’éxécution de code à distance.
- Ici le code injecté sera du code éxécuté côté serveur (java sur jsp, php)
L’injection de code “côté serveur”
Exécution de code sur le serveur au plus près du système
Rebond sur le SI possible si :
- flux larges entre les différents serveurs
- compte éxécutant le code à haut privilège
Nombreuses possibilités : aussi bien des traitements dans l’application non prévus que des opérations directement sur le système d’exploitation
Par exemple réussir à placer sur le serveur une jsp contenant :
<%Runtime.getRuntime().exec("less /confidentiel/data");%>
- Un langage de programmation lance indirectement des commandes système
Autre exemple avec natas
Quelques niveaux plus tard :
- Natas 12 (mot de passe de natas12 :
YWqo0pjpcXzSIl5NMAVxg12QxeC1w9QG)- Le but est de découvrir le mot de passe de natas13 situé dans /etc/natas_webpass/natas13
- Hint : passthru est une fonction php permettant d’éxécuter sur le sytème du code arbitraire
Sécurité :
- Contrôler les entrées utilisateurs et en particulier pour les fichiers :
- le type MIME des entrées, la cohérence type attendu et contenu autant que possible
- l’extention de fichier nommé car le serveur et/ou le navigateur peut interpréter différemment un fichier selon son nommage
Sécurité :
- Côté prod :
- “chroot” des applications ou machines limité à un traitement
- utilisateur éxécutant l’application avec droit limités (ce n’est pas le compte root/admin qui démarre le tomcat)
- flux limités entre machines
L’injection de code : Synthèse
- Un sujet central : l’entrée untilisateur
Mais qu’est ce qu’une entrée utilisateur ?
- Requête et Paramètres de requête
- Corps de requête (contenu des requête POST et PUT) : réponse à un formulaire, fichier
- Cookies
- Entetes HTTP (Authorization, Location, Host, User-Agent, Referrer, Cookies, CORS, …)
Controle des chaines entrées et échappement de tous les caratères interprétables en html, en sql,… selon la situation.
Un développeur web peut se contenter de surveiller ces entrées mais en réalité, les failles peuvent survenir sur n’importe quel bit d’un échange réseau.
Une attaque réelle pour illustrer
- Log4Shell Decembre 2021
- https://fr.wikipedia.org/wiki/Log4Shell
- Démo sur projet dédié exploit/log4shell
- Exploiter avec https://canarytokens.org/generate