## 1.漏洞分析
由于下不到2.1.0的源代码,只能根据漏洞描述以及3.4版本的代码进行推敲。
先看wp-admin/admin-ajax.php文件
wp-admin/admin-ajax.php:77
```php
if ( is_user_logged_in() ) {
	/**
	 * Fires authenticated AJAX actions for logged-in users.
	 *
	 * The dynamic portion of the hook name, `$_REQUEST['action']`,
	 * refers to the name of the AJAX action callback being fired.
	 *
	 * @since 2.1.0
	 */
	do_action( 'wp_ajax_' . $_REQUEST['action'] );
} else {
	/**
	 * Fires non-authenticated AJAX actions for logged-out users.
	 *
	 * The dynamic portion of the hook name, `$_REQUEST['action']`,
	 * refers to the name of the AJAX action callback being fired.
	 *
	 * @since 2.8.0
	 */
	do_action( 'wp_ajax_nopriv_' . $_REQUEST['action'] );
}
```
ajax有2种,如何登录状态下会进入
`do_action( 'wp_ajax_' . $_REQUEST['action'] );`
否则就进入
`do_action( 'wp_ajax_nopriv_' . $_REQUEST['action'] );`
存在漏洞的2个函数
includes/Core/class.db.php
```php
add_action( 'wp_ajax_nopriv_do_insert', array('IZC_Database', 'do_insert'));
add_action('wp_ajax_nopriv_do_edit',array('IZC_Database', 'do_edit'))
```
`wp_ajax_nopriv_do_insert` 和 `wp_ajax_nopriv_do_edit` 都是可以未登录状态就能进行form的新增跟编辑操作。
`form_fields` 变量未经处理就存入数据库,造成存储型xss漏洞。
看看do_edit的处理代码
```php
public function do_edit()
        {
            global $wpdb;
            $get_fields = $wpdb->prepare("SHOW FIELDS FROM " . $wpdb->prefix . filter_var($_POST['table'], FILTER_SANITIZE_STRING));
            $fields = $wpdb->get_results($get_fields);
            $field_array = array();
            foreach ($fields as $field) {
                if (isset($_POST[$field->Field])) {
                    if (is_array($_POST[$field->Field]))
                        $field_array[$field->Field] = json_encode($_POST[$field->Field], JSON_FORCE_OBJECT);
                    else
                        $field_array[$field->Field] = $_POST[$field->Field];
                }
            }
            $update = $wpdb->prepare($wpdb->update($wpdb->prefix . filter_var($_POST['table'], FILTER_SANITIZE_STRING), $field_array, array('Id' => filter_var($_POST['edit_Id'], FILTER_SANITIZE_NUMBER_INT))));
            $wpdb->query($update);
            echo $_POST['edit_Id'];
            die();
        }
```
`field_array` 未经过处理就存入了数据库。
## 2.漏洞利用
存储xss利用xss平台
## 3. 漏洞修复
1. xss转义 `htmlspecialchars($field_array[$field->Field])`
   
2. 未登录状态下禁止访问
   
   `add_action('wp_ajax_do_insert', array('IZC_Database', 'do_insert'));`
   
   `add_action('wp_ajax_do_edit', array('IZC_Database','do_edit'));`
   
3. 升级版本
                       
                       
        
          
暂无评论