0x00 漏洞概述

2014年10月15日,德国安全研究者Stefan Horst(SE大神)发布重磅消息,全球三大CMS之一的Drupal核心代码出现SQL注入漏洞。

本着朝圣的心态,我去深入的分析了这个漏洞的成因以及利用。个人感觉这个漏洞可以说是打开了SQL注入的一扇新的大门,因为它直接呈现出预编译方法,并非SQL注入的绝对防御。

而在利用方面,我找到了一种利用这个SQL注入轻松RCE的方法,只需要两个HTTP请求哦!

0x01 漏洞根源

这个漏洞出现问题的地方在includes\database\database.inc文件中,代码如下所示:

这段代码是用来对传入数据库中的多个参数值进行预处理用的,因为Drupal对于SQL是会进行预编译处理的(传说中有效防止SQL注入的手段)。但是由于考虑不严,导致攻击者可以通过构造数组,操控数组中的索引key,在预编译之前破坏原有的SQL结构,造成SQL注入攻击。

简单解释下这个过程:

这个函数会对存在多个值的参数进行处理,来应对SQL中IN这样的语句。就像下面这样的SQL,如果name的值是多个,就需要对传入的参数进行进一步处理。

这个函数传入的args参数大概是这样的:

函数首先会检测数组中的值是否也是数组,如果不是则跳过。将符合条件的数组key存入$key中,然后遍历value中的数组,将其中的值存入$new_key数组中,数组索引为$key+value数组中各个值的数字索引。

这里引入了字符串拼接,将SQL注入的风险带入。原本它期待的数据是我们上面给出的那样,但是试想,如果value数组的索引key我们用字符串,而不是数字呢?就像这样:

那$new_keys的索引就会变成“name_test — ”了,带着这个问题我们接着看最关键的地方:

用刚刚生成的$new_key数组索引key引入到了预编译SQL语句中,这样的话SQL语句就会变成这样:

在预编译前就引入了SQL注入问题!

0x02 漏洞利用

在pastebin上有人给出了一个利用Poc,利用登陆时的SQL语句进行注入,部分代码如下所示:

而且由于Drupal使用的是PDO方式操作数据库,可以直接多语句查询,我们可以直接update或者inster一个管理员。

具体操作为,向登陆URL:?q=node&destination=node提交如下POST内容:

这样就可以将admin用户提升为管理员,并且密码设为P@55w0rd。

0x03 漏洞总结

这个漏洞简单直接的切入了对于使用预编译SQL语句方式防止SQL注入的软肋,即在预编译之前注入攻击语句。SE大神就是大神,这个漏洞完全对于SQL注入打开了一扇新的大门。

在利用方面Drupal悲催的使用PDO方式操作数据库,导致攻击者利用这个漏洞可以直接多语句操作数据库。自身超强的加密算法形同虚设,也为攻击者实现代码执行提供了多种便利。

漏洞小结

  1. 影响范围个人评价为“高”,全球知名的三大CMS之一,这影响力不用多说了。
  2. 危害性个人评价为“高”,此漏洞无需任何条件,便可实现远程代码执行。

防护方案

官方的修补方案还是很简单有效的,让该整型的整形,就这么简单:)。

Drupal最新版本为7.32,下载地址为:

https://www.drupal.org/download

0x04 参考文章

【1】《Advisory 01/2014: Drupal – pre Auth SQL Injection Vulnerability》

【2】《Drupal 7.31 pre Auth SQL Injection Vulnerability》

【3】《Drupal 7.x SQL Injection SA-CORE-2014-005》

源链接

Hacking more

...