
1.9 MySQL数据库密码安全
MySQL 数据库用户的密码和其他数据库用户的密码一样,在应用系统的代码中是以明文出现的,只要获得了相应的文件读取权限,就可以直接从数据库连接文件中读取用户的密码。
在ASP代码中,conn.asp数据库连接文件通常包含数据库类型、物理位置、用户名和密码等信息。而在MySQL数据库中,即使获取了某个用户的数据库用户(root用户除外)的密码,也只能操作该用户的数据库中的数据。
在实际攻防过程中,攻击者在获取了WebShell的情况下,可以直下载MySQL数据库中用于保存用户信息的user.MYD文件。该文件中保存的是MySQL数据库中所有用户所对应的数据库密码,只要破解这些密码,就可以操作这些数据。因此,研究 MySQL 数据库的加密方式,在网络安全维护过程中具有重要的意义。试想一下:如果攻击者获取了 MySQL 中保存的用户数据,只要将其解密,就可以通过正常途径访问数据库了(可以直接操作数据库中的数据,甚至可以提升权限)。
1.9.1 MySQL数据库的加密方式
MySQL 数据库的密码认证有两种方式:MySQL 4.1 版本之前是以 MYSQL323 方式加密的;MySQL 4.1和之后的版本都是以MYSQLSHA1方式加密的。MySQL数据库自带Old_Password(str)和Password(str)函数,它们都可以在MySQL数据库中进行查询操作,前者是以MYSQL323方式加密的,后者是以MYSQLSHA1方式加密的。
1.以MYSQL323方式加密

查询结果为MYSQL323=10c886615b135b38。
2.以MYSQLSHA1方式加密

查询结果为MYSQLSHA1=*A2EBAE36132928537ADA8E6D1F7C5C5886713CC2。
如图1-73所示:以MYSQL323方式加密,生成的字符串是16位的;以MYSQLSHA1方式加密,生成的字符串是41位的。其中,“*”不参与实际的密码运算。在实际破解过程中会去掉“*”,也就是说,以MYSQLSHA1方式加密的密码的实际位数是40位。

图1-73 在MySQL数据库中查询同一密码的不同SHA值
1.9.2 MySQL数据库文件结构
1.文件类型
MySQL 数据库文件有 frm、MYD、MYI 三种类型。frm 文件是用于描述表结构的文件;MYD文件是表的数据文件;MYI文件用于描述表数据文件中任何索引的数据树。这些文件通常存储在一个特定的文件夹中,默认路径为C:\Program Files\MySQL\MySQL Server 5.0\data。
2.用户密码文件
在MySQL数据库中,所有设置都默认保存在C:\Program Files\MySQL\MySQL Server 5.0\data\mysql文件夹中(也就是安装程序的data目录下)。
如图1-74所示,与用户有关的文件有三个,分别是 user.frm、user.MYD 和 user.MYI。MySQL数据库用户的密码都保存在user.MYD文件中,包括root用户和其他用户的密码。

图1-74 MySQL数据库用户的密码文件
1.9.3 MySQL密码散列值
使用 UltraEdit-32 编辑器打开 user.MYD 文件,然后在二进制模式中查看,如图1-75所示,在“root*”后面有一个字符串。选中这个字符串,将其复制到记事本程序中。这个字符串(即506D1427 F6F61696B4501445C90624897266DAE3)就是用户密码的散列值。
注意
· 不要复制“root”后面的“*”。
· 在一些情况下,需要往后面看看,否则得到的不是完整的MYSQLSHA1密码值(其正确的位数是40位)。
· 如果使用John the Ripper进行密码破解,在复制时需要带上“root”后面的“*”。

图1-75 获取用户密码的散列值
1.9.4 Hashcat和John the Ripper的使用
1.Hashcat
Hashcat是一个免费的开源软件,支持多种算法,官方网站见链接1-14,常用命令如下。

2.John the Ripper
John the Ripper的下载地址见链接1-15。John the Ripper除了能破解Linux密码,还能破解多种格式的密码。
执行如下命令,在Kali中使用John the Ripper对MySQL数据库的密码破解进行测试,如图1-76所示。


图1-76 测试MySQL密码破解
1.9.5 Cain的使用
Cain是一个综合密码破解工具,下载地址见链接1-16。
1.将MySQL用户密码字符串放入Cain破解列表
在 Cain 主界面单击“Cracker”标签,然后将用户密码的加密字符串 506D1427F6F61696B450 1445C90624897266DAE3放入“Hash”列。如图1-77所示,单击右键,在弹出的快捷菜单中选择“Add to list”选项。

图1-77 使用Cain破解MySQL密码
如图1-78所示,将字符串复制到“Hash”输入框中(在“Username”输入框中,可以输入任意内容)。

图1-78 添加密码散列值
2.使用字典进行破解
如图1-79所示,选中刚刚添加的需要破解的字符串,然后单击右键,在弹出的快捷菜单中选择“Dictionary Attack”→“MySQL SHA1 Hashes”选项。“MySQL SHA1 Hashes”选项针对的是MySQL 4.1及后续版本;对MySQL 4.1以前版本的散列值,应选择“MySQL v3.23 Hashes”选项。
选择破解方式后,会出现一个用于选择字典的窗口,如图1-80所示。在“Dictionary”列表框中单击右键,可以添加字典文件(一个或多个)。字典选择完毕,可以在“Options”设置区进行选择,然后单击“Start”按钮进行破解。
说明
在“Options”设置区有八种方式可以选择,列举如下。
· 字符串首字母大写。
· 字符串反转。
· 双倍字符串。
· 字符串全部小写。
· 字符串全部大写。
· 在字符串中添加数字。
· 在每个字符串中进行大写轮换。
· 在字符串中添加两个数字。

图1-79 选择破解方式

图1-80 MySQL字典破解设置
破解完成后,Cain会给出一些提示信息,示例如下。

以上信息表明,加密的密码是“databasepassword”。回到Cain主窗口,破解的密码值会自动出现在“Password”列中,如图1-81所示。

图1-81 密码破解成功
3.破解探讨
(1)字典破解与字典强度有关
打开“MySQL Command Line Client”窗口,输入密码,然后输入以下命令,重置密码。

在本例中,将原来的密码修改为“1977-05-05”,如图1-82所示。

图1-82 修改MySQL用户的密码
再次使用UltraEdit-32打开C:\Program Files\MySQL\MySQL Server 5.0\data\MySQL\user.MYD文件,获取其新的密码字符串B046BBAF61FE3BB6F60CA99AF39F5C2702F00D12,然后重新选择一个字典。在本例中,选择生成的生日字典。如图1-83和图1-84所示,仅选择小写字符串进行破解,很快就能得到结果。

图1-83 再次破解MySQL密码

图1-84 修改MySQL密码后再次进行破解
结果表明,在使用Cain破解MySQL密码时,如果采用的是字典破解,那么破解效果与字典强度有关——只要密码在字典中,就一定能够破解。
(2)使用彩虹表进行破解
Cain还提供了使用彩虹表破解MySQL的方式。
如图1-85所示,选中需要破解的密码,然后单击右键,在弹出的快捷菜单中选择“Cryptanalysis Attack”→“MySQL SHA1 Hashes via RainbowTables”选项。如图1-86所示,在实际的测试中,因为使用的SHA彩虹表的格式是rti,而Cain中使用的格式是rt,所以需要将下载的所有彩虹表的文件后缀由“rti”改为“rt”。如果提示信息显示破解失败,应该是彩虹表的格式不一样所致(Cain 只承认它自己提供的彩虹表)。

图1-85 使用彩虹表破解方式

图1-86 使用彩虹表进行破解
(3)Hash计算器
Cain提供了针对各种散列值的计算功能。
在Cain主界面单击计算机图标,即可打开Hash计算器。在“Text to hash”文本框中输入需要转换的原始值,例如“12345678”,然后单击“Calculate”按钮进行计算。如图1-87所示,可以看到14种散列值。
(4)生成彩虹表
在Cain的安装目录C:\Program Files\Cain\Winrtgen中,直接运行Winrtgen工具,如图1-88所示。该工具为彩虹表生成器,可以方便地生成各种类型的彩虹表。

图1-87 计算散列值

图1-88 Winrtgen彩虹表生成工具
(5)设置彩虹表
单击“Add Table”按钮,在“Rainbow Table properties”窗口的“Hash”下拉列表中选择“mysqlsha1”选项,根据实际情况分别设置“Min Len”“Max Len”“Index”“Chain Len”“Chain Count”“N° of tables”的值,如图1-89所示。在一般情况下,仅需要设置“Min Len”“Max Len”“N° of tables”的值。

图1-89 设置彩虹表
“N° of tables”主要用来测试生成的散列值的完整度。输入不同的值,在“Table properties”区域会显示相应的百分比,以便用户通过尝试来确定一共需要生成多少个表。单击“Benchmark”按钮可以进行时间估算。单击“OK”按钮,保存对彩虹表生成的设置。
在彩虹表生成器中,单击“Start”按钮,开始生成彩虹表。如图1-90所示,在“Status”列中会显示所生成彩虹表的大小和进度。

图1-90 开始生成彩虹表
(6)MYSQL323密码的快速破解方式
对于 16 位的 MySQL 密码(MYSQL323),有一种快速破解方式。编译以下程序,可以直接进行破解。

破解结果如图1-91所示,代码如下。

图1-91 快速破解MySQL密码


