一、 事件背景
ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。ThinkPHP可以支持windows/Unix/Linux等服务器环境,正式版需要PHP5.0以上版本支持,支持MySql、PgSQL、Sqlite多种数据库以及PDO扩展。
近日,ThinkPHP进行了一项安全更新,修正了ThinkPHP由于select(),find(),delete()方法可能会传入数组类型数据产生的多个SQL注入隐患。
二、 漏洞复现
搭建好存在漏洞的ThinkPHP版本。
构造好恶意的请求后进行访问:
成功执行了恶意的SQL语句。
三、 漏洞分析及危害
1) 漏洞分析
漏洞出现在ThinkPHP/Library/Think/Model.class.php文件,文件内delete,find和select三个函数在处理传入的$options参数时,未对参数做合理的过滤,且$options参数可控,因此导致$options参数经由_parseOptions函数后执行了恶意的SQL查询语句。
$options函数被上述函数接受之后,会进行相关判断,如果$options为数字或者字符串,则直接以当前表的主键作为查询字段。函数内还提供了复合主键的查询,如果$options和$pk均为数组,即不止存在一个主键时,就可以绕过判断,直接通过_parseOptions函数进行解析。
_parseOptions函数中,可以看到对$options的解析没有进行过滤:
对$options解析完成之后传入到了select方法,该方法的最后调用了parseSql方法对$options的值进行替换、解析。其中$options['table']使用了parseTable进行解析,可以看到如果传入的不为数组时,没有经过任何过滤就进行解析返回带入查询:
因此,只要构造出满足上述条件的请求,就可以执行恶意的sql语句。
2) 漏洞危害
1. 数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
2. 网页篡改:通过操作数据库对特定网页进行篡改。
3. 网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
4. 数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
5. 服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
6. 破坏硬盘数据,瘫痪全系统。
四、 数据分析
国内分布
中国境内使用ThinkPHP的主机数量约为5.1万个。其中,排名前五的省份或地区分别为:浙江省、广东省、北京市、香港特别行政区、山东省。
下图为中国范围内使用ThinkPHP的主机分布情况:
图1、国内分布图
下图为中国范围内使用ThinkPHP的主机数量排名前十省份或地区:
图2、国内排名前十
下图为使用ThinkPHP的主机的国内运营商排名:
图3、国内运营商排名前十
五、 防范建议
1) 漏洞影响版本
ThinkPHP 3.2之前的版本
2) 修复建议
不再分析由外部传进来的$options,使得不再可控$options[‘xxx’]。