漏洞编号 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请求的数组数据:
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;
}