年8月23日,ThinkPHP团队对thinkphp3框架进行了一处安全更新,经过分析,此次更新修正了一处SQL注入漏洞,该问题是由于select(),find(),delete()方法会传入数组类型数据,最终导致多处SQL注入。
千里百科
ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于年初,原名FCS,年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。ThinkPHP可以支持windows/Unix/Linux等服务器环境,正式版需要PHP5.0以上版本支持,支持MySql、PgSQL、Sqlite多种数据库以及PDO扩展,ThinkPHP框架本身没有什么特别模块要求,具体的应用系统运行环境要求视开发所涉及的模块决定。
漏洞描述
从github上ThinkPHP的更新来看,ThinkPHP本次更新主要更新了ThinkPHP/Library/Think/
Model.class.php文件,其中将delete,find,select三个函数内option的调用进行大量修改,修改内容如下图所示:
ThinkPHP其中,三个函数所修改的共性在与:外部所传的options参数修改为this-option参数,同时不再用$options=$this-_parseOptions($options)来解析options参数。所以此次漏洞的触发点存在于parseOptions($options)中。外部所传入的“options”可绕过过滤进入参数解析阶段。攻击者可以通过绕过编码,构造poc进行SQL注入攻击。
漏洞复现
上面描述的可能过于专业化,我们准备了一个漏洞复现让各位小伙伴们直观的了解一下。
我们据此搭建了一套ThinkPHPv3.2.3的运行环境。搭建好框架之后,我们需要写一个实例来实现:
首先建立好复现所需要的数据库场景:
数据库表名test,其中有3个字段id、username、pass。
2.启动服务器后,打开ThinkPHP欢迎页面,如下所示:
数据库环境设计好之后需要建立对应模块的数据表的查询语言。
3.然后通过构造的PoC来进行访问: