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

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-086742

漏洞标题:ThinkPHP架构设计不合理极易导致SQL注入

相关厂商:ThinkPHP

漏洞作者: phith0n

提交时间:2014-12-11 09:01

修复时间:2015-03-11 09:02

公开时间:2015-03-11 09:02

漏洞类型:设计错误/逻辑缺陷

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-12-11: 细节已通知厂商并且等待厂商处理中
2014-12-11: 厂商已经确认,细节仅向厂商公开
2014-12-14: 细节向第三方安全合作伙伴开放
2015-02-04: 细节向核心白帽子及相关领域专家公开
2015-02-14: 细节向普通白帽子公开
2015-02-24: 细节向实习白帽子公开
2015-03-11: 细节向公众公开

简要描述:

没有上一个问题严重,但也是thinkphp设计上的隐患,提出来希望能修改,不过忽略了也没办法。
实际上这两个洞的意义不仅于此,这是框架流行的时代,注入的一个新思路。

详细说明:

这个问题其实应该从前段时间Th1nk发的mongodb注入说起,http://drops.wooyun.org/tips/3939,其中提到了mongodb一种注入方式:

05.jpg


然后parsec团队里前段时间也在讨论这个问题,究竟这个漏洞是php的特性,还是mongodb的特性。后来jin发了一个精华:http://wooyun.org/bugs/wooyun-2010-086474,也从侧面印证了一个问题,这个特性(获得的GP可以是字符串也可以是数组)不仅仅是PHP存在,只要框架支持,那么就可以存在。
当然我这个洞是PHP的洞,但实际上问题出在thinkphp框架上。
问题还是在“表达式查询”这里:http://document.thinkphp.cn/manual_3_2.html#express_query
在文档里看到,我们居然可以控制查询表达式的符号:

04.jpg


这个设计和mongodb的就很类似,很可能造成安全问题,比如万能密码。
写个例子证明:

public function test()
{
if (IS_POST) {
$uname = I('post.uname', '', 'trim');
$upass = I('post.upass', '', 'trim');
$remember = I('post.remember');
if (empty($uname) || empty($upass)) {
$this->error('用户名或密码不能为空');
}
$row = M('user')->where(array(
'uname' => $uname,
'passwd' => $upass
))->find();
if (empty($row)) {
echo 0;
}else{
echo 1;
}
}
}


这是控制器里的一个登录函数,如果账号/密码输入正确则输出1,否则输出0.
很普通的一个逻辑,也是经常出现在各种应用中前/后台登录的方式。
正常情况下,随便输入一个账号/密码是肯定错误的,输出0:

06.jpg


我们将uname[0]设置为neq,也就是“不等于”,upass[0]也设置为neq,1随意:

07.jpg


果然已经注入成功了,我们看看数据库语句究竟是什么:

08.jpg


实际上我们控制了操作符,所以让uname<>aaaa,upass<>bbbb,那么这句话肯定成立,就此造成了一个万能密码,成功登录。
具体实例可能需要慢慢找,因为一般password会进行md5,导致我们传入数组是不行的。但这个思路可以引申到所有使用where语句的地方。

漏洞证明:

见详细说明。

修复方案:

强制转换为字符串,再放入where语句。

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:8

确认时间:2014-12-11 17:04

厂商回复:

该漏洞在系统没有对用户数据做严谨判断,并且在可能的业务逻辑的情况下会导致SQL注入的产生。目前的github版本TP和OT均已修正~

最新状态:

暂无


漏洞评价:

评论

  1. 2014-12-11 09:12 | 玉林嘎 ( 普通白帽子 | Rank:758 漏洞数:96 )

    mark

  2. 2014-12-11 09:40 | xfkxfk 认证白帽子 ( 核心白帽子 | Rank:2179 漏洞数:338 | 呵呵!)

    来看ph牛的注入新思路

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

    手握众多0day的ph牛

  4. 2014-12-11 11:26 | 牛肉包子 ( 普通白帽子 | Rank:254 漏洞数:64 )

    师傅好屌!

  5. 2014-12-11 17:15 | 袋鼠妈妈 ( 普通白帽子 | Rank:449 漏洞数:61 | 故乡的原风景.MP3)

    卧槽

  6. 2014-12-11 17:19 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    这个@thinkphp 不考虑带个乌云的感谢?

  7. 2014-12-11 20:01 | phith0n 认证白帽子 ( 核心白帽子 | Rank:656 漏洞数:107 | 一个想当文人的黑客~)

    @xsser 咦,我这两个洞为啥没算在通用里?乌云榜上一个算在PC,一个算在web? @疯狗 @Finger

  8. 2014-12-11 20:02 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    @phith0n 搞错了吧

  9. 2014-12-11 20:20 | phith0n 认证白帽子 ( 核心白帽子 | Rank:656 漏洞数:107 | 一个想当文人的黑客~)

    @xsser 帮我改改吧,我提交的时候好像都选的通用~

  10. 2014-12-11 22:05 | goubuli ( 普通白帽子 | Rank:324 漏洞数:61 )

    通用牛人

  11. 2014-12-12 09:00 | 小森森 ( 路人 | Rank:11 漏洞数:2 | 不中二 枉少年)

    看了github的commit log,表示好想法

  12. 2014-12-12 10:56 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    @phith0n 已撸

  13. 2014-12-12 12:23 | 0c0c0f ( 实习白帽子 | Rank:48 漏洞数:15 | My H34rt c4n 3xploit 4ny h0les!)

    }elseif(is_array($val) && isset($_REQUEST[$key]) && is_array($_REQUEST[$key])){ $options['where'][$key] = (string)$val; }

  14. 2014-12-15 14:00 | abaddon ( 实习白帽子 | Rank:37 漏洞数:10 | 我叫什么名字)

    值得研究 基于架构的三个美刀符号的闪电是什么东西等公开

  15. 2015-03-11 09:30 | 穿山甲 ( 路人 | Rank:4 漏洞数:1 | 处于学习阶段,跟老师傅学习中。。。)

    思路新颖,赞一个~~~