用户(黑客)输入的参数(恶意的数据),被拼接到Sql语句中,作为sql语句的一部分被正常执行了
chema库中的columns表中table_schema
#这条sql语句查询的结果不为空,可以登录成功
select userid from news_users
where username = ' ' or 1=1#' and password=' ".md5 ( 123)."l"
# 返回字节长度
select length('hello世界');
# 返回'hello世界'中的'世界',位置从1开始 //第六个开始两位
select substr('hello世界',6,2);
# 返回'hello世界'中的'hello'
select left('hello世界',5);
# 字符串连接
select concat('hello','世界');
# 同一个分组的多个字符串连接成一个字符串(列变行,每个数据之间以逗号分割)
select username from pikachu.member;
select group_concat(username) from pikachu.member;
# 返回字符串中第一个字符的ascii码值 a=>97 A=>65 0=>48
select ascii('Abc');
# 将字符串转换为十六进制 A=>65=>41
select hex('ABC');
# 将 "lucy,lili,kevn" 转换为十六进制
select hex('lucy,lili,kevn');
系统信息函数
/*
获取数据库系统相关信息
*/
# 1. 获取mysql的版本
select version();
# 2. 获取当前数据库的名称
select database();
# 3.获取当前用户
select user();
# 4. 返回数据库路径
select @@datadir;
渗透测试时,为什么需要关注mysql的版本?
在Mysql5.0以上的数据库中可以使用information_schema数据库来查看该数据的所有库、表、列名等信息,这对数据库爆库十分有帮助,因此我们在渗透测试阶段需要对Mysql数据库的版本多进行留意,利用information_schema这个数据库获取到我们需要的信息。
使用load_file函数读取文件
1.修改mysql的配置文件my.ini。打开phpstudy窗口,"其他选项菜单"→"打开配置文件"→mysql-ini。
2.在文件中增加以下内容:secure_file_priv=''
3.在phpstudy窗口中, 点击重启按钮
4.打开mysql命令行窗口,执行命令: mysql-> select load_file('d:/hello.txt') //默认目录斜杠/
如果没有 secure_file_priv 则新增
1.指定目录:secure_file_priv=/path/to/data
2.不限目录:secure_file_priv=''
3.禁止操作:secure_file_priv=NULL 或没有这一项内容 默认
高级sql
# 1. 条件函数
select if(10>5,'success','failed');
# 2. 休眠函数
# select sleep(3);
# 3. 随机数,生成0~1之间的随机数
select rand();
# 4.利用mysql读取文件
select load_file('D:/phpStudy/WWW/news/include/database.inc.php');
黑客的技巧
#order by原本的作用是排序
select * from tedudb.book order by price;
本浩10169(
#黑客使用它的目的是判断查询结果中有多少列,判断有多少列
select * from tedudb. book order by 5;
如果不止5列则会报错1054
#如果判断出sql版本是5.5.53,就知道,存在information schema这个数据库。
#它会存储所有数据库的名称、数据库包含的表信息、数据库包含的表的列信息。#目前,我也知道当前数据库名是tedudb
union -联合查询
select * from tedudb.book where id1;
I
Sql注入的前置知识
1. information_schema库
information_schema是mysql5.0以上版本中自带的一个数据库。
2.tables表
information_schema库中的tables表中 table_schema列(存储数据库名)和table_name列(存储表名)
3. columns表
information schema库中的columns 表中 table_schema列(存储数据库名) 、table_name列(存储表名) 、column_name列(存储列名)。
查询
select table_schema,table_name from information_schema.tables where TABLE_SCHEMA = 'pikachu';
在information_schema.tables以TABLE_SCHEMA = 'pikachu'为条件,查询,并且只列出table_schema table_name
select * from information_schema.tables; 查找所有表并且展现所有表
select table_schema,table_name from information_schema.tables; 查看所有表,但只显示所需的内容
# 1.获取news数据库的所有表名
select table_name from information_schema.tables where table_schema='news'; 库名为news
在表里面,搜索 库名为news的字段 并显示表名
# 2.获取news数据库的news_users表的所有字段名
select column_name from information_schema.columns where table_schema='news' and table_name='news_users';
查字段用column 底下的 colum_name
这时候出来的东西都是字段
#3.获取news数据库的news_users表的username,passowd字段的数据
select username,password from news.news_users;
取出字段内容