文章目录

  • 前言
  • 一、漏洞原理
  • 二、漏洞危害
  • 三、分类
  • 1. 从数据类型分类来看,SQL注入分为数字型和字符型。
  • 2. 根据注入手法分类,大致可分为以下几个类别。
  • 四、MYSQL 相关
  • 1. 注释
  • 2. mysql 元数据库数据库information_schema
  • 3. MYSQL常用函数与参数
  • 常用参数
  • 常用函数
  • 4. 联合查询
  • 内联
  • 左外联
  • 右外联
  • 取并集
  • 一些可能用到的语句


前言

SQL注入(SQL Injection)是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击。


一、漏洞原理

  1. 针对SQL注入的攻击行为可描述为通过用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为。
  2. 可以归结为以下两个原因:
    (1)程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造SQL语句。
    (2)未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中。
  3. 注入点可能存在的位置
    根据SQL 注入漏洞的原理,在用户“可控参数”中注入SQL 语法,也就是说Web应用在获取用户数据的地方,只要带入数据库查询,都有存在SQL注入的可能,这些地方通常包括:
    (1)GET 数据
    (2)POST数据
    (3)HTTP数据
    (4)头部(HTTP请求报文其他字段)
    (5)Cookie 数据
    有时将GET注入、POST注入、Cookie注入 统称为GPC注入

二、漏洞危害

攻击者利用SQL注入漏洞,可以获取数据库中的多种信息(例如:管理员后台密码),从而脱取数据库中内容(脱库)。
在特别情况下还可以修改数据库内容或者插入内容到数据库,如果数据库权限分配存在问题,或者数据库本身存在缺陷,那么攻击者可以通过SQL注入漏洞直接获取webshell或者服务器系统权限。
【在SQL注入中,使用 mof 结合 udf 提权 】

三、分类

SQL注入漏洞根据不同的标准,有不同的分类。

1. 从数据类型分类来看,SQL注入分为数字型和字符型。

  • 数字型注入:注入点的数据,拼接到SQL语句中是以数字型出现的,即数据两边没有被单引号或双引号包括。
  • 字符型注入:注入点的数据,拼接到SQL语句中是以字符型出现的,即数据两边被单引号或双引号包括。

2. 根据注入手法分类,大致可分为以下几个类别。

  • UNIONquerySQLinjection(可联合查询注入) 联合查询
  • Error-basedSQLinjection(报错型注入) 报错注入
  • Boolean-based blind SQLinjection(布尔型注入) 布尔盲注
  • Time-based blind SQL injection(基于时间延迟注入) 延时注入
  • Stacked queriesSQL injection(可多语句查询注入) 堆叠查询 【通过 ; 同时执行多条SQL语句】
    【联合查询和报错注入都可以看到数据库的回显(页面出现的正确/错误的信息),布尔盲注和延时注入看的是页面的状态】

四、MYSQL 相关

1. 注释

1.杠杠空格
--  注释内容  
2.井号 #
#   注释内容 
3.多行注释 
/*  注释内容  */

2. mysql 元数据库数据库information_schema

  • 表tables 存储所有数据库中的所有表名(2个字段)
  • 表名 table_name
  • 这张表属于的数据库名 table_schema
  • 表columns 存储所有字段名(3个字段)
  • 字段名/列名 column_name
  • 字段所在表名 table_name
  • 字段所属库名 table_schema

3. MYSQL常用函数与参数

常用参数

  • mysql 数据库版本:version()
  • 当前数据库名:database()
  • 用户名:user()
  • 当前用户名:current_user()
  • 系统用户名:system_user()
  • 数据库路径@@datadir
  • 操作系统版本:@@versoin_compile_os

常用函数

  • 比较运算符:等于= 大于> 小于< 大于等于>= 小于等于<= 不等于<>
  • 逻辑运算符:and or
  • 返回字符串的长度:length()
  • 截取字符串
  • substr(str,start,length) 【 str为字符串;start为起始位置,start从1开始;length为长度】
  • mid(str,pos,len) 【str是字符串;pos是起始子字符串的位置;len表示从起始位置返回的字符数】
  • left(str,length) 【str是要提取子字符串的字符串;length用于指定将从左边开始返回的字符数】
  • 没有分隔符的连接字符串:concat(str1,str2,…)
  • 在连接之前将所有参数转换为字符串类型,如有任何一个参数为NULL ,则返回值为 NULL。
  • 返回结果为连接参数产生的字符串。
  • 含有分割符的连接字符串:concat_ws(seperator,string1,string2, … )
  • 第一个参数是连接各个字符串的分隔符。
  • 函数返回字符串第一个字符的ASCII 值:ord(string)
  • rand函数用于产生0(包含)到1(不包含)的随机数
  • rand() 无参数:产生的随机数是随机的,不可重复的;
  • rand(n) 有参数:如rand(2),相当于指定随机数生产的种子,那么这种情况产生的随机数是可重复的。
  • sleep(n):休眠,参数是休眠的时长,以秒为单位,也可以是小数。
  • if(expr1,expr2,expr3):如果expr1的值为true,则返回expr2的值;如果expr1的值为false,则返回expr3的值。

4. 联合查询

内联

inner join: 如果查询的表中都有至少一个匹配,则返回行

左外联

left join: 即使右表中没有匹配,也从左表返回所有的行

右外联

right join: 即使左表中没有匹配,也从右表返回所有的行

取并集

(1)full join: 只要其中一个表中存在匹配,就返回行,但是在mysql中不支持
(2)union:合并多个查询语句的结果集(去重)
(3)union all:合并多个查询语句的结果集(不去重)

  • union 操作要保证查询字段的个数相同(即select后面的查询内容个数相同)

一些可能用到的语句

  • 列出test数据库中所有的表名,类型(普通表还是view) 和 使用的引擎
# 对表的meta data的查询需要使用information_schema.tables,
# table_schema是数据库的名称,table_name是具体的表名,table_type指的是表的类型
SELECT table_name, table_type, engine
FROM information_schema.tables
WHERE table_schema = ‘test’
ORDER BY table_name DESC
  • 检查数据库 ’test’ 中是否存在表 ’hello_world’
SELECT count(1) 
FROM information_schema.tables 
WHERE table_schema = ‘test’ 
AND table_name = ‘hello_world’
  • 检查表 ‘hello_world’ 中字段 ’a’ 的类型
# 对于某一个表中具体字段的查询,需要使用表information_schema.columns
SELECT column_type 
FROM information_schema.columns 
WHERE TABLE_SCHEMA = ‘test’ 
AND TABLE_NAME = ‘hello_world’ 
AND COLUMN_NAME = ‘a’
  • 更改某一栏的定义;
alter table test.hello_world 
modify column a bigint(20) DEFAULT 0