搜索
查看: 427|回复: 0

Dedecms最新版任意用户密码重置漏洞的疑问

[复制链接]

1839

主题

2255

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11913
发表于 2018-1-21 19:12:34 | 显示全部楼层 |阅读模式
网上说的都是任意用户密码重置,但是真的是任意用户吗?

我们来看下网上给的poc:
  1. http://127.0.0.1/dedecms/member/resetpassword.php?dopost=safequestion&safequestion=0.0&safeanswer=&id=1
复制代码
根据给出的分析我们也跟进下。

代码:
  1. else if($dopost == "safequestion")
  2. {
  3.     $mid = preg_replace("#[^0-9]#", "", $id);
  4.     $sql = "SELECT safequestion,safeanswer,userid,email FROM #@__member WHERE mid = '$mid'";
  5.     $row = $db->GetOne($sql);
  6.     if(empty($safequestion)) $safequestion = '';

  7.     if(empty($safeanswer)) $safeanswer = '';

  8.     if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer)
  9.     {
  10.         sn($mid, $row['userid'], $row['email'], 'N');
  11.         exit();
  12.     }
  13.     else
  14.     {
  15.         ShowMsg("对不起,您的安全问题或答案回答错误","-1");
  16.         exit();
  17.     }
复制代码
这里我们赋值safequestion=0.0,为什么?因为如果用户没设置安全问题的话,在数据库中的值为0
那为什么不能直接设置为0呢,再看下面的代码
  1. if(empty($safequestion)) $safequestion = '';

  2.     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的解疑。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?Join BUC

x
过段时间可能会取消签到功能了
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表