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