SQL注入原理学习(一)

前言

对于一个有SQL注入基础的人来说,时间还是会冲刷一切的包括知识。很久没有接触SQL注入了,最近开始想从头开始学习将这个技能学透。

正文

0X01 SQL注入原理

这里所讲解的数据库是基于MYSQL。

当前端应用向后端数据库传递一个SQL语句进行数据库操作时。在此期间如果前后端没有对用户输入的参数做严格的过滤处理,那么对于攻击者来说就可以构造具有攻击性的SQL语句传入后端数据库中进行执行,从而达到获取用户数据库或者修改删除数据的目的。

所以SQL注入的本质是将用户输入的参数当作SQL语句进行执行。(个人理解)

SQL注入的两个关键条件:1、输入的内容不可控,用户可以控制输入的内容。2、前端会把输入的内容传递到后端数据库进行执行。

0X02 SQL注入基础

常用函数:

函数
system_user() 系统用户名
user() 用户名
current_user() 当前用户名
session_user() 链接数据库的用户名
database() 数据库名
version() MySQL数据库版本
load_file() 转成16进制或者10进制 MySQL读取本地文件的函数
@@datadir 读取数据库路径
@@basedir MySQL安装路径
@@version_compile_os 操作系统
group_concat() 将括号中的所有参数拼接成一个字符串
substr(str,start,length) 截取str字符串中从start开始,长度为length的字符串

一库三表(必记)

一库:information_schema	(MySQL默认数据库)

三表:

0x01 SCHEMATA:存储了MySQL下每一个数据库的相关信息

schema_name(字段):数据库名
0x02 TABLES: 存储了MySQL下每一个表的相关信息

TABLE_NAME(字段):数据表名
TABLE_SCHEMATA(字段):该数据表属于哪一个数据库
0x03 COLUMNS:存储了MySQL下每一个数据表中的所有列名

COLUMN_NAME(字段):字段名称
TABLE_NAME(字段):该字段属于哪一个数据表
TABLE_SCHEMA(字段):当前字段所属数据表所在的数据库名称

注:这三张表在information_schema数据库下面,在SQL注入过程中不能直接指定表名,
要使用“数据库名.数据表名”的形式,例如:information_schema.tables