在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}$/') //在正则的后面,加个$结束符.

    上一篇: Attacking MongoDB - 网站安全 - 自学php

    下一篇: 绕过安全狗反射型XSS - 网站安全 - 自学php
本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《PHPCMS 9.4.2 手机号验证绕过 – 网站安全 – 自学php
   

还没有人抢沙发呢~