当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-095010

漏洞标题:phpmps设计缺陷导致CSRF(全站功能通杀)

相关厂商:phpmps.com

漏洞作者: Xser

提交时间:2015-02-05 16:34

修复时间:2015-04-02 10:23

公开时间:2015-04-02 10:23

漏洞类型:CSRF

危害等级:高

自评Rank:20

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-02-05: 细节已通知厂商并且等待厂商处理中
2015-02-10: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2015-04-06: 细节向核心白帽子及相关领域专家公开
2015-04-16: 细节向普通白帽子公开
2015-04-26: 细节向实习白帽子公开
2015-04-02: 细节向公众公开

简要描述:

phpmps设计缺陷导致CSRF(全站功能通杀)

详细说明:

phpmps防御xss和sql还是很好的,但是却忽略了csrf
请求没有token,没有验证referer。可以请求伪造。
所以是全站通杀!
还是给几个案例吧
案例1:修改管理员密码

case 'repass':
if(empty($_REQUEST[password]))show("请输入密码");
if(empty($_REQUEST[repassword]))$msg .= "请输入重复密码\n";
if($_REQUEST[password] <> $_REQUEST[repassword])show("两次输入的密码不一致");

$password = md5($_REQUEST[password]);
$sql = "UPDATE {$table}admin SET password = '$password' WHERE userid = '$_SESSION[adminid]'";
$res = $db->query($sql);
admin_log("$_SESSION[adminid]修改密码成功");
show('资料修改成功', 'admin.php');
break;


360截图20150201115454295.jpg


案例2:刷钱

case 'add':
if($_POST['dosubmit'])
{
extract($_REQUEST);
$amount = floatval($amount);
$r = $db->getOne("SELECT userid,email,money FROM {$table}member WHERE username='$username'");
if(!$r) show('不存在此用户');
$balance = $r['money'];
$value = 0;
if($operation == '+')
{
$balance += $amount;
}
elseif($operation == '-')
{
$balance -= $amount;
}
$balance = round($balance, 2);
$time = time();
$year = date('Y', $time);
$month = date('m', $time);
$date = date('Y-m-d', $time);
$note = htmlspecialchars_deep($note);
$note = cut_str($note, 200);
if($operation == '+')
{
money_add($username, $amount, $note);
}
elseif($operation == '-')
{
money_diff($username, $amount, $note);
}
$url = 'pay.php?act=add';
show('操作成功', $url);


360截图20150201115454295.jpg


-------------------------------------
由于全站都存在,我就不一一指出了
还有一个设计缺陷在这里提提
备份数据生成的文件名是

$filename = date('Ymd').'_'.$random.'_'.$fileid.'.sql';


而$random是

$random = mt_rand(1000, 9999);


生成就是时间戳_从1000到9999的任意数字_加上操作者的id(通常都是1).sql
只需针对写个爆破脚本就可以看到了
**-----
还有一个提示,学dz,把下载数据备份的目录为不可访问,只有管理员才可以访问

漏洞证明:

phpmps防御xss和sql还是很好的,但是却忽略了csrf
请求没有token,没有验证referer。可以请求伪造。
所以是全站通杀!
还是给几个案例吧
案例1:修改管理员密码

case 'repass':
if(empty($_REQUEST[password]))show("请输入密码");
if(empty($_REQUEST[repassword]))$msg .= "请输入重复密码\n";
if($_REQUEST[password] <> $_REQUEST[repassword])show("两次输入的密码不一致");

$password = md5($_REQUEST[password]);
$sql = "UPDATE {$table}admin SET password = '$password' WHERE userid = '$_SESSION[adminid]'";
$res = $db->query($sql);
admin_log("$_SESSION[adminid]修改密码成功");
show('资料修改成功', 'admin.php');
break;


360截图20150201115454295.jpg


案例2:刷钱

case 'add':
if($_POST['dosubmit'])
{
extract($_REQUEST);
$amount = floatval($amount);
$r = $db->getOne("SELECT userid,email,money FROM {$table}member WHERE username='$username'");
if(!$r) show('不存在此用户');
$balance = $r['money'];
$value = 0;
if($operation == '+')
{
$balance += $amount;
}
elseif($operation == '-')
{
$balance -= $amount;
}
$balance = round($balance, 2);
$time = time();
$year = date('Y', $time);
$month = date('m', $time);
$date = date('Y-m-d', $time);
$note = htmlspecialchars_deep($note);
$note = cut_str($note, 200);
if($operation == '+')
{
money_add($username, $amount, $note);
}
elseif($operation == '-')
{
money_diff($username, $amount, $note);
}
$url = 'pay.php?act=add';
show('操作成功', $url);


360截图20150201115454295.jpg


-------------------------------------
由于全站都存在,我就不一一指出了
还有一个设计缺陷在这里提提
备份数据生成的文件名是

$filename = date('Ymd').'_'.$random.'_'.$fileid.'.sql';


而$random是

$random = mt_rand(1000, 9999);


生成就是时间戳_从1000到9999的任意数字_加上操作者的id(通常都是1).sql
只需针对写个爆破脚本就可以看到了
**-----
还有一个提示,学dz,把下载数据备份的目录为不可访问,只有管理员才可以访问

修复方案:

上面说了

版权声明:转载请注明来源 Xser@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2015-04-02 10:23

厂商回复:

最新状态:

暂无