提权技术研究_Discuz!管理员复制

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

提权技术研究_Discuz!管理员复制

Simeon
Crossday Discuz! Board 论坛系统(简称 Discuz! 论坛)是一个采用 PHP  MySQL 等其它多种数据库构建的高效论坛解决方案。作为商业软件产品, Discuz! 在代码质量,运行效率,负载能力,安全等级,功能可操控性和权限严密性等方面有着良好的口碑。对于站长而言,利用 Discuz! 均能够在最短的时间内,花费最低的费用,采用最少的人力,架设一个性能优异、功能全面、安全稳定的社区论坛平台。它能运行于Windows平台和Linux平台,目前已经有超过100万的用户。
使用Discuz!来建设论坛方便快捷,能够满足论坛功能需求,其安全性与同类相比是相对最高的,因此深受广大用户的喜爱,而在网络攻防技术研究中最为核心的东西就是获取用户数据以及获得系统的完全控制权限,本文主要针对Discuz!数据库如何获取管理员权限而展开研究的。在某些情况下,是完全可以获取一个Webshell,在获取Webshell的情况下,可以进一步获取Mysql等有关数据库连接的用户和密码等信息,由于Discuz!特有的加密方式,即使通过SQL注入猜解获取了Discuz!论坛管理员的密码也无法破解,因此如何通过操作数据库来获得管理员权限就尤为有用。本文研究的技术可以应用在两个方面:
1)恢复论坛管理员的密码。对于Discuz!论坛管理员来说,如果忘记密码了,那么对于整个论坛的管理将无从下手,因此只能想办法恢复。
2)提升权限获取用户数据库文件。在得到Webshell的情况下,通过本文研究的技术可以轻易的查看管理员信息,修改论坛设置、备份数据库等操作,还可以让普通用户具有管理员权限。
实验环境:
1)数据库——Mysql5.1
2Mysql数据库客户端管理软件——Mysql-Front
3Discuz!论坛版本7.0,下载地址:http://download.comsenz.com/Discuz

(一)Discuz!论坛加密方式

Discuz!6.X以及后面的7.0版本都采用md5多重加密,其加密函数有checkmd5authcode该函数在Discuz!缺省安装include目录下的global.func.Php文件中。先采用salt方式,随机获得一个字符串,然后把明文密码MD5之后,再与随机字符串连接起来之后,再次MD5。加密密码为:md5(md5($newpw).$salt) 其中$saltrandom,返回的字符串$hash。这样就极大的提高了用户密码的安全性。

1.checkmd5函数

   function checkmd5($md5, $verified, $salt = '') {
       if(md5($md5.$salt) == $verified) {
              $result = !empty($salt) ? 1 : 2;
       } elseif(empty($salt)) {
              $result = $md5 == $verified ? 3 : ((strlen($verified) == 16 && substr($md5, 8, 16) == $verified) ? 4 : 0);
       } else {
              $result = 0;
       }
       return $result;
}
以上代码主要度对密码进行检测,有三个参数:
 @param string $md5
 @param string $verified
 @param string $salt
返回值为“0”表示失败;为“1”采用“MD5 with salt”;为“2”采用“Dual MD5 为“3”表示是采用正常md5加密方式,为“4”采用“MD5-16方式。

2.authcode函数

function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
 
      $ckey_length = 4;
      $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
      $keya = md5(substr($key, 0, 16));
      $keyb = md5(substr($key, 16, 16));
      $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
 
      $cryptkey = $keya.md5($keya.$keyc);
      $key_length = strlen($cryptkey);
 
      $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
      $string_length = strlen($string);
 
      $result = '';
      $box = range(0, 255);
 
      $rndkey = array();
      for($i = 0; $i <= 255; $i++) {
             $rndkey[$i] = ord($cryptkey[$i % $key_length]);
      }
 
      for($j = $i = 0; $i < 256; $i++) {
             $j = ($j + $box[$i] + $rndkey[$i]) % 256;
             $tmp = $box[$i];
             $box[$i] = $box[$j];
             $box[$j] = $tmp;
      }
 
      for($a = $j = $i = 0; $i < $string_length; $i++) {
             $a = ($a + 1) % 256;
             $j = ($j + $box[$a]) % 256;
             $tmp = $box[$a];
             $box[$a] = $box[$j];
             $box[$j] = $tmp;
             $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
      }
 
      if($operation == 'DECODE') {
             if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
                    return substr($result, 26);
             } else {
                    return '';
             }
      } else {
             return $keyc.str_replace('=', '', base64_encode($result));
       }
 
}
 
以上代码主要用来加密或者解密用户信息,其中参数意义如下:
@param $string - 加密或解密的串
@param $operation - 加密还是解密
@param 密钥
@return 返回字符串
$ckey_length 随机密钥长度 取值 0-32;加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。取值越大,密文变动规律越大,密文变化 = 16  $ckey_length 次方,当此值为 0 时,则不产生随机密钥

(二)使用Mysql-Front管理Mysql数据库

1.设置MySQL-Front

   MySQL-Front是一款MySQL客户端管理软件,可以对MySQL数据库实现图形界面管理,软件下载地址:http://www.mysqlfront.de/download.html。安装MySQL-Front完毕后,直接运行MySQL-Front即可,如图1所示,其中“信息”标签主要用于现实名称,可以随意设置,主要在“注册”标签中进行设置,需要手工输入“用户”和“密码”,“数据库”可以手工输入,也可以程序自动获取,设置完毕后单击“确定”按钮保存数据库设置并回到MySQL“打开登录信息”窗口。
 
设置MySQL-Front
说明:
     1)管理MySQL数据库有多个软件,也可以通过phpmyadmin进行在线管理,其下载地址为:http://www.phpmyadmin.net
     2)本例中使用客户端软件来管理MySQL数据库是因为方便快捷,当然熟悉MySQL命令的朋友也可以手工在命令提示符下执行数据库操作。

2.连接MySQL数据库

在“打开登录信息”窗口中选择刚才设置的MySQL数据,然后打开即可,如图2所示,在MySQL-Front中常用的四个按钮为“对象浏览器”、“数据浏览器”、“SQL编辑器”和“图表”。“对象浏览器”主要用来浏览有哪些表,而“数据浏览器”主要用来查看选中数据库的表中的数据,“SQL编辑器”主要用来执行SQL语句,“图表”主要用来与“对象浏览器”进行切换,更多好用的功能和技巧需要自己去揣摩,就不再此赘述了。
 
打开MySQL数据库

(三)实施管理员复制

1.注册网站用户

在实施管理员复制前,需要先在网站注册一个用户名,例如在本例中注册普通用户“cxb”,密码为“test”,注册成功使用该用户进行登录,如图3所示。
 
使用注册账号登录注册网站

2.通过MySQL-Front查看已注册用户信息

MySQL-Front中查看已经注册的用户信息,选中Discuz!论坛的用户注册表“*_members”,其中“*”为安装设置的名称,如图4所示,在本例中为“antian_members”,该表保存的是用户注册的信息,使用“数据浏览器”打开,可以看到该用户注册的一些详细信息。
 
查看选定用户的注册详细信息
4.修改普通用户为管理员用户
在“antian_members”表中将用户“cxb”的“adminid”值由“0”修改为“1”;将“groupid 值由“12”修改为“1”,然后单击“MySQLFront”上面的发布按钮使修改生效,至此已经将普通用户cxb变成管理员用户,在登录的网页中刷新一下,再次查看用户个人信息,如图5所示,用户“cxb”的用户组已经升级为“Administrator”,可以行使管理员权限。
 
普通用户组已经升级为管理员组

(四)管理员密码丢失解决方案

1.修改管理员密码为已知用户密码

使用Mysql-Front打开myuc_members表后,单击工具条下面的数据浏览器
查看myuc_members表中的数据,如图6所示,先将adminpassword值复制到本地进行备份,以待出现错误后进行恢复,将已知用户的密码值(password中的值)复制到admin中替代原来的值。
 
6修改管理员密码为已知用户密码

2.修改salt

   Discuz!论坛中用户的密码不是普通的加密,而是经过变异的加密,因此还需要保证管理员的密码与已知用户的salt一致,如图7所示,将管理员与已经用户的salt修改成一致。
 
修改salt

3.修改安全问题答案

   Discuz!论坛中的登录模块中单独设置了安全提问,如图8所示,一共有七个安全提问,用户在注册成功后在个人中心的“密码和安全问题”中进行设置,每一个安全提问根据答案生成一串8位的加密字符,密码不同安全字符串也不同。因此如果想要管理员用户使用普通用户的安全提问,则需要将管理员的“secques”设置成普通用户的“secques”,反之,则将普通用户的“secques”设置成管理员的“secques”,如图9所示,将已知用户的“secques”替换管理员的“secques”,然后使用普通用户的安全提问替代管理员的安全提问进行登录。
 
安全提问
 
修改安全提问secques
   至此有关discuz!论坛管理员与普通用户身份之间的转换已经完成,使用修改后的密码和问题答案即可登录,登录后身份为管理员用户,如图10所示,可以对论坛系统进行管理。
 
10 登录后台进行管理

(五)总结与探讨

1.总结

本文探讨了discuz!论坛的加密方法,通过实际的案例讲解了如何通过操作MySQL数据库来更改用户身份,即通过修改普通用户的adminidgroupidsecques以及password的值,可以使“普通用户”变成“管理员”行使管理员权限;同时该方法也适用管理员丢失或者忘记了管理密码,通过该方法可以重新设置密码,并行使管理权限。

2.问题与探讨

本文写完后,又发现该管理员的密码可以直接适用PasswordPro工具软件进行破解,由于篇幅关系就不在本文中进行探讨,关于该论坛的安全问题还有很多话题,例如通过脚本来嗅探或者记录用户登录用户名和密码。在discuz!论坛数据库中用户密码字段生成的是密文,网上有一些脚本可以直接用来记录用户登录的密码。
完整全文:


 本文转自 simeon2005 51CTO博客,原文链接:http://blog.51cto.com/simeon/245210

相关文章
|
7月前
|
安全 PHP Apache
记一次匈牙利服务器提权案例
记一次匈牙利服务器提权案例
55 0
|
运维 关系型数据库 MySQL
|
7月前
|
安全 Shell 数据安全/隐私保护
记一次提权添加管理员实战案例
记一次提权添加管理员实战案例
34 0
|
7月前
|
安全 关系型数据库 MySQL
黑吃黑Getshell到提权实战案例
黑吃黑Getshell到提权实战案例
210 0
|
7月前
|
XML 开发框架 安全
记一次后门爆破到提权实战案例
记一次后门爆破到提权实战案例
49 0
|
7月前
|
运维 关系型数据库 MySQL
绕过360安全卫士提权实战案例
绕过360安全卫士提权实战案例
171 1
|
安全 JavaScript Unix
【总结】提权基础与五种姿势
本次总结主要是讲解什么是提权以及常见的五个linux提权漏洞,适合初学者进阶。
119 0
|
Oracle 关系型数据库 MySQL
破解Mysql数据库的管理员密码(不时之需)
破解Mysql数据库的管理员密码(不时之需)
破解Mysql数据库的管理员密码(不时之需)
|
数据安全/隐私保护
discuz论坛管理员登录密码忘记的解决办法
今天我的一位客户说论坛的后台密码忘记了,而且什么方法都试了,就是不知道后台的登录密码是多少。对于这情况,我只好说删除重弄了。因为他的论坛没人维护,有人恶意发贴,重做也省事。 论坛一旦需要删除重新做,里面的帖子就会被全部清空,客户还不想清空。
3127 0