Drupal SQL 注入(CVE-2014-3704)
前言
参考披露的报告复现
影响版本: Drupal 7.0 ~ 7.31
漏洞类型: SQL Injection (无需认证)
漏洞文件: includes/database/database.inc
漏洞函数: DatabaseConnection::expandArguments()
漏洞复现
漏洞代码
文件路径: includes/database/database.inc
1 | protected function expandArguments(array $args) { |
构造一个恶意输入
1 | $malicious = [ |
打断点调试(这里采用的是模拟的过程)
可以看到当前参数 $args 的值是 user 和 options 两个数组

进入第一个 foreach 循环中,$key 是第一个数组 user,$value 是其值
因为 $value 是数组,所以命中了 if

继续往后面走,$i 是数组 $value 键名,$val 是其值

更新 $new_keys 为 user_name = "Alice"

往后走,此时 $new_keys 的值更新完毕

新数组与第二个数组合并

接下来处理第二个数组,方法一样

新的第二个数组出来了

最后 return 返回的值,可以看到我们的键名是一个万能密码

最后生成的数组如下

利用链
1 | user_login_submit() |
传入 expandArguments() 的 $args 参数为:
1 | $args = array( |
最后展开的结果
1 | array( |
POC
1 | POST /?q=node&destination=node |