XML Injection dans une requête soap

XML Injection dans une requête soap - Java - Programmation

Marsh Posté le 27-04-2009 à 16:44:36    

Bonjour,
 
J'ai un problème avec les web services en Java.
 
J'ai créé ce web service:
 
1. Interface du web service

Code :
  1. @WebService (name="MyWebService" )
  2. @SOAPBinding (style=Style.RPC)
  3. public interface MyWebService {
  4.    
  5.      @WebMethod
  6.      public String doLogin(@WebParam (name="lastname" ) String lastname,
  7.             @WebParam (name="firstname" ) String firstname,
  8.             @WebParam (name="password" ) String password);
  9.      // ... other methods ...
  10. }


2. Enpoint du web service

Code :
  1. @Stateless
  2. @WebService(
  3.     endpointInterface = "webservice.MyWebService",
  4.     portName = "MyWebServicePort",
  5.     serviceName = "MyWebService" )
  6. public class MyWebServiceEndpoint implements MyWebService {
  7.  
  8.    public String doLogin(String lastname, String firstname, String password) {
  9.        createLogin(lastname, firstname, password);     
  10.    }         
  11.    // ... implementation of other methods ...
  12. }


Je déploie ensuite mon application EAR sur Sun Java Application Server (ou Bea weblogic ça change rien), le déploiement se déroule correctement et j'utilise SoapUI pour tester les méthodes de mon web service, tout fonctionne correctement, [B]là où est mon problème est que je peux faire un XML injection (ou Tag injection) avec ma requête soap.[/B]
 
Si je prend l'exemple ci-dessous, on peut voir ma requête soap qui est envoyé à mon serveur depuis SoapUI.

Code :
  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="web:">
  2.    <soapenv:Header>
  3.    </soapenv:Header>
  4.    <soapenv:Body>
  5.       <web1:doLogin xmlns:web1="http://webservice.example.com/">
  6.            <firstname>John</firstname>
  7.            <lastname>Brown</lastname>
  8.            <password>john_pass33</password>
  9.            [B]<lastname>Kennedy</lastname>[/B]
  10.       </web1:doLogin>
  11.    </soapenv:Body>
  12. </soapenv:Envelope>


Comme vous pouvez le constater j'ai réussi à injecter 2 tags <lastname>, mon serveur accepte cela et prend en compte le 2ème tag, c'est-à-dire dans cette exemple le nom "Kennedy" sera utilisé et non pas le nom "Brown".  
J'ai essayé d'utiliser des XML schema mais rien ne change j'ai toujours la possibilité d'envoyer une requête avec 2 tags de même nom et c'est toujours le dernier tag qui est pris en compte par le serveur.
 
Je voudrais donc savoir si quelqu'un pouvait m'aider en me disant comment il est possible de ne plus avoir ce genre de problème, c'est-à-dire qu'il ne soit plus possible de créer une requête soap avec 2 même nom comme paramètre ou d'ignorer le 2ème tag, etc ???
 
Merci d'avance.


Message édité par rohrix le 27-04-2009 à 16:52:55
Reply

Marsh Posté le 27-04-2009 à 16:44:36   

Reply

Marsh Posté le 29-04-2009 à 04:32:33    

Qu'est ce que tu appelles un XML injection ?
 
Tu as envoyé toute la requête tel quel, non ?

Reply

Marsh Posté le 29-04-2009 à 11:33:52    

bugsan a écrit :

Qu'est ce que tu appelles un XML injection ?
 
Tu as envoyé toute la requête tel quel, non ?


Oui j'ai envoyé la requête tel quel (en fait c'est un copier-coller depuis SoapUI), et comme tu peux le voir dans le requête ci-dessous j'ai envoyé 2 tags <lastname> (ligne 7 et ligne 9) c'est ça que j'appelle "XML Injection" ou si tu préfères "Tag Injection". Le serveur accepte ma requête et prend en compte le 2ème Tag et ignore le premier. Ce que je veux c'est que le serveur n'accepte pas une telle requête. Et comme je l'ai dit j'ai essayé de créer un XML Schema mais ça change rien à mon problème, donc je suis un peu dans une impasse.

Code :
  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="web:">
  2.     <soapenv:Header>
  3.     </soapenv:Header>
  4.     <soapenv:Body>
  5.        <web1:doLogin xmlns:web1="http://webservice.example.com/">
  6.             <firstname>John</firstname>
  7.             <lastname>Brown</lastname>
  8.             <password>john_pass33</password>
  9.             <lastname>Kennedy</lastname>
  10.        </web1:doLogin>
  11.     </soapenv:Body>
  12. </soapenv:Envelope>


Est-ce que tu as une idée ?? Ou quelqu'un d'autre peut m'aider ?? Merci !


Message édité par rohrix le 29-04-2009 à 11:34:35
Reply

Marsh Posté le 29-04-2009 à 19:32:04    

Ce n'est pas du tout de l'injection de tags, puisque tu envoies toute la requête en entier.
Et il n'y a pas non plus de problème de sécurité.
 
Si tu veux rendre plus strict le format XML, tu peux jouer sur le schéma XSD (xsd:sequence, et xsd:element avec maxOccurs=1).
Mais encore faut il que le framework de webservice que tu utilises supporte la validation XSD.

Reply

Marsh Posté le 30-04-2009 à 09:22:27    

bugsan a écrit :

Ce n'est pas du tout de l'injection de tags, puisque tu envoies toute la requête en entier.
Et il n'y a pas non plus de problème de sécurité.
 
Si tu veux rendre plus strict le format XML, tu peux jouer sur le schéma XSD (xsd:sequence, et xsd:element avec maxOccurs=1).
Mais encore faut il que le framework de webservice que tu utilises supporte la validation XSD.


 
Oui je suis d'accord avec toi, mais j'envoie toute la requête comme example pour que tout le monde puisse comprendre mon problème, maintenant si une telle requête est possible il est également possible d'injecter un tag dans une requête soap qui est intercepté et le serveur n'y verra que du feu et prendra en compte le tag que tu as injecté, maintenant pour ne pas entré dans les détails de comment un attaqueur peut faire ça et tout compliquer, j'ai simplement donné un example de qu'est-ce que je veux résoudre comme problème.
 
pour plus d'info (sous tag injection): http://www.owasp.org/index.php/Tes [...] _Injection  --> donc ça existe quand même et c'est plus ou moins un problème
 
Bref on va pas débattre plus longtemps sur le sujet surtout que je suis de ton avis que je pense pas que ce soit un gros problème de securité mais si il est possible de trouver une solution je serais quand même super content.
 
Ensuite ce que tu as dit avec les schemas XSD c'est exactement ce que j'ai fait avec maxOccurs=1 mais justement ça a rien changé à mon problème mais maintenant ce que tu dis avec le framework de web service est vraiment interessant, c'est vrai qu'il ne supporte peut-être pas la validation XSD (parce que je suis à peu prêt sur que mon XSD est correct) mais maintenant est-ce que tu sais comment on peut vérifier cela ?? Et connaîs-tu un example ou ce "tag injection" n'est plus possible ??
 
Merci


Message édité par rohrix le 30-04-2009 à 09:22:40
Reply

Marsh Posté le 30-04-2009 à 19:03:36    

L'exemple que tu donnes (ton lien) consiste en une injection dans un fichier XML existant. Rien à voir avec des webservices XML.
 

Reply

Marsh Posté le 01-05-2009 à 09:16:07    

bugsan a écrit :

L'exemple que tu donnes (ton lien) consiste en une injection dans un fichier XML existant. Rien à voir avec des webservices XML.
 


Merci pour ta précision mais ça marche la même chose avec les web services et c'est également le même problème, les requêtes soap sont en XML, donc si tu as un problème (comme ici tag injection) avec un fichier XML tu l'as aussi avec les web services, la preuve ?? -> Mon example


Message édité par rohrix le 01-05-2009 à 09:16:41
Reply

Marsh Posté le 01-05-2009 à 13:41:14    

Citation :

ça marche la même chose avec les web services


Non.

Citation :

... c'est également le même problème, les requêtes soap sont en XML, donc ...


Non.

Citation :

si tu as un problème avec un fichier XML tu l'as aussi avec les web services


Non.
 
Réfléchit deux secondes, quel est la différence entre ca
 

Code :
  1. <lastname>Brown</lastname>
  2. <password>john_pass33</password>
  3. <lastname>Kennedy</lastname>


 
et ca
 

Code :
  1. <lastname>Kennedy</lastname>
  2. <password>john_pass33</password>


 
Aucune.
Si je veux faire passer la valeur Kennedy, j'ai juste à mettre Kennedy dans le bon tag. C'est un "Service", par définition ...


Message édité par bugsan le 01-05-2009 à 13:46:07
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed