callback噩梦:解析著名CMS框架Drupal SQL注入漏洞

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:
FreeBuf科普  Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成。连续多年荣获全球最佳CMS大奖,是基于PHP语言最著名的WEB应用程序。  前几天爆了一个 Drupal 的 SQL Injection 注入漏洞,但是这个漏洞不止与 SQL 注入这么简单,还可以利用其来 RCE(远程代码执行)。知名安全研究人员StefanEsser 在 Twitter 上也有提及,可是没有透露细节。

callback噩梦:解析著名CMS框架Drupal SQL注入漏洞

不过今天再看的时候发现,远程代码执行的  exp 已经放出  ,那我也不藏着掖着了,把挖掘的过程记录一下,算是本人第一次代码审计的产物好了。 SE 说的是 Drupal 的 callbacks 造成的 RCE。那么我们审计的 point 就要在 callback 上。PHP 内置的一个函数  call_user_func_array  可以做到这一点,其中接受参数如下:
call_user_func_array ( callable $callback , array $param_arr )
第一个参数是 function 的名称,第二个参数是要调用的参数的参数。 利用这几个特性,可以实现 Drupal 的各种花式 getshell。我只审计出来一种,还有很多方式并没有去实现(毕竟渣渣看不出来)。

Drupal特性引发漏洞

Drupal 有一个特性,可以让管理员添加 PHP tag 来写文章,叫做 PHP filter。这个特性默认是关闭的。当然,由于 PDO 可以执行多行 SQL 语句的特性,我们可以直接添加管理用户然后登录上去,打开 PHP filter 的 Module,然后发表文章,最后 getshell。  想要自动化也简单,那就是把从打开 PHP filter 到发表文章的所有执行过的 SQL 语句合在一起当作 Payload,最后 getshell。这个思路的 POC 我也做过,可惜太过于繁琐,最后 Payload 出来很长很长,一点也不优雅,而且并没有利用到 callback 的特性。为了钻个牛角尖,咱就来审计一下如何花式 getshell。 上文中说了 PHP filter 是一个可以执行 PHP 代码的特性,而 PHP filter 所在的文件是/modules/php/php.module这个文件,其中:
function php_eval($code) {    ..    ob_start();      die($code);    print eval('?>' . $code);    $output = ob_get_contents();    ob_end_clean();    $theme_path = $old_theme_path;    return $output;  }
这个函数就是用来执行 custom php code 的函数。

callback引发命令执行

对于审计的工具,我这种渣渣直接就 find 然后 grep 定位文件,在用 phpstorm + ideavim(plugin of phpstorm),来跟踪函数,轻松愉快ow<。 我们很确定的是我们要找 call_user_func_array 这个函数,利用如下命令来查找:
cd /var/www/html/drupal  find . -type f -name "*" | xargs grep call_user_func_array
其实我们可以进一步缩小范围,因为第一个函数是我们调用的函数,而如果我们想利用的话,call_user_func_array这个函数的第一个参数我们要可以控制,那么进一步缩小范围:
find . -type f -name "*" | xargs grep call_user_func_array/(//$ | grep -v ". '_'"
结果如下:

callback噩梦:解析著名CMS框架Drupal SQL注入漏洞

我们接下来就要查看上下文,看从哪里可以控制那个变量。经过逐一排查,我定位到/include/menu.inc这个文件中的menu_execute_active_handler函数。   阅读可以发现,我们可以控制$_GET['q']这个参数,接着进入menu_get_item这个函数。这个函数的核心代码是这里:   在 menu_router 里查询我们输入的$_GET['q'],然后从返回所有字段。接着回到menu_execute_active_handler函数。
if ($router_item['include_file']) {        require_once DRUPAL_ROOT . '/' . $router_item['include_file'];  }
这里取出router_item中的include_file,然后用require_once来包含。这里是一个 point,  因为 Drupal 默认不开启 PHP filter,这里包含了就可以不用开启 PHP filter 了  。 接着取出router_item中的page_callback,带入call_user_func_array执行。 到此为止整个流程我们已经很清楚了。 需要注意的是page_arguments的第一个参数才会被执行,而第一个参数正是$_GET['q']的值。

利用测试

通过注入向 menu_router 表中插入一段数据:
path 为要执行的代码;  include_file 为 PHP filter Module 的路径;  page_callback 为 php_eval;  access_callback 为 1(可以让任意用户访问)。
访问地址即可造成 RCE。 我们来测试一下。首先在数据库执行语句:
insert into menu_router (path,  page_callback, access_callback, include_file) values ('<?php phpinfo();?>','php_eval', '1', 'modules/php/php.module');
然后访问http://192.168.1.109/drupal/?q=%3C?php%20phpinfo();?%3E。

callback噩梦:解析著名CMS框架Drupal SQL注入漏洞

exp 已经放出了,地址戳 我 ,咱刚刚下了一个本子特赞,撸去了。 [参考来源 ricter.me ,转载请注明来自



原文发布时间:2017年3月24日

本文由:安全加 发布,版权归属于原作者

原文链接:http://toutiao.secjia.com/callback%E5%99%A9%E6%A2%A6%EF%BC%9A%E8%A7%A3%E6%9E%90%E8%91%97%E5%90%8Dcms%E6%A1%86%E6%9E%B6drupal-sql%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E

本文来自云栖社区合作伙伴安全加,了解相关信息可以关注安全加网站

相关文章
|
5天前
|
存储 安全 网络安全
网络安全的屏障与钥匙:漏洞防御与加密技术深度解析
【10月更文挑战第20天】在数字世界的迷宫中,网络安全是守护我们数据宝藏的坚固盾牌和锋利钥匙。本篇文章将带您穿梭于网络的缝隙之间,揭示那些潜藏的脆弱点—网络安全漏洞,同时探索如何通过现代加密技术加固我们的数字堡垒。从基本概念到实战策略,我们将一同揭开网络安全的神秘面纱,提升您的安全意识,保护个人信息不受侵犯。
40 25
|
13天前
|
SQL 监控 数据库
SQL语句是否都需要解析及其相关技巧和方法
在数据库管理中,SQL(结构化查询语言)语句的使用无处不在,它们负责数据的查询、插入、更新和删除等操作
|
20天前
|
SQL 存储 数据库
SQL语句是否都需要解析及其相关技巧与方法
在数据库管理系统中,SQL(Structured Query Language)语句作为与数据库交互的桥梁,其执行过程往往涉及到一个或多个解析阶段
|
5天前
|
存储 域名解析 缓存
了解攻击者如何利用Active Directory中的DNS漏洞
DNS服务器是AD环境中不可或缺的一部分。使用DNS服务器可以完成一些简单但关键的活动,如身份验证、查找计算机和识别域控制器。
|
13天前
|
SQL 数据可视化 BI
SQL语句及查询结果解析:技巧与方法
在数据库管理和数据分析中,SQL语句扮演着至关重要的角色
|
18天前
|
SQL 监控 关系型数据库
SQL错误代码1303解析与处理方法
在SQL编程和数据库管理中,遇到错误代码是常有的事,其中错误代码1303在不同数据库系统中可能代表不同的含义
|
18天前
|
SQL 存储 关系型数据库
SQL默认索引是什么:深入解析与技巧
在SQL数据库中,索引是一种用于提高查询性能的重要数据结构
|
18天前
|
SQL 运维 安全
怎样可以找到SQL漏洞:技巧与方法详解
SQL漏洞,特别是SQL注入漏洞,是Web应用中常见的安全威胁之一
|
19天前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:实现过程与关键细节解析an3.021-6232.com
随着互联网技术的快速发展,ASP.NET作为一种广泛使用的服务器端开发技术,其与数据库的交互操作成为了应用开发中的重要环节。本文将详细介绍在ASP.NET中如何连接SQL数据库,包括连接的基本概念、实现步骤、关键代码示例以及常见问题的解决方案。由于篇幅限制,本文不能保证达到完整的2000字,但会确保
|
2月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")

推荐镜像

更多