帝友P2P任意密码支付密码重置让我超越马云爸爸不再是梦想
2015-06-09 11:11
633 查看
本屌为穷逼,买不起贵司10+W的而且代码质量高到可怕的产品,所以下了一个D版系统看源码。在网贷之家随机挑了几个站点测试,发现问题都存在……
听说P2P借贷火成狗,然后看了看几家P2P借贷的站点,长得都差不多,看起来好像就是一个妈生的。本来想吐槽一下,关乎钱的事情,就不能认真点吗?但是,转念一想,艾玛,这不是一个通用程序么……赶紧脱掉裤子爽一发。
听说这货的产品卖得死贵(>15W),翻阅了一下写的代码,质量实在对不起这个价格。之前在乌云上厂商还会接点bug打发打发白帽,现在听说弄了个绿M的检测报告之后屌都不屌乌云一下。
扯蛋完毕,本屌是小白一个,还请各位看官海涵。
============================分割线============================
其实这不是一个漏洞,而是属于默认密钥未被重置的问题。
先来看看d友的密码重置过程:
发起密码重置 –> 验证用户名与邮箱是否一致 –> 生成并发送令牌 –> 验证令牌 –> 重置密码完成
问题出在验证令牌的流程上。
我们来看看/modules/member/index.php上对密码重置是怎么验证的:
code 区域
可以看到$data决定了是否能够重置密码,能够重置谁的密码。正常情况下,$data应当是一个拥有两个及以上元素的数组,其中第一个元素表示需要重置的用户ID,第二个元素表示令牌的生成时间(10分钟后过期)。
在$data的解码过程中,authcode函数非常重要,接着来看看authcode函数的处理过程,该函数位于文件/core/function.inc.php:
code 区域
可以看到,这个函数拥有一个默认的密钥,而之前验证的过程中,并没有指定一个特别的密钥。
社会主义的直觉告诉我,那这里就有个世界和平问题。
我随便挑了一个用了这个软件的站点,发起密码重置请求,得到了字符串:
本地使用默认密钥反解这个字符串,得到:
接着,把3494改成1,并加密回去,看看能不能重置这货的密码:
呵呵。
更为可怕的是,这货的支付密码还能以同样的方式被重置:
嗯,看来过不了几天我就能超越马云爸爸了。哎,警察同志您先别开枪……
详细说明:
听说P2P借贷火成狗,然后看了看几家P2P借贷的站点,长得都差不多,看起来好像就是一个妈生的。本来想吐槽一下,关乎钱的事情,就不能认真点吗?但是,转念一想,艾玛,这不是一个通用程序么……赶紧脱掉裤子爽一发。听说这货的产品卖得死贵(>15W),翻阅了一下写的代码,质量实在对不起这个价格。之前在乌云上厂商还会接点bug打发打发白帽,现在听说弄了个绿M的检测报告之后屌都不屌乌云一下。
扯蛋完毕,本屌是小白一个,还请各位看官海涵。
============================分割线============================
其实这不是一个漏洞,而是属于默认密钥未被重置的问题。
先来看看d友的密码重置过程:
发起密码重置 –> 验证用户名与邮箱是否一致 –> 生成并发送令牌 –> 验证令牌 –> 重置密码完成
问题出在验证令牌的流程上。
我们来看看/modules/member/index.php上对密码重置是怎么验证的:
code 区域
…… elseif ($_U[‘query_class’] == ‘updatepwd’){ $updatepwd_msg = “”; if(isset($_REQUEST[‘id’])){ $id = urldecode($_REQUEST[‘id’]); 【$data = explode(“,”,authcode(trim($id),”DECODE”));】 $user_id = $data[0]; $start_time = $data[1]; if ($user_id==””){ $updatepwd_msg = “您的操作有误,请勿乱操作”; }elseif (time()>$start_time+10*60){ $updatepwd_msg = “此链接已经过期,请重新申请”; }else{ $result = usersClass::GetUsers(array(“user_id”=>$user_id)); if ($result == false){ $updatepwd_msg = “您的操作有误,请勿乱操作”; }else{ $_U[‘user_result’] = $result; } } ……
可以看到$data决定了是否能够重置密码,能够重置谁的密码。正常情况下,$data应当是一个拥有两个及以上元素的数组,其中第一个元素表示需要重置的用户ID,第二个元素表示令牌的生成时间(10分钟后过期)。
在$data的解码过程中,authcode函数非常重要,接着来看看authcode函数的处理过程,该函数位于文件/core/function.inc.php:
code 区域
function authcode($string,$operation = ‘DECODE’,$key = ”,$expiry = 0) { $ckey_length = 4; $key = md5($key ?$key : “dw10c20m05w18″); $keya = md5(substr($key,0,16)); $keyb = md5(substr($key,16,16)); $keyc = $ckey_length ?($operation == ‘DECODE’?substr($string,0,$ckey_length): substr(md5(microtime()),-$ckey_length)) : ”; ……
可以看到,这个函数拥有一个默认的密钥,而之前验证的过程中,并没有指定一个特别的密钥。
社会主义的直觉告诉我,那这里就有个世界和平问题。
我随便挑了一个用了这个软件的站点,发起密码重置请求,得到了字符串:
本地使用默认密钥反解这个字符串,得到:
接着,把3494改成1,并加密回去,看看能不能重置这货的密码:
呵呵。
更为可怕的是,这货的支付密码还能以同样的方式被重置:
嗯,看来过不了几天我就能超越马云爸爸了。哎,警察同志您先别开枪……
相关文章推荐
- 苹果宣布首批HomeKit智能家居设备将在6月上市
- 图解互联网+与云计算,物联网,大数据的关系
- 金融中心上海,错过了互联网,还要错过互联网金融么?
- “互联网+”有错误,股市疯狂不知要如何收场
- 「中国移动互联网测试大会」报名开始啦!
- 扒一扒IT大佬高考:马云数学1分考北大 李彦宏是状元
- 马云、李嘉诚、周立波三句话,告诉你三个需要拼搏的理由
- 互联网+医疗(FW)
- 互联网测试查见问题
- 信庭嵌入式工作室-互联网+五棵松黑车的一次对话
- 什么是互联网数据中心及它是如何工作?
- 什么是域名备案
- IDC服务品质协议范本留存
- CDN服务品质协议1
- 拿什么拯救你?人口红利消失后的互联网
- 互联网行业的奇葩问答,瞬间秒碎你的节操!
- IT大佬高考成绩单:李彦宏是状元 马云数学仅1分
- 王健林谈万达电商CEO离职:互联网出身的人只会卖东西
- 光谱郑匡移动互联网O2O完美融合
- 什么是云硬盘、云镜像和硬盘快照