【漏洞分析】WordPress插件Easy Contact Form 'Name'跨站脚本漏洞

漏洞编号 CNVD-2021-09816

该漏洞为后台xss低危漏洞,本文意在分享代码审计过程中的技巧。

漏洞验证


确定问题参数是 ecf_meta_admin_email_header。

跟踪payload写入流程

通过查看sql语句执行记录可以看见通过insert语句添加到数据库。

为了方便跟踪代码的执行过程,我在wordpress的wp-db.php文件中插入debug_backtrace代码并将结果输出到log.txt,主要方便用来跟踪记录执行过程调用了哪些方法。


重复一次漏洞验证过程,然后在log.txt可以直接看到sql的执行过程调用了哪些方法。


分析代码执行流程,其写入的主要方法在ecf-metaboxes.php的代码中。该文件为加密文件,可以通过手工解密。

加密前的文件:

解密后的文件:

		foreach( $_POST['ecf_meta'] as $key => $val ) {
			delete_post_meta( $post_id, $key );
			add_post_meta( $post_id, $key, $_POST['ecf_meta'][$key], true ); 
		}

解密代码后,直接跟踪到该代码的2060行可以看到,该代码将接收到的$_POST['ecf_meta']数组数据直接通过add_post_meta写入数据库中。

注:wordpress自带的add_post_meta的方法不会对html代码进行过滤。

POST请求的数组数据:
image-20210209123324863

payload加载流程

找到读取数据库postmeta表的方法get_post_meta,然后同样通过添加debug_backtrace代码进行跟踪,并且记录查询的结果和跟踪信息到log.txt。

通过log.txt查看payload对应的加载流程:

通过日志跟进ecf-metaboxes.php代码的393行,然后查看$meta

我们可以看到在此处,$meta被直接拼接到html代码中,并且未经过任何过滤。

然后在web页面查看加载之后的代码。

总结

熟悉对应系统的代码结构,直接在数据库文件中加入debug_backtrace代码跟踪代码执行流程。

debug使用的代码

function print_stack_trace()
{
	/*
	
	$h = $this->print_stack_trace();
	file_put_contents("log.txt", print_r($a, true),FILE_APPEND);
	file_put_contents("log.txt", print_r("\r\n" . $h . "\r\n------------------------------------", true),FILE_APPEND);
	*/
	$array =debug_backtrace();
  //print_r($array);//信息很齐全
   unset($array[0]);
   foreach($array as $row)
	{
	   $html .=$row['file'].':'.$row['line'].'行,调用方法:'.$row['function']."\r\n";
	}
	return $html;
}

参考链接

https://www.cnvd.org.cn/flaw/show/CNVD-2021-09816