结构化查询语言(structured query language,SQL),是一种用于数据库中的标准数据查询语言。具有明显的层次结构,包括了库名、表名、字段名、字段内容。

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

漏*洞原理

针对SQL注入的公鸡行为可以这样理解:通过用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的公鸡行为。其成因可以归结为两个原因的叠加:

1、程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造SQL语句。

2、未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中。

注入点可能存在的位置

根据SQL注入漏*洞的原理,在用户“可控参数”中注入SQL语法,也就是说WEB应用在获取用户数据的地方,只要带入数据库查询,都有存在SQL注入的可能,这些地方通常包括:

GET数据

POST数据

HTTP头部(HTTP请求报文其他字段)

Cookie数据

漏*洞危害

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

注入方式分类

SQL注*入漏*洞根据不同的标准,有着不同的分类,但是从数据类型分类来看,SQL注入分为数字型和字符型。

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

字符型注入正好相反。

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

联合查询:UNION query SQL injection 可联合查询注入

报错注入:Error-based SQL injection 报错型注入

布尔盲注:Boolean-based blind SQL injection 布尔型注入

延时注入:Time-based blind SQL injection 基于时间延迟注入

堆叠查询:Stacked queries SQL injection 可多语句查询注入

注入点的判断

在疑似注入点的连接或者参数后尝试提交以下数据。

MYSQL数据库的注释大概有以下几种:

#

-- (杠杠空格)

/*.......*/

/*!.......*/内联查询

mysql元数据库information_schema,存储库名、表名和字段名

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_数据库

MYSQL数据库基本操作命令

查看数据表

show databases;

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_web安全_02

use information_schema;
show tables;

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_数据_03


mysql常用函数与参数

=|>|>=|<=|<> 比较运算符

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_数据_04

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_数据库_05

and | or 

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_数据_06

version()

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_注入_07

database()

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_数据库_08

user()

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_数据库_09

current_user()


system_user()

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_mysql_10

@@datadir

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_注入_11

version_compile_os

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_数据_12

length()

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_注入_13

函数嵌套

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_注入_14

substring() 截取的字符串

substr()  截取起始位置,从1开始计数

mid() 截取长度

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_数据库_15

left() 从左侧开始取指定字符个数的字符串

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_mysql_16

concat() 没有分隔符的连接字符串

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_web安全_17

concat_ws() 含有分隔符的连接字符串

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_mysql_18

group_concat() 连接一个组的字符串,即把不同记录的内容放在同一个记录中。

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_数据库_19

ord() 返回ascii码

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_mysql_20

ascii() 返回ascii码

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_数据库_21

hex() 将字符串转换为十六进制

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_mysql_22

unhex() hex的反向操作

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_web安全_23

md5() 返回MD5值

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_数据_24

floor(x) 返回不大于x的最大整数

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_mysql_25

round() 返回参数x接近的整数

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_注入_26

rand() 返回0-1之间的随机浮点数

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_数据库_27

sleep() 睡眠时间为指定的秒数

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_数据库_28

if(true,t,f) if判断

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_mysql_29

find_in_set() 返回字符串在字符串列表中的位置

benchmark() 指定语句执行的次数

name_const() 返回表作为结果

逻辑运算

在SQL语句中逻辑运算与(and) 比 或(or)的优先级高

select 1=2 and 1=2 or 1=1;

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_数据_30

注入流程

由于关系型数据库系统,具有明显的库/表/列/内容结构层次,所以我们通过SQL注*入漏*洞获取数据库中信息的时候,也依据这样的顺序。

首先获取数据库名, 其次获取表名,然后获取列名,最后获取数据。

#展望我的2022Flag#web安全day49:SQL注入原理、危害、分类,动手写MYSQL最基本操作命令_web安全_31