SQL注入原理学习(一)
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