引用百度百科的话来说:
SQL注入
即是指web应用程序对用户输入数据的合法性没有判断或过滤不严
,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询
,从而进一步得到相应的数据信息。
之间都学习过一点,但未及时巩固基本都忘了,还是得写一写才能记得牢一点。
推荐使用sqli-labs,他是一个印度程序员写的,用来学习sql注入的一个游戏程序。同时该作者也发了一些教程等可以在youtube上观看(印度人将英语的口音太重了)
注入的分类
-
基于从服务器接收到的响应
1.基于错误的sql注入
2.联合查询的类型
3.堆查询注射(?)
4.SQL盲注- 基于布尔的sql盲注
基于时间的sql盲注
基于报错的sql盲注
- 基于布尔的sql盲注
-
基于注入点的位置上的
- 通过用户输入的表单域的注射
- 通过cookie注射
- 通过服务器变量注射。(基于头部信息的注射,例如xff)
系统函数
- version()--------Mysql版本
- user()--------数据库用户名
- database()--------数据库名
- @@datadir--------数据库路径
- @@version_complie_os--------操作系统版本
字符串连接函数
-
concat(str1,str2,···)
返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。没有分隔符地连续字符串 -
concat_ws(separator,str1,str2,···)
和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符
第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。 -
group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。
一般用于尝试的语句
- or 1=1--+
- 'or 1=1--+
- "or 1=1--+
(--+可以用#替换,在url提交中url编码后的#
为%23
,'
编码后为%27
)
union 操作符介绍
union操作符用于合并两个或多个select语句的结果集
- union内部的select语句必须拥有想同属相的列
- 列也必须拥有相似的数据类型
- 每条select语句中的列的顺序必须相同
sql中的逻辑运算
当我们使用万能密码时,构成的sql语句为:
select * from admin where user='admin' and pass='' or 1=1#
我们可以看待三个条件:user='admin' and
pass='' or
1=1
三个条件用and
和 or
进行连接。
在sql中,and的运算优先级大于or的运算优先级
information_schema数据库表说明:
-
information_schema.tables:
information_schema数据库下的tables表名,含义:存储所有数据库下的表名信息的表。 -
information_schema.columns:
information_schema数据库下的columns表名,含义:存储所有数据库下的列名信息的表。
查询语句中含义
-
Table_schema:数据库名
-
Table_name:表名
-
Column_name:列名