一.sql注入漏洞原理
1 注入条件:
- 参数可控:从前端传给后端的参数内容是用户可以控制的
- 参数带入数据库查询:传入的参数拼接到 SQL 语句,且带入数据库查询。
2 判断是否存在注入漏洞:
在参数后面加上单引号,比如: http://xxx/abc.php?id=1' 如果页面返回错误,则存在 Sql 注入。
原因是无论字符型还是整型都会因为单引号个数不匹配而报错。
(如果未报错,则有可能页面对单引号做了过滤,这时需使用判断语句进行注入)
3 判断注入类型:
数字型判断:
当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:select * from <表名> where id = x
这种类型可以使用经典的 and 1=1 和 and 1=2 来判断:
- Url 地址中输入
http://xxx/abc.php?id=x and 1=1
页面依旧运行正常,继续进行下一步。 - Url 地址中继续输入
http://xxx/abc.php?id=x and 1=2
页面运行错误,则说明此 Sql 注入为数字型注入。
假设如果这是字符型注入的话,查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设不成立。
字符型判断:
- Url 地址中输入
http://xxx/abc.php?id= x' and '1'='1
页面运行正常,继续进行下一步。 - Url 地址中继续输入
http://xxx/abc.php?id= x' and '1'='2
页面运行错误,则说明此 Sql 注入为字符型注入。
二.sql的增删改查语句
1.增加语句
新增一条数据
insert into 表名 values(全部列的值,用”,“分割);
insert into 表名 (字段1, 字段2) values (值1, 值2);
新增多行数据
insert into 表名 values(全部列的值),(全部列的值)....;
insert into 表名 (字段1, 字段2) values (值1, 值2),(值1, 值2),(值1, 值2)....;
2.删除语句
delete from 表名 where 条件;
注意:在修改或者删除数据的时候一定要指定条件,否则可能造成所有数据被污染或者清空。
delete from表名
清空数据表内容,不释放空间,即:下次插入表数据,id依然接着删除数据的id继续增加
truncate 表名;
清空表数据,释放空间,即:下次插入表数据,id从1重新开始
drop table表名1
整张表被删除,要使用该表必须重新建
3.修改更新语句
update 表名 set 列1=值1,列2=值2,... where 条件;
例:
update Student set name='张三'where name='李四'
4.查找语句
select * from 表名;
select * from 表名 where 条件;
select 字段 from 表名 where 条件;
select * from 表名 where 字段 like '%值%';
模糊查询like,_代表一个任意字符,%代表多个任意字符
SELECT * from 表名 WHERE 字段 in (上限,下限);
集合查询in
例:
查询姓刘的学生:
SELECT * from student WHERE name like '刘%';
查询身高为160到180的学生:
SELECT * from student WHERE height in (160,180);
常用的关键字查询:
BETWEEN(两个值之间的数据)
查询两个值之间的数据
语法:select * from 表名 where 字段名 between 值 and 值;
查询体重在65-70的学生:
select * FROM student WHERE weight BETWEEN 65 AND 70;
AS(别名)
为字段名指定别名
语法:select 字段名1 AS 别名,字段名2 AS 别名,.... from 表名
将字段名name改为别名学生名称显示:
select name AS '学生名称' FROM student
Distinct(查询时忽略重复值)
语法:SELECT DISTINCT 字段名 FROM 表名
查询学生所在的班级有哪些:
select DISTINCT class_id FROM student
SUM(求和)
语法:select SUM(字段名) from 表名;
查询学生总身高:
select SUM(height) AS &