近期安全分析显示,Cyask 系统中的 Collect.php 文件存在一处值得警惕的安全漏洞。该问答系统在国内使用较为广泛,其仿百度风格的界面受到不少站长的青睐,然而代码层面的安全性仍有待检验。
影响版本
Cyask
系统简介
Cyask 是国内使用率较高的仿百度问答系统,许多站长选择它来搭建本地问答社区。
漏洞分析
问题出在 Collect.php 的以下代码段中。当用户未通过常规引用页面访问时,程序会检查传入的网址,并直接将该网址作为文件读取的来源:
else
{
/* 检查网址 */
$url=get_referer();
$neturl=emptyempty($_POST['neturl']) ? trim($_GET['neturl']) : trim($_POST['neturl']);
$collect_url=emptyempty($neturl) ? $url : $neturl;
$contents = "";
if($fid=@fopen($collect_url,"r"))
{
do
{
$data = fread($fid, 4096);
if (strlen($data) == 0)
{
break;
}
$contents .= $data;
}
while(true);
fclose($fid);
}
else
{
show_message('collect_url_error', "");
exit;
}
关键问题在于 $collect_url 直接由用户可控的 $_GET['neturl'] 或 $_POST['neturl'] 传入,未经任何过滤就作为 fopen 的参数。攻击者可借此指定任意本地文件路径,让程序读取并返回文件内容,造成敏感信息泄露。
漏洞利用
攻击者只需构造如下请求,即可读取服务器上的敏感文件(例如数据库配置文件):
https://www.target.com/collect.php?neturl=config.inc.php
解决方案
厂商补丁
目前 Cyask 官方已发布升级补丁修复此安全漏洞,建议用户前往厂商主页下载最新版本并完成更新。
