目录
一、基础知识
1、MySQL元数据
INFORMATION_SCHEMA
是每个MySQL实例中的数据库,该实例存储有关MySQL服务器维护的所有其他数据库的信息。你只能读取该数据库内容,不能修改、增加、删除等操作。
每个MySQL用户都有权访问这些表,但只能看到表中与用户具有适当访问权限的对象相对应的行。
![](/qrcode.jpg)
表名 | 字段名1 | 字段名2 | 字段名3 |
---|---|---|---|
schemata 存放所有数据库名 | SCHEMA_NAME 数据库名 | DEFAULT_CHARACTER_SET_NAME 字符集 | |
tables 存放所有表名 | TABLE_SCHEMA 数据库名 | TABLE_NAME 表名 | |
columns 存放所有字段名 | TABLE_SCHEMA 数据库名 | TABLE_NAME 表名 | COLUMN_NAME 字段名 |
注入常用查询语句:
1、查询所有数据库名:select schema_name from information_schema.schemata;
2、查询该数据库里的表名:select table_name from information_schema.tables where table_schema = 'jd';
3、查询该表里的字段名:select column_name from information_schema.columns where table_schema = 'jd' and table_name = 'user';
4、查询该表里的数据:select username,password from jd.user;
2、MySQL注释
单行注释:#
单行注释:--空格
多行注释:/**/
注意:当后端过滤了空格,可以用多行注释绕过空格限制:
select * from users where id = 1/**/or/**/1=1;
3、MySQL时间延迟函数
BENCHMARK()函数:测试某些特定操作的执行速度,参数是需要执行的次数和表达式。
demo:select benchmark(10000000,password('123456')); 执行本条sql语句,明显感觉延迟了几秒才出结果。
sleep(N)函数可以让语句运行N秒钟。
demo:sleep(5); 过了5秒钟,才返回了结果。
4、MySQL条件判断函数
语法格式:IF(表达式,v1,v2) 如果表达式为True,则返回v1值,如果表达式为False,则返回v2值。
语法格式:IFNULL(v1,v2) 如果v1不为null,则返回v1值,反之。
5、MySQL字符串函数
获取指定长度的字符串:left(s,n) 返回字符串s开始的最左边n个字符。
获取指定长度的字符串:right(s,n) 返回字符串s开始的最右边n个字符。
获取字符串长度:length(str) 返回字符串的字节长度。
合并字符串:concat(s1,s2,......) 返回结果为连接参数产生的字符串。
合并字符串:concat_ws(x,s1,s2,......) x是其他参数的分隔符。
替换字符串:insert(s1,x,len,s2) 返回字符串s1,其子字符串起始于x位置和被字符串s2取代的len字符。
删除指定字符串:trim(s1 from s) 删除字符串s中两端所有的子字符串s1。
比较字符串大小:strcmp(s1,s2) 若所有的字符串都相同,则返回0,第一个小于第二个,则返回-1,其他情况返回1。
获取子字符串:substring(s,n,len) 从字符串s返回一个长度同len字符相同的子字符串,起始于n。
获取子字符串:mid(s,n,len)与substring(s,n,len)的作用相同
字符串逆序:reverse(s)
6、SQL注入类型
SQL注入按照不同的出发点有很多分类,我喜欢按照盲注和非盲注进行分类。
非盲注类型:
1、基于错误的SQL注入:此类是开发中写入了数据库错误信息输出代码。
2、联合查询类型:支持union联合查询的数据库
3、堆叠查询类型:支持多条语句查询 如:select version();select database(),但php+mysql不支持堆叠查询。
盲注类型:
1、基于布尔的盲注
2、基于时间的盲注
3、基于报错的盲注
常见确认SQL注入点demo:
id=1/*ddd*/ 如果返回结果和id=1一样,有可能是数据库解析了注释符,可能存在注入。
name=ad' 'min MySQL数据库字符串连接用空格,如果返回结果和name=admin一样,则可能存在注入
id=1+1 如果返回的数据和id=2则存在注入