Table of Contents
Description
Cette attaque consiste à changer les identificateurs de ressources utilisées par une application pour effectuer une tâche malveillante. Lorsqu'une application permet à l'utilisateur d'entrer des données pour définir une ressource, comme un nom de fichier ou le numéro de port, ces données peuvent être manipulées pour exécuter ou d'accéder à différentes ressources.
Afin d'être correctement exécutée, l'attaquant doit avoir la possibilité de spécifier un identifiant de ressource par l'intermédiaire d'un formulaire et l'application doit permettre son exécution.
Le type de ressource affectée par l'entrée utilisateur indique le type de contenu qui peut être exposé. Par exemple, une application qui permet la saisie de caractères spéciaux comme virgule, slash et anti-slash est fragile lorsque cette saisie est utilisée dans des méthodes qui interagissent avec le système de fichiers.
L'attaque par injection de ressources met l'accent sur l'accès aux ressources autres que le système de fichiers local. L'accès à ces dernières fait appel à une technique d'attaque différente connue sous le nom « Path Manipulation ».
Exemples
Exemple 1
Les exemples suivants représentent une application qui récupère un numéro de port à partir d'une requête HTTP et crée un socket avec ce numéro de port sans aucune validation. En utilisant un proxy un attaquant peut modifier ce port et obtenir un raccordement direct (socket) avec le serveur.
Code Java:
String rPort = request.getParameter("remotePort");
...
ServerSocket srvr = new ServerSocket(rPort);
Socket skt = srvr.accept();
...
Code .Net.:
int rPort = Int32.Parse(Request.get_Item("remotePort "));
...
IPEndPoint endpoint = new IPEndPoint(address,rPort);
socket = new Socket(endpoint.AddressFamily,
SocketType.Stream, ProtocolType.Tcp);
socket.Connect(endpoint);
...
Exemple 2
Cet exemple est le même que le précédent, mais il obtient le numéro de port à partir de requêtes CGI en utilisant C + +:
char* rPort = getenv("remotePort ");
...
serv_addr.sin_port = htons(atoi(rPort));
if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0)
error("ERROR connecting");
...
Exemple 3
Cet exemple en PLSQL / TSQL obtient un chemin d'URL à partir d'un CGI et télécharge le fichier qu'il contient. Si un utilisateur modifie le chemin d'accès ou le nom de fichier, il est possible de télécharger d'autres fichiers du serveur:
...
filename := SUBSTR(OWA_UTIL.get_cgi_env('PATH_INFO'), 2);
WPG_DOCLOAD.download_file(filename);
...
