当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(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标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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。

QQ20150308-1@2x.png


handle中包括Db和Memcache,如下配置即可使用数据库作为session的存储器:

QQ20150308-2@2x.png


设置了选项后,在数据库里插入这个表(前缀think_可以自己定义):

/**
* 数据库方式Session驱动
* CREATE TABLE think_session (
* session_id varchar(255) NOT NULL,
* session_expire int(11) NOT NULL,
* session_data blob,
* UNIQUE KEY `session_id` (`session_id`)
* );
*/


这都是官方给出的(包含在文档和代码注释中)一些配置方法,不多说了。
配置好了以后我写了个小example:

<?php
namespace Home\Controller;
use Think\Controller;
class AdminController extends Controller {
function __construct(){
Controller::__construct();
session(array('name'=>'session_id','expire'=>3600));
}
public function index(){
$admin = session("admin");
if(!empty($admin)){
$this->show("欢迎登录,{$admin}",'utf-8');
}else{
$this->show('你没有登录,请登录','utf-8');
}
}
public function login(){
session("admin", I('get.username'));
$this->show('登录成功','utf-8');
}
}


很普通一个过程,在login方法中登录,记录用户输入的用户名I('get.username')作为$_SESSION['admin'],在index方法中判断session中是否存在admin,不存在则要求其登录。
看到/ThinkPHP/Think/Session/Driver/Db.class.php

/**
* 写入Session
* @access public
* @param string $sessID
* @param String $sessData
*/
public function write($sessID,$sessData) {
$hander = is_array($this->hander)?$this->hander[0]:$this->hander;
$expire = time() + $this->lifeTime;
mysql_query("REPLACE INTO ".$this->sessionTable." ( session_id, session_expire, session_data) VALUES( '$sessID', '$expire', '$sessData')",$hander);
if(mysql_affected_rows($hander))
return true;
return false;
}


实际上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

QQ20150308-3@2x.png


查看执行的SQL语句:

QQ20150308-4@2x.png


单引号已经带入了。
进行延时注入:

QQ20150308-5@2x.png


QQ20150308-6@2x.png


最后说一下,既然框架给开发者提供了自定义driver,那么这就作为框架的一部分进行维护,同样是不能草率的。不要因为不是默认使用的功能,就不去重视。
另外,内核部分的代码还使用SQL拼接这种方式去执行SQL语句,感觉不太合适。

修复方案:

且不论是否会产生sql注入,这里只要session的值中含有单引号,这个session就直接设置不了了,直接影响框架功能。所以需要在插入之前进行转义:

/**
* 写入Session
* @access public
* @param string $sessID
* @param String $sessData
*/
public function write($sessID,$sessData) {
$hander = is_array($this->hander)?$this->hander[0]:$this->hander;
$expire = time() + $this->lifeTime;
$sessData = addslashes($sessData);
mysql_query("REPLACE INTO ".$this->sessionTable." ( session_id, session_expire, session_data) VALUES( '$sessID', '$expire', '$sessData')",$hander);
if(mysql_affected_rows($hander))
return true;
return false;
}

版权声明:转载请注明来源 phith0n@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2015-03-08 21:51

厂商回复:

今天会对扩展类库进一步强化

最新状态:

暂无


漏洞评价:

评论

  1. 2015-03-08 21:43 | goubuli ( 普通白帽子 | Rank:324 漏洞数:61 )

    你关注的白帽子 phith0n 发表了漏洞 ThinkPHP一处过滤不当造成SQL注入漏洞

  2. 2015-03-08 21:47 | izy ( 普通白帽子 | Rank:111 漏洞数:22 | http://1zy.pw/)

    你关注的白帽子 phith0n 发表了漏洞 ThinkPHP一处过滤不当造成SQL注入漏洞

  3. 2015-03-08 21:49 | 泳少 ( 普通白帽子 | Rank:231 漏洞数:79 | ★ 梦想这条路踏上了,跪着也要...)

    你关注的白帽子 phith0n 发表了漏洞 ThinkPHP一处过滤不当造成SQL注入

  4. 2015-03-08 21:56 | _Thorns ( 普通白帽子 | Rank:882 漏洞数:157 | 收wb 1:5 无限量收 [平台担保]))

    你关注的白帽子 phith0n 发表了漏洞 ThinkPHP一处过滤不当造成SQL注入漏洞

  5. 2015-03-08 22:26 | phith0n 认证白帽子 ( 核心白帽子 | Rank:656 漏洞数:107 | 一个想当文人的黑客~)

    @ThinkPHP 秒确认。。。多在首页待一会也不行。。。

  6. 2015-03-09 00:15 | Xc0d3r ( 路人 | Rank:2 漏洞数:2 | )

    $sessData = addslashes($sessData);

  7. 2015-03-09 09:44 | sky ( 实习白帽子 | Rank:94 漏洞数:33 | 有一天,我带着儿子@jeary 去@园长 的园长...)

    你关注的白帽子 phith0n 发表了漏洞 ThinkPHP一处过滤不当造成SQL注入漏洞

  8. 2015-03-09 11:13 | 封停 ( 实习白帽子 | Rank:38 漏洞数:8 | 求老中医指路)

    Nb

  9. 2015-03-09 13:16 | lightless ( 实习白帽子 | Rank:48 漏洞数:11 | HDUISA成员,被某厂坑了一波,求工作。)

    你关注的白帽子 phith0n 发表了漏洞 ThinkPHP一处过滤不当造成SQL注入漏洞

  10. 2015-03-09 16:06 | 冰@封 ( 路人 | Rank:4 漏洞数:2 | 凄凄黑夜间,残影舞指间。)

    6666

  11. 2015-03-09 17:47 | 憨厚的王小胖 ( 路人 | Rank:7 漏洞数:1 | 我肯定憨厚啊)

    为什么不是通用

  12. 2015-03-11 11:26 | Fire ant ( 实习白帽子 | Rank:73 漏洞数:26 | 他们回来了................)

    你关注的白帽子 phith0n 发表了漏洞 ThinkPHP一处过滤不当造成SQL注入漏洞

  13. 2015-03-12 12:24 | 袋鼠妈妈 ( 普通白帽子 | Rank:449 漏洞数:61 | 故乡的原风景.MP3)

    大牛好!

  14. 2015-03-12 14:13 | 明月影 ( 路人 | Rank:12 漏洞数:8 | 学姿势,学思路。)

    过来关注下。

  15. 2015-03-13 15:37 | Anonymous.L ( 实习白帽子 | Rank:37 漏洞数:8 | 最后一位关注xxxx的人 , 孤独之人)

    你关注的白帽子 phith0n 发表了漏洞 ThinkPHP一处过滤不当造成SQL注入漏洞

  16. 2015-06-06 22:23 | 探狗 ( 路人 | Rank:2 漏洞数:2 | 报!!探狗飞报!!!)

    代码审计就是屌

  17. 2015-08-18 11:20 | 昌维 ( 路人 | Rank:2 漏洞数:3 | QQ:867597730,百度贴吧ID:昌维001)

    666