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

提权技术研究_Discuz!管理员复制SimeonCrossday 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(2)Mysql数据库客户端管理软件――Mysql-Front(3)Discuz!论坛版本7.0,下载地址:http://download.comsenz.com/Discuz(一)Discuz!论坛加密方式Discuz!6.X以及后面的7.0版本都采用md5多重加密,其加密函数有checkmd5和authcode,该函数在Discuz!缺省安装include目录下的global.func.Php文件中。先采用salt方式,随机获得一个字符串,然后把明文密码MD5之后,再与随机字符串连接起来之后,再次MD5。加密密码为:md5(md5($newpw).$salt) 其中$salt为random,返回的字符串$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“打开登录信息”窗口。图1 设置MySQL-Front说明: (1)管理MySQL数据库有多个软件,也可以通过phpmyadmin进行在线管理,其下载地址为:http://www.phpmyadmin.net。 (2)本例中使用客户端软件来管理MySQL数据库是因为方便快捷,当然熟悉MySQL命令的朋友也可以手工在命令提示符下执行数据库操作。2.连接MySQL数据库在“打开登录信息”窗口中选择刚才设置的MySQL数据,然后打开即可,如图2所示,在MySQL-Front中常用的四个按钮为“对象浏览器”、“数据浏览器”、“SQL编辑器”和“图表”。“对象浏览器”主要用来浏览有哪些表,而“数据浏览器”主要用来查看选中数据库的表中的数据,“SQL编辑器”主要用来执行SQL语句,“图表”主要用来与“对象浏览器”进行切换,更多好用的功能和技巧需要自己去揣摩,就不再此赘述了。图2 打开MySQL数据库(三)实施管理员复制1.注册网站用户在实施管理员复制前,需要先在网站注册一个用户名,例如在本例中注册普通用户“cxb”,密码为“test”,注册成功使用该用户进行登录,如图3所示。图3 使用注册账号登录注册网站2.通过MySQL-Front查看已注册用户信息在MySQL-Front中查看已经注册的用户信息,选中Discuz!论坛的用户注册表“*_members”,其中“*”为安装设置的名称,如图4所示,在本例中为“antian_members”,该表保存的是用户注册的信息,使用“数据浏览器”打开,可以看到该用户注册的一些详细信息。图4 查看选定用户的注册详细信息4.修改普通用户为管理员用户在“antian_members”表中将用户“cxb”的“adminid”值由“0”修改为“1”;将“groupid” 值由“12”修改为“1”,然后单击“MySQL-Front”上面的发布按钮使修改生效,至此已经将普通用户cxb变成管理员用户,在登录的网页中刷新一下,再次查看用户个人信息,如图5所示,用户“cxb”的用户组已经升级为“Administrator”,可以行使管理员权限。图5 普通用户组已经升级为管理员组(四)管理员密码丢失解决方案1.修改管理员密码为已知用户密码使用Mysql-Front打开myuc_members表后,单击工具条下面的“数据浏览器”查看myuc_members表中的数据,如图6所示,先将admin的password值复制到本地进行备份,以待出现错误后进行恢复,将已知用户的密码值(password中的值)复制到admin中替代原来的值。图6修改管理员密码为已知用户密码2.修改salt 在Discuz!论坛中用户的密码不是普通的加密,而是经过变异的加密,因此还需要保证管理员的密码与已知用户的salt一致,如图7所示,将管理员与已经用户的salt修改成一致。 图7 修改salt3.修改安全问题答案 在Discuz!论坛中的登录模块中单独设置了安全提问,如图8所示,一共有七个安全提问,用户在注册成功后在个人中心的“密码和安全问题”中进行设置,每一个安全提问根据答案生成一串8位的加密字符,密码不同安全字符串也不同。因此如果想要管理员用户使用普通用户的安全提问,则需要将管理员的“secques”设置成普通用户的“secques”,反之,则将普通用户的“secques”设置成管理员的“secques”,如图9所示,将已知用户的“secques”替换管理员的“secques”,然后使用普通用户的安全提问替代管理员的安全提问进行登录。图8 安全提问图9 修改安全提问secques值 至此有关discuz!论坛管理员与普通用户身份之间的转换已经完成,使用修改后的密码和问题答案即可登录,登录后身份为管理员用户,如图10所示,可以对论坛系统进行管理。图10 登录后台进行管理(五)总结与探讨1.总结本文探讨了discuz!论坛的加密方法,通过实际的案例讲解了如何通过操作MySQL数据库来更改用户身份,即通过修改普通用户的adminid,groupid和secques以及password的值,可以使“普通用户”变成“管理员”行使管理员权限;同时该方法也适用管理员丢失或者忘记了管理密码,通过该方法可以重新设置密码,并行使管理权限。2.问题与探讨本文写完后,又发现该管理员的密码可以直接适用PasswordPro工具软件进行破解,由于篇幅关系就不在本文中进行探讨,关于该论坛的安全问题还有很多话题,例如通过脚本来嗅探或者记录用户登录用户名和密码。在discuz!论坛数据库中用户密码字段生成的是密文,网上有一些脚本可以直接用来记录用户登录的密码。完整全文:http://www.antian365.com/viewthread.php?tid=5297&extra=page%3D1

simeon技术专栏” 博客,转载请与作者联系!

既有美妙的风景,也会有称不上景只有风的地方。

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

相关文章:

你感兴趣的文章:

标签云: