漏洞概要 关注数(24) 关注此漏洞
缺陷编号:wooyun-2015-0100225
漏洞标题:ThinkPHP一处过滤不当造成SQL注入漏洞
相关厂商:ThinkPHP
漏洞作者: phith0n
提交时间:2015-03-08 21:39
修复时间:2015-06-06 21:52
公开时间:2015-06-06 21:52
漏洞类型:SQL注射漏洞
危害等级:高
自评Rank:12
漏洞状态:厂商已经确认
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]
Tags标签: 无
漏洞详情
披露状态:
2015-03-08: 细节已通知厂商并且等待厂商处理中
2015-03-08: 厂商已经确认,细节仅向厂商公开
2015-03-11: 细节向第三方安全合作伙伴开放
2015-05-02: 细节向核心白帽子及相关领域专家公开
2015-05-12: 细节向普通白帽子公开
2015-05-22: 细节向实习白帽子公开
2015-06-06: 细节向公众公开
简要描述:
内核中某个模块开发的太粗糙啦。
详细说明:
问题出现在session,Thinkphp支持更换session handle。
handle中包括Db和Memcache,如下配置即可使用数据库作为session的存储器:
设置了选项后,在数据库里插入这个表(前缀think_可以自己定义):
这都是官方给出的(包含在文档和代码注释中)一些配置方法,不多说了。
配置好了以后我写了个小example:
很普通一个过程,在login方法中登录,记录用户输入的用户名I('get.username')作为$_SESSION['admin'],在index方法中判断session中是否存在admin,不存在则要求其登录。
看到/ThinkPHP/Think/Session/Driver/Db.class.php
实际上thinkphp将Db类中的open/close/read/write/destroy/gc用session_set_save_handler注册成为了session的handle。
write是设置session时的回调函数,其中$sessData就是当前session经过serialize的值。我们看到这里直接将$sessData拼接入SQL语句了,并没有转义。
所以造成了一个SQL注入。只要设置时session的值用户能够控制,比如用户名、昵称什么的,就能够产生SQL注入。
漏洞证明:
上述example脚本,访问http://10.211.55.3/thinkphp/index.php/home/admin/login?username=aaaaa%27aaaaaa
查看执行的SQL语句:
单引号已经带入了。
进行延时注入:
最后说一下,既然框架给开发者提供了自定义driver,那么这就作为框架的一部分进行维护,同样是不能草率的。不要因为不是默认使用的功能,就不去重视。
另外,内核部分的代码还使用SQL拼接这种方式去执行SQL语句,感觉不太合适。
修复方案:
且不论是否会产生sql注入,这里只要session的值中含有单引号,这个session就直接设置不了了,直接影响框架功能。所以需要在插入之前进行转义:
版权声明:转载请注明来源 phith0n@乌云
漏洞回应
厂商回应:
危害等级:中
漏洞Rank:5
确认时间:2015-03-08 21:51
厂商回复:
今天会对扩展类库进一步强化
最新状态:
暂无