漏洞概要 关注数(24) 关注此漏洞
缺陷编号:wooyun-2015-0121708
漏洞标题:ThinkPHP设计缺陷导致逻辑漏洞造成密码找回绕过等问题
相关厂商:ThinkPHP
漏洞作者: Ricter
提交时间:2015-06-20 10:06
修复时间:2015-09-23 10:09
公开时间:2015-09-23 10:09
漏洞类型:设计缺陷/逻辑错误
危害等级:中
自评Rank:10
漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]
Tags标签: 无
漏洞详情
披露状态:
2015-06-20: 细节已通知厂商并且等待厂商处理中
2015-06-25: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2015-08-19: 细节向核心白帽子及相关领域专家公开
2015-08-29: 细节向普通白帽子公开
2015-09-08: 细节向实习白帽子公开
2015-09-23: 细节向公众公开
简要描述:
在不正确使用 ThinkPHP 时,可能会造成参数处理流程导致的逻辑漏洞。
详细说明:
ThinkPHP 处理传入的参数的时候,如果直接带入一个数组,接着数组带入 SQL 语句,会产生之前 phithon 大牛爆的 0day: WooYun: ThinkPHP框架架构上存在SQL注入
利用方式很简单:
然而,thinkphp 支持的不仅仅是 exp,像 like、in,都会支持。
也就是说,我们可以在很多地方精心构造一个参数,导致造成逻辑漏洞。比如找回密码、权限验证等。
我们传入:
这样就会编译成如下 mysql 语句:
举个例子:
找回密码的地方,总会有一个 token,这个token如果储存在数据库,又从 url 接受的话,就会有如下情况。
假如 token 为 202cb962ac59075b964b07152d234b70,找回密码的 url 为:
那么我们传入:
不用知道全部的 token 即可重置管理员的密码,因为 2% 在 mysql 中匹配正好会匹配到 202cb962ac59075b964b07152d234b70。
比如在 ThinkOX 登录的地方:
POST 内容:
执行的 SQL 语句为:
POST 内容:
执行的 SQL 语句为:
漏洞证明:
手头没有源码可以测试,但是有一个线上业务,就此测试一下。
1. https://i.hostker.com/member/forgot_password
发送找回密码邮件:
2.猜测收到的 token,成功发送密码到邮箱
(实际上我没有猜测,因为收到的token开头为 if,所以我直接用 if%来访问)
https://i.hostker.com/member/reset_password?session[0]=like&session[1]=if%25
这个案例实际上不算利用很成功的案例,因为密码不是在线重设的而是发送到自己的邮箱。<del>给 Hostker 的安全赞一个</del>。
修复方案:
在利用 ThinkPHP 写东西时,最好避免直接讲传入的参数带入 SQL 语句。因为构造数组的话很容易出问题。
版权声明:转载请注明来源 Ricter@乌云
漏洞回应
厂商回应:
危害等级:无影响厂商忽略
忽略时间:2015-09-23 10:09
厂商回复:
漏洞Rank:8 (WooYun评价)
最新状态:
暂无