漏洞概要
关注数(24 )
关注此漏洞
漏洞标题:phpmps 某处存在sql注入(鸡肋)
提交时间:2014-02-20 16:40
修复时间:2014-05-21 16:41
公开时间:2014-05-21 16:41
漏洞类型:SQL注射漏洞
危害等级:高
自评Rank:20
漏洞状态:厂商已经确认
Tags标签:
无
漏洞详情 披露状态:
2014-02-20: 细节已通知厂商并且等待厂商处理中 2014-02-26: 厂商已经确认,细节仅向厂商公开 2014-03-01: 细节向第三方安全合作伙伴开放 2014-04-22: 细节向核心白帽子及相关领域专家公开 2014-05-02: 细节向普通白帽子公开 2014-05-12: 细节向实习白帽子公开 2014-05-21: 细节向公众公开
简要描述: phpmps 某处存在sql二次注入
详细说明: phpmps_v2.3_build121113_utf8 在用户注册时候,虽然做了转移,但是存储到数据库的时候转义符被去掉,从而造成sql二次注入,登陆后跳转截图
点击左侧的购买信息币处:
此处有两处,都是从数据库直接取出来用户名,做用户查询所用: 在member.php里面:
526 case 'act_gold': 527 $type = $_POST['type']; 528 $number = $type == 'money2gold' ? intval($_POST['m_number']) : intval($_POST['c_number']); 529 530 if($number <= 0)showmsg('数量必须大于0'); 531 $userinfo = member_info($_userid); 532 $_credit = $number * $CFG['credit2gold']; 533 $_money = $number * $CFG['money2gold']; 534 535 if($type == 'money2gold') { 536 if($_money > $userinfo['money']) showmsg('您的资金不足以支付此次购买'); 537 money_diff($_username, $_money, $type); 538 } else { 539 if($_credit > $userinfo['credit']) showmsg('您的积分不足以支付此次购买'); 540 credit_diff($_username, $_credit, $type); 541 } 542 gold_add($_username, $number, $type); 543 showmsg('购买信息币成功' , 'member.php?act=gold'); 544 break;
追踪到相关函数:
21 function gold_diff($username, $number, $note = '', $authid = '') 22 { 23 global $db, $table; 24 $number = intval($number); 25 if($number < 0) showmsg('数量不能小于0'); 26 $note = addslashes($note); 27 $r = member_info($username,'2'); 28 if(!$r) showmsg('不存在此用户'); 29 extract($r); 30 $time = time(); 31 $ip = get_ip(); 32 if($number > $gold) showmsg('您的金额不够支付'); 33 $db->query("UPDATE {$table}member SET gold=gold-$number WHERE username='$username'"); 34 $db->query("INSERT INTO {$table}pay_exchange (`username`,`type`,`value`,`note`,`addtime`,`ip`) VALUES('$username','g old','-".$number."','$note','$time','$ip')");
43 function credit_add($username, $number, $note = '') 44 { 45 global $db, $table; 46 $number = intval($number); 47 if($number < 0) showmsg('数量不能小于0'); 48 $db->query("UPDATE {$table}member SET credit=credit+$number WHERE username='$username'"); 49 $note = addslashes($note); 50 $time = time(); 51 $ip = get_ip(); 52 if($db->affected_rows() == 0) showmsg('添加失败'); 53 $db->query("INSERT INTO {$table}pay_exchange (`username`,`type`,`value`,`note`,`addtime`,`ip`) VALUES('$username','c redit','$number','$note','$time','$ip')"); 54 }
由此可见两处都没有对从数据库取出来的参数进行过滤,所以导致sql注入
漏洞证明: 在资金购买信息币处,验证处sql报错,后面的利用就不用多说了,很简单
显示: MySQL server error report:Array ( [0] => Array ( [message] => MySQL Query Error ) [1] => Array ( [sql] => select * from phpmps_member where username='jkgh009'' ) [2] => Array ( [error] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''jkgh009''' at line 1 ) [3] => Array ( [errno] => 1064 ) )
修复方案: 漏洞回应 厂商回应: 危害等级:高
漏洞Rank:20
确认时间:2014-02-26 23:30
厂商回复: 非常感谢作者提供漏洞信息。谢谢。
最新状态: 暂无