SQL注入
定义
SQL注入是服务器端,未严格校验客户端发送的数据,而导致服务端的SQL语句被恶意修改并执行成功的行为称为SQL注入。
分类
按照请求方式分类:
Get型注入
Post型注入
按照SQL数据类型分类:
整型注入
字符型注入
其他数据类型:
报错注入
Cookie注入
双注入
User-Agent注入
时间盲注
MySQL
一个特殊数据库:
information_schema
mysql自带数据库
三张特殊的表:
表名 | |
---|---|
SCHEMATA | 存储了所有数据库的信息,show databases的结果就取自这个表 |
TABLES | 存储了数据库中所有表的信息,show tables的结果取自这个表 |
COLUMNS | 存储了所有表的字段信息 |
SQL语句
1.limit
检索6-15条数据:
select * from table limit 5,10;
检索6到最后一条数据:
select * from table limit 5,-1;
检索前5条数据:
select * from table limit 5;
2.group_concat()
将许多条数据合为一条数据显示
3.几条简单的SQL
显示所有数据库:
show databases;
打开某一数据库:
use databases_name;
显示所有表:
show tables;
4…select 1,2,3;
无任何意义,返回1,2,3三个值;但可以联合union一起使用来判断SQL语句查询的字段数
5.union
链接在源SQL语句后面,表示连接两条不同的SQL语句。
但是,这两条语句所返回的字段数必须相同。
6.# 是注释符
%23是 #的URL编码格式,可以用于注释原URL后面的SQL语句。
7.concat_ws(’:’,value 1,value 2)
按照“value1:value2”的格式显示,可以与group_concat()合用。
注入过程
1. 判断是否有注入(判断是否有严格校验)【第一要素】
可控参数的改变是否能影响页面显示结果。
输入的SQL语句是否能报错,看到数据库的一些语句痕迹。
输入的SQL语句是否不报错,使我们的语句能够成功闭合。
2.判断是什么类型的注入。
3.语句能够被恶意修改。 【第二要素】
4.能否成功执行。 【第三要素】
5.获取我们想要的数据。
注入过程从数据库->表->字段->值
注入语句
查看当前数据库:
select database();
查看当前数据库中有哪些表:
select group_concat(table_name) from information_schema.tables where table_schema=database();
可获得此表中的所有字段值:
select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='表名';
查找值:
select '字段值' from ‘数据库名.表名’
所有数据库名:
select group_concat(schema_name) from information_schema.schemata;
万能密码 Or 1
只返回 column = abc 的信息:
select * table where column='abc';
返回整张表的信息:
select * from table where column='abc' or 1;
整条语句会因为 ‘or 1’ 变成:
select * from table;