来源:自学PHP网 时间:2015-04-15 14:59 作者: 阅读:次
[导读] 在api sms_idcheck php中, 存在一处手机号码认证的代码, 该认证有问题, 用户可以轻意绕过 并将可控的输入带到sql语句中 if($mobile){ if(!preg_match( 39; ^1([0-9]{9}) 39;,$mobile)) exit( 39;ch...
在api/sms_idcheck.php中, 存在一处手机号码认证的代码, 该认证有问题, 用户可以轻意绕过. 并将可控的输入带到sql语句中.
if($mobile){ if(!preg_match('/^1([0-9]{9})/',$mobile)) exit('check phone error'); $posttime = SYS_TIME-360; $where = "`mobile`='$mobile' AND `posttime`>'$posttime'"; $r = $sms_report_db->get_one($where,'id_code','id DESC'); if($r && $r['id_code']==$mobile_verify) exit('1'); /* 我们看到,它过滤手机号的时候,采用的正则是/^1([0-9]{9})/, 这个正则存在问题, 它只判断了第一位是不是1, 接下来的是不是存在9个数字, 后面的内容都没进行判断. 所以即使,我们输入10000000000*********(*******代替任意字符),它也会认为这是手机号, 从而,带到下面的$where中去查询,从而存在一定的威胁. 在默认的情况下,连接的数据库为mysql,由于单引号被转义, 所以不好利用了. 但在特定的情况下, 譬如连接的mysql时,采用gbk的字符集连接, 就可以绕过该转义, 从而进行利用. 另外,在采用别的数据库的情况下, 也有可能存在一定的风险. */
http://localhost/api.php?op=sms_idcheck&action=id_code&mobile_verify=123456&mobile=13800138
时,会返回check phone error.
http://localhost/api.php?op=sms_idcheck&action=id_code&mobile_verify=123456&mobile=10000000000%bf'
时,它会绕过mobile的验证, 将内容带到数据库中去查询.
修复方案:
本来就是一个鸡肋.
修不修复没啥危害.
preg_match('/^1[0-9]{9,10}$/') //在正则的后面,加个$结束符.
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com