目录
一、基础知识
1、MySQL元数据
INFORMATION_SCHEMA是每个MySQL实例中的数据库,该实例存储有关MySQL服务器维护的所有其他数据库的信息。你只能读取该数据库内容,不能修改、增加、删除等操作。
每个MySQL用户都有权访问这些表,但只能看到表中与用户具有适当访问权限的对象相对应的行。
表名 | 字段名1 | 字段名2 | 字段名3 |
---|---|---|---|
schemata 存放所有数据库名 | SCHEMA_NAME 数据库名 | ||
tables 存放所有表名 | TABLE_SCHEMA 数据库名 | TABLE_NAME 表名 | |
columns 存放所有字段名 | TABLE_SCHEMA 数据库名 | TABLE_NAME 表名 | COLUMN_NAME 字段名 |
2、注入常用查询步骤
获取数据库名
SELECT schema_name from information_schema.schemata;
获取表名
SELECT table_name from information_schema.tables WHERE table_schema='user';
获取字段名
SELECT column_name from information_schema.columns WHERE table_schema='user' and table_name='users';
查询数据
SELECT username,passwd FROM user.users;
3、MySQL注释
单行注释:#
单行注释:--
多行注释:/* */
注意使用注释符来绕过程序限制:如使用/**/来绕过空格过滤
SELECT passwd FROM user.users WHERE id=1/**/or/**/1=1;
4、MySQL时间延迟函数
时间延迟函数可以用于盲注中,判断SQL语句是否被执行了。
BENCHMARK()函数
测试某些特定操作的执行速度,参数是需要执行的次数和表达式。
如:执行9999999次sha1加密需要4秒多时间
SLEEP()函数
可以让语句运行自定义秒钟。
5、MySQL条件判断函数
IF(exp,v1,v2)
如果表达式为True,则返回v1值,如果表达式为False,则返回v2值。
IFNULL(v1,v2)
如果v1不为null,则返回v1值,反之。
6、MySQL字符串函数
ASCII(str)或ORD(str)
返回字符串最左侧字符的代码
CHAR(n)
返回数字对应的字符
HEX(str/n)
返回十进制或字符串值的十六进制表示形式
MID(str,pos,len)
返回指定的子字符串
SUBSTR/SUBSTRING(str,pos,len)
返回指定的子字符串,和MID函数一样
CONCAT(str1,str2,...)
返回连接字符串
7、其它函数
USER()
查看用户列表
CURRENT_USER()
查看当前用户
VERSION()
查看当前数据库版本信息
DATABASE()
查看当前数据库
8、系统变量
@@basedir
MySQL的安装路径
@@datadir
MySQL数据库文件保存路径
@@version_compile_os
操作系统平台信息
@@version
MySQL数据库版本信息
@@port
MySQL数据库开放端口
@@hostname
查看服务器主机名
二、SQL注入类型
SQL注入按照不同的出发点有很多分类,我喜欢按照盲注和非盲注进行分类。
非盲注类型:
基于错误的SQL注入
此类是开发中写入了数据库错误信息输出代码。
联合查询类型
支持union联合查询的数据库
堆叠查询类型
支持多条语句查询 如:select version();select database(),但php+mysql不支持堆叠查询。
盲注类型:
基于布尔的盲注
通过输入的不同值,有两种返回情况,可通过返回状态查看SQL是否被执行。
基于时间的盲注
如果返回状态统一,不能通过布尔进行判断,可插入时间函数,查看页面执行时间进行判断
基于报错的盲注
提供报错的情况下