0x01 漏洞根源
这个问题的根源在于api/uc.php文件中的updatebadwords方法,代码如下:
function updatebadwords($get, $post) {
global $_G;
if(!API_UPDATEBADWORDS) {
return API_RETURN_FORBIDDEN;
}
$data = array();
if(is_array($post)) {
foreach($post as $k => $v) {
$data[\’findpattern\’][$k] = $v[\’findpattern\’];
$data[\’replace\’][$k] = $v[\’replacement\’];
}
}
$cachefile = DISCUZ_ROOT.\’./uc_client/data/cache/badwords.php\’;
$fp = fopen($cachefile, \’w\’);
$s = \”;
$s .= \’$_CACHE[\\\’badwords\\\’] = \’.var_export($data, TRUE).\”;\\r\\n\”;
fwrite($fp, $s);
fclose($fp);
return API_RETURN_SUCCEED;
}
方法参数中的$get和$post就是用户所传入的内容,从上面代码我们可以看出在解析$post内容之后,将其写入到名为badwords的缓存中。这里代码使用了var_export来避免用户传递单引号来封闭之前语句,注入php代码。
但是这里有两个关键词让我眼前一亮“findpattern”和“replacement”,也就...