cours secu web

Download Cours Secu Web

Post on 16-Nov-2014

5.935 views

Category:

Technology

0 download

Embed Size (px)

DESCRIPTION

Prsentation sur la scurit et les vulnrabilits web sous licence Creative Common. Cours donn l'INSA de Rouen par Cedric Foll

TRANSCRIPT

  • 1. SCURIT WEB(introduction)cedric.foll@(laposte.net|education.gouv.fr)http://cedric.foll.name/ Sous licence creative common Paternit, Partage des Conditions Initiales l'Identiquehttp://creativecommons.org/licenses/by-sa/2.0/fr/ 1mercredi 13 janvier 2010

2. PLANLes principales vulnrabilits et attaques associes Scnario dattaqueDe la faille web la prise en main du serveur (ou du client)2mercredi 13 janvier 2010 3. VULNRABILITSTop 10 2010 de lOWASP (Open Web Application Security Project) : A1 Injection A2 Cross Site Scripting (XSS) A3 Broken Authentication and Session Management A4 Insecure Direct Object Reference A5 Cross Site Request Forgery (CSRF) A6 Security Misconfiguration A7 Failure to Restrict URL Access A8 Unvalidated Redirects and Forwards A9 Insecure Cryptographic Storage A10 Insufficient Transport Layer Protection3mercredi 13 janvier 2010 4. A1 INJECTION FLAW Attaque ImpactContre mesure4mercredi 13 janvier 2010 5. INJECTION FLAWS : PRINCIPE DE LATTAQUEInjection Flaw :Injection de code qui sera excut par le serveur Le code est en gnral du SQL, mais aussi possible avec dautres langages de requte (ldap, XPatch, ...) ou encore du code interprt (fonction de type eval , system et consorts...).Probablement le moyen le plus simple pour prendre le contrle dun serveur.Nous nabordons ici que les SQL Injection en prenant comme exemple PHP/Mysql. 5mercredi 13 janvier 2010 6. ATTAQUES SIMPLES 6mercredi 13 janvier 2010 7. SQL INJECTION : PRINCIPE DE LATTAQUEL'attaquant envoie au site par diffrents champs (formulaire GET, POST,Cookies, User-Agent, ...) du code SQL qui sera excut par le serveur.Le serveur utilise les donnes envoyes par l'utilisateur pour construire une requte SQL.Impact sur lapplication web Contournement du processus d'authentification. Rcupration (ou altration) de donnes dans la base. Rcupration (ou dpt) de fichier. Excution de code arbitraire.7mercredi 13 janvier 2010 8. SQL INJECTIONCONTOURNEMENT DIDENTIFICATION8mercredi 13 janvier 2010 9. SQL INJECTION CONTOURNEMENT DIDENTIFICATIONRequte SQL construite : select * from user where user = '$user' andpasswd='$passwd' Paramtres envoys par le pirate $user = 'or 1=1# $passwd = toto Ce qui va tre envoy vers le serveur SQL select * from user where user = '' or 1=1# ' andpasswd='toto'9mercredi 13 janvier 2010 10. SQL INJECTION CONTOURNEMENT DIDENTIFICATIONConsquencesLa requte SQL va renvoyer des rsultats et donc le test suivant va aboutir : if(mysql_num_rows($results) != 0)Le pirate est authentifi! Que faire si le test avait t? if(mysql_num_rows($results) == 1)Le pirate peut utiliser la commande SQL limit :limit nombre dlments offset indice select * from user where user = '' or 1=1 limit 1 offset 0 ->renvoie le premier lment (indice 0) de la table.10mercredi 13 janvier 2010 11. SQL INJECTIONCONTOURNEMENTDIDENTIFICATION Envoyer des caractres spciaux dans les champs desformulaires et voir si des erreurs sont gnres.caractres essayer : ' (quote), '' (double quote), (, ), #, --, ;Exemple d'erreur pouvant apparatre :11mercredi 13 janvier 2010 12. SQL INJECTION CONTOURNEMENT DIDENTIFICATIONEn gnrale faire un ' or 1=1# ne suffit pas : La requte SQL peut tre plus complexe (usage deparenthses par exemple): select * from user where(login='$login' and passwd='$passwd') On injecte : login = ' or 1=1)#12mercredi 13 janvier 2010 13. SQL INJECTIONCONTOURNEMENTDIDENTIFICATION Les messages d'erreur peuvent aider construire l'attaque :Error in query: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'toto')' at line 1 Les messages d'erreur ci dessus montrent qu'il y a uneparenthse fermer pour construire la rponse.13mercredi 13 janvier 2010 14. LA CONTRE-MESURE (HASARDEUSE) EN PHPmagic_quote_gpc = OnCe rglage remplace toutes les quote par antislash quote dans tout ce qu'envoie l'utilisateur (GET, POST, COOKIES). Impossibilit de contourner les processus d'authentificationpar SQL injection! This feature has been DEPRECATED as of PHP 5.3.0 andREMOVED as of PHP 6.0.0. Relying on this feature is highlydiscouraged. (http://php.net/manual/en/security.magicquotes.php)14mercredi 13 janvier 2010 15. ATTAQUES COMPLEXES 15mercredi 13 janvier 2010 16. SQL INJECTION RCUPRATION DE DONNES Si le dveloppeur utilise gpc_magic_quotes (ou sil filtre les quote dans les entres utilisateurs)? Si contourner lauthentification ne vous suffit pas (parce que cequi vous intresse est de dumper la table)? Les solutions :UNION query (inband) SQL InjectionBlind SQL InjectionFull blind SQL injection (ou time based SQL Injection) 16mercredi 13 janvier 2010 17. UNION QUERY (INBAND) SQL INJECTIONConsidrons le code suivant dont le rsultat est ensuite affich par le serveurdapplication :select texte from commentaire where id=$id Avec MySQL (et la plupart des bases de donnes), les comparaisons sur les nombres sefont sans quote .Il est galement possible dutiliser des chaines sans quote en les crivant en hexadcimal (0x414243 = ABC). Pour exploiter cette faille, il est possible denvoyer ceci :id = 3141 union select login from utilisateurs limit 1 offset 0 Si dans la table commentaire , il ny a pas dentre avec comme id 3141 , lacommande renverra le premier login de la table utilisateurs . 17mercredi 13 janvier 2010 18. ATTAQUEIl faut gauche et droite de lUNION avoir le mme nombre de champs (1champ dans notre exemple).Assez simple grer, il suffit dutiliser la commande order by pour dterminer, par ttonnement, le nombre dlments dans la requte: id = 3141 order by 6 #Puis lorsque lon a trouv le nombre maximum ne gnrant pas derreurs: id = 3141 union select 1,2,3,4,5,6 # Prsences de parenthses...Par ttonnement en sappuyant, le cas chant, sur les messages derreur. 18mercredi 13 janvier 2010 19. ATTAQUECertaines bases (telles que PostgreSQL mais pas MySQL) attendent lemme type de donnes gauche et droite du UNION.Il existe des fonctions de type CAST pour sen sortir. Il faut connatre des tables et des colonnes rcuprer.Facile si on possde les sources de l'application.Sinon cela dpend de la base de donnes et de sa version : partir de MySQL 5.0 la base information_schema contient lesMETA donnes. Sinon par bruteforce avec des chances de succs trs alatoire.19mercredi 13 janvier 2010 20. ATTAQUEIl est aussi possible dutiliser la commande concat (MySQL)pour aller plus vite :id = 3141 union select concat(login, 111,password) from utilisateurs limit 1 offset 0 20mercredi 13 janvier 2010 21. BLIND SQL INJECTION Que faire si lon arrive injecter du code, mais que le serveurdapplication naffiche pas le rsultat?Cest le cas, notamment, dans les processus dauthentification. On est juste capable de savoir si la commande renvoievrai ou faux.Dans la pratique, cest quelque chose qui arrive relativement souvent (et pas seulement dans les requtes lies une identification).21mercredi 13 janvier 2010 22. ATTAQUEConsidrons le code suivant utilis pour afficher le nombre declients ayant ralis plus de nb achats.select COUNT(*) from client where achats >= $nb Injections :nb = 3141 or 1=1 # affiche le nombre total de clients dans la basenb = 0 and 1=0 # affiche 022mercredi 13 janvier 2010 23. ATTAQUERcupration du contenu de la variable @@versionRcupration octet par octet par dichotomie : nb = 0 and ascii(SUBSTRING(@@version,1,1)) >= 128Si vrai :nb = 0 and ascii(SUBSTRING(@@version,1,1)) >= 192Sinon :nb = 0 and ascii(SUBSTRING(@@version,1,1)) >= 64... Puis (passage au second octet) :nb = 0 and ascii(SUBSTRING(@@version,2,1)) >= 128 23mercredi 13 janvier 2010 24. ATTAQUECela peut sembler compliqu et longMais cest facilement scriptable et marche souvent trs bien.Il faut cibler les donnes rcuprer (par exemple login/ mots de passe).24mercredi 13 janvier 2010 25. FULL BLIND SQL INJECTIONQue faire si lon arrive injecter du code, mais mme pas savoir silrenvoie vrai ou faux?Il reste un (maigre) espoir, la commande sleep (MySQL >= 5.0.12) et les excutions conditionnelles (IF sous MySQL). IF(1=1,foo,bar) -> renvoie fooLattaque devient : nb = 3141 or IF(ascii(SUBSTRING(@@version,1,1))>= 128,sleep(5),1) Si le serveur attend 5 secondes cest que le test a russi...25mercredi 13 janvier 2010 26. ATTAQUECela peut sembler compliqu et longCest exact!Il faut trs prcisment cibler les donnes rcuprer (par exemple, le mot de passe MySQL root ).26mercredi 13 janvier 2010 27. SQL INJECTION WHAT ELSE?De mme quil est possible de lire des donnes il est possible denajouter (INSERT), supprimer (DELETE), modifier (UPDATE). La plupart des bases de donnes, dont MySQL, permettent de lireet dcrire des fichiers :SELECT LOAD_FILE('/etc/passwd')SELECT INTO dumpfile '/var/www/shell.php Il est mme possible, avec certaines bases de donnes (mais pasMySQL), d'excuter directement des commandes systmes.27mercredi 13 janvier 2010 28. EN BREFPoint dentre trs efficace pour compromettre un site web.A minima permet un dump des tables accessibles jusqu devenir administrateur des applications web: Permet assez souvent de dposer du code (ajout de fichiers,plugin, ...)Mais aussi (avec de la chance) : Excution de commandes systmes. Ou possibilit de dposer un shell php.28mercredi 13 janvier 2010 29. EN BREF Pour les attaques manuelles :Paros (http://www.parosproxy.org), Burb (http://portswigger.net/) Les cheat sheets (http://pentestmonkey.net/cheat-sheets/)Pour MySQL, PostgreSQL, Oracle, DB2, Informix, MSSQL, Ingres SQL liste les meta tables, la manire dobtenir la nime ligne, le nime octet, de lire/crire un fichier... Un excellent outil dattaque automatique sqlmap (http://sqlmap.sourceforge.net) 29mercredi 13 janvier 2010 30. CONTRE MESURESGranularit des privilgesUne application de type livre dor ne doit pas tre MySQL root sur la base de donnes! Filtrages des donnes envoyes par lutilisateurQuand cest un nombre on le vrifieQuand cest une chaine, on utilise