欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

天融信关于ThinkPHP 5.1.x SQL注入漏洞分析

来源:本站整理 作者:佚名 时间:2018-10-01 TAG: 我要投稿

一、背景介绍
ThinkPHP 是一个快速、简单的基于 MVC 和面向对象的轻量级 PHP 开发框架,遵循 Apache2 开源协议发布。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重开发体验和易用性,为 WEB 应用和 API 开发提供了强有力的支持。
在近期,ThinkPHP 框架被曝出存在SQL注入漏洞。由于SQL注入漏洞的危害性以及该框架应用十分广泛。 对此,天融信阿尔法实验室以静态和动态两种方式对该漏洞进行了深入分析。
1.1 漏洞描述
在ThinkPHP5.1.23之前的版本中存在SQL注入漏洞,该漏洞是由于程序在处理order by 后的参数时,未正确过滤处理数组的key值所造成。如果该参数用户可控,且当传递的数据为数组时,会导致漏洞的产生。
1.2 受影响的系统版本
ThinkPHP
1.3 漏洞编号
CVE-2018-16385
二、环境搭建
1.下载安装thinkphp5.1.x
对于thinkphp5.1.x完整版,目前官方没有直接下载的链接。Github上只是放出核心版。该版本需要以Composer或Git方式进行安装。
这里以Composer安装方式说明。
在 Linux 和 Mac OS X 中可以运行如下命令:
curl -sS https://getcomposer.org/installer | php
mv composer.phar/usr/local/bin/composer
在 Windows 中,你需要下载并运行 Composer-Setup.exe 。
安装好之后,切换路径到WEB目录下运行:
composercreate-project topthink/think=5.1.1 tp5.1 --prefer-dist
然后会生成一个名为tp5.1的文件夹。到此think5.1.1下载成功。
2.然后在浏览器中访问 

如果出现该页面,则证明安装成功。
3.Demo示例

编写Demo文件,并将文件命名为Test.php,然后放在/tp5.1/application/index/controller/目录下。
4.数据库
与Demo文件匹配,需要创建一个user表,然后设一个字段(id)。

三、漏洞细节
在/thinkphp/library/think/db/Builder.php parseOrder()的函数中:

通过Demo传入order参数内容,当传入的$order是一个数组时,foreach函数将$order数组分为key和value形式。
根据漏洞修复补丁,知道漏洞发生在parseOrderField()函数中。
当$val为数组时,会进入parseOrderField()函数。
跟踪parseOrderField()函数

getOptions()函数是获取了当前要查询的参数,getFieldsBind()函数是获取数据表绑定信息,foreach循环是对$val值进行了处理,这里其实不是重点,就提一下。$val值是什么不用管,因为注入点在$key上,而$val 拼接在$key后面,可以在构造$key加#注释掉$val。

重点是parseKey()函数,跟踪parseKey()函数。

这里对传入的$key进行多重判断以及处理。
1. is_numeric判断,如果是数字,则返回,不是的话继续向下执行。
2. 判断$key是否属于Expression类。
3. strpos($key, ‘->’) && false ===strpos($key, ‘(‘) 。
4. (‘*’ != $key && ($strict ||!preg_match(‘/[,\'\"\*\(\)`.\s]/’, $key)))。
因为$key是我们的sql注入语句,所以1.2.3肯定不满足,而4满足。
所以此时的$key会在左右两侧加个 ` 号。
$table不存在,不会对$key修改,所以加 ` 号后会返回$key,然后和$val以及field字符串进行拼接,再然后return赋值给array变量,紧接着,array与order by 字符串进行拼接形成order by查询语句,最终系统调用query()函数进行数据库查询,触发漏洞。

着重说明一下,这里由于field函数,漏洞利用有两个关键点:
首先解释下field()函数:MySQL中的field()函数作用是对SQL中查询结果集进行指定顺序排序。一般与order by 一起使用。
关键点1:

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载