一、基本知识
1、什么是SQL注入
SQL注入就是指web应用程序对用户输入数据没有做合法性判断,导致前端传入的参数可控,从而被攻击者通过构造参数进行对数据库执行任意操作。
2、SQL注入的原理
前提条件:
* 参数用户可控:前端传给后端的参数内容是用户可以控制的。
* 参数带入数据库查询:传入的参数拼接到SQL语句,并带入数据库进行查询。
3、与mysql注入相关的知识点
MySQL 5.0版本之后,默认存放一个information_schema数据库,该库中必须记住的三个表名为:SCHEMATA、TABLES、COLUMNS
SCHEMATA表存储所有数据库的库名,该表中记录数据库库名的字段名为SCHEMA_NAME
TABLES表存储所有数据库的的库名和表名,该表中记录数据库库名和表名的字段名分别为TABLE_SCHEMA和TBALE_NAME
COLUMNS表存储所有数据库的库名、表名和列名,该表中记录数据库库名和表名的字段名分别为TABLE_SCHEMA、TBALE_NAME和COLUMN_NAME
4、基本知识点(必须记住的)
(1)需要记住的几个函数
database() 当前网站使用的数据库
version() 当前MySQL的版本
user() 当前MySQL的用户
(2)注释符#、-- 、或/**/
(3)内联注释内联注释的形式:/! code/。内联注释可以用于整个SQL语句中,用来执行SQL语句,比如index.php?id=-15 /!union/ /!select/1,2,3
5、SQL注入的分类
(1)、常见的sql注入按照参数类型可分为两种:数字型和字符型。
当发生注入点的参数为整数时,比如 ID,num,page等,这种形式的就属于数字型注入漏洞。同样,当注入点是字符串时,则称为字符型注入,字符型注入需要引号来闭合。
(2)、也可以根据从服务器接收到的响应,分为基于错误的sql注入、盲注(布尔、时间和报错)、联合查询注入、堆查询注入、宽字节注入等。
回显注入:可以直接在存在注入点的当前页面中获取返回结果。
报错注入:程序将数据库的返回错误信息直接显示在页面中,虽然没有返回数据库的查询结果,但是可以构造一些报错语句从错误信息中获取想要的结果。
盲注:程序后端屏蔽了数据库的错误信息,没有直接显示结果也没有报错信息,只能通过数据库的逻辑和延时函数来判断注入的结果。根据表现形式的不同,盲注又分为based boolean和based time两种类型。
布尔盲注: 布尔型盲注出现在进行查询时服务器不会返回具体内容,只会返回查询操作执行的结果是否成功的状态,如果查询成功,则返回true,反之返回false。
时间盲注: 根据判断返回的结果所花费的时间来判断是否存在注入,如果存在注入(即数据库查询失败),则延时一定时间页面才会返回内容,不存在注入浏览器则直接返回页面内容。
(3)、按照数据提交方式分为:用户输入的表单域注入,cookie注入,HTTP头部注入。
6、利用方式
(1)获取数据库数据,比如用户名和密码
(2)如果有写权限,可以写一句话木马getshell
7、防御方式
(1)严格检查输入变量的类型。
(2)过滤和转义特殊字符。
(3)mysql的pdo预编译机制。