*********************************************************
¦ Versions vulnérables : boastMachine <= 3.1            ¦
¦ Solution             : Aucune officiel                ¦
¦ Web                  : http://boastology.com/         ¦
*********************************************************


Description
***********
boastMachine - The most comprehensive publishing platform.
Unlimied blogs , Unlimited users , Unlimited posts (text,html,WYSIWYG editor) / comments (threaded comments) ,
User levels/profile/pic uploads/image manager , Themes/Language packs/Smiley pacls , Voting/Rating/Send to friend,
Pingbacks/Trackbacks , Valid XHTML templates , Antispam, Image verification, keyword trigger, ip ban , RSS .92, RSS 2.0,
ATOM .03 feeds and a million other features. boastMachine is backed by just a single MySQL!


Problèmes
*********
- Cross Site Scripting
- Injections SQL
- Cross Site Request Forgery
- Upload de fichier
- Predictable Backup Filename


Cross Site Scripting
********************
Lors de l'inscription d'un nouvel utilisateur (register.php), les variables 'user_login', 'full_name', 'url'
ne sont pas correctement filtrées. Le code injecté sera executé (coté client), si l'administrateur liste tout
les utilisateurs (dans le pannel admin via 'User list') ou si il edite le profile de l'utilisateur en question.
Dans la partie admin lors d'une recherche d'un membre, la variable cat_list n'est pas initialisée mais elle
subit une concaténation, ce qui pourrait être exploité afin d'injecter du code malicieux qui séxécutera coté
client. De plus l'input permettant d'effectuer une recherche ne filtre pas correctement la variable 'key'.


Injections SQL
**************
Les droits d'administrateurs et magic_quotes_gpc Off sont requis pour que cette injection SQL fonctionne.
La plupart des variables envoyées par l'utilisateur et utilisées lors d'une requète SQL se voient appliquer
un filtre et sont urlencodés, cependant le filtre peut être contourné. Le filtre en question ne permet pas
l'utilisation de ces caractères: /^\\s*(insert|delete|update|replace. Cependant il permet l'utilisation des
quotes, des virgules, de UNION, SELECT, #. Le fichier 'bmc/inc/core/admin/search.inc.php' ne filtre pas
correctement la variable 'blog' (et ne l'urlencode pas). Un utilisateur pourrait modifier cette variable
afin d'injecter du code SQL qui lui permettrait d'obtenir les hash md5 de tout les utilisateurs.


Cross Site Request Forgery
***************************
Un utilisateur pourrait mener des attaques de type CSRF, dans le but de supprimer un utilisateur.
Il lui suffirai de faire cliquer l'administrateur sur un lien spécifique, le lien en question contiendrait
l'id de l'utilisateur à supprimer.


Upload de fichier
*****************
Dans la partie Admin, l'option 'Languages' qui permet d'uploader des pack de langue, ne filtre pas l'extension
des fichiers uploadés (ceci sont envoyés dans 'bmc/inc/lang'), cependant les fichiers uploadés ne seront pas
accessible via le protocol http (un htaccess interdit l'accès au dossier 'bmc/inc' ainsi que ses sous-répertoires).


Predictable Backup Filename
***************************
Dans la partie Admin, l'option Backup permet de générer un dump sql (dans le dossier '/backup/') des tables appartenant au script
boastMachine. Mais les fichiers générés par le script ne sont pas choisis par pur hazard, un utilisateur pourrait facilement
telecharger un backup en codant un script malicieux, voila un exemple de nom de fichier généré: bmc-16_Jul_2006_07-16-21-pm.bak.sql
Le nom de fichier est constitué de 'bmc', de la date (English),de l'heure (AM ou PM, 07 ici), du jour (16), et d'un nombre généré
entre 0 et 99 (21). A noté que si l'administrateur a précisé qu'il faut gzipper le backup généré, l'extension .gz
sera rajouté. J'en profite aussi pour dire qu'un utilisateur peut créé un fichier contenant des requètes SQL, restaurer
la base de donnée via l'option de boastMachine, et toutes les requètes SQL seront exécutés (création de shell via
la commande INTO OUTFILE dans un dossier chmodé 777 (c'est pas ce qui manque) par exemple).


Proof Of Concept
****************
1 - Register with  http://</title>"'><script>alert(777)</script>@hot.com , aller partie Admin et lister les utilisateurs, le code s'execute.
2 - Search: http://[...]/index.php?blog=1&action=search&item=title&key="></title><script>alert(666)</script>
3 - POST "/bmc/admin.php" DATA do=search&action=search&blog=1' UNION SELECT user_pass,user_login FROM bmc_users%23&cat_list=<script>alert(666)</script>
4 - CSRF http://[...]/bmc/admin.php?action=delete_user&user=<user_id>


Solutions
*********
S'applique uniquement pour les cas cités plus haut.
Injections SQL       => addslashes()
Cross Site Scripting => htmlentities()
Cross Site Request Forgery => Utiliser la méthode post
Predictable Backup Filename => Utiliser une fonction de type random
Upload de fichier => Créer une fonction permettant de verifier si il s'agit oui ou non d'un pack de langue


Credits
*******
Vulnérabilités trouvées par DarkFig
Source: http://www.acid-root.new.fr/advisories/08060717.txt
Exploit: http://www.acid-root.new.fr/poc/06060717.txt


Changelog
*********
[06-07-16] - Version initiale