sql注入原理
4层web架构
表示层
逻辑层
应用层
存储层
灵活的sql查询语句+用户输入的数据带入了sql语句=用户直接操作数据库->sql注入漏洞
手工注入
mysql数据库结构
SQL层:通过一些特定的语法完成了数据库任务的执行,并且将执行的结果进行处理,返回人们可以识别的信息。
连接层:
通信协议:定义了数据库如何与外部应用程序通信
线程:连接数量
验证:验证用户输入的用户名和密码
SQL层的功能:
1、判断语法、语句、语义
2、数据库对象授权情况判断,授权失败不继续
3、解析(解析器):将sql语句解析成执行计划,运行执行计划,生成找数据的方式
4、优化(优化器):运行执行计划,基于算法,从执行计划中选择代价最小的交给“执行器”
5、执行(执行器):运行执行计划,最终生产如何去磁盘找数据方式
6、将取数据的方式交由下层(存储引擎层)进行处理
7、最终将取出的数据抽象成管理员或用户能看懂的方式(表),展现在用户面前
8、查询缓存:缓存之前查询的数据
数据库核心语法
查库:select schema _name from infomation_schema.schemata
查表:select table_name from infomation_schema.tables where table_schema='库名';
查列:select column_name from infomation_schema.columns where table_name='表名';
查数据:select 列名 from 库名.表名;
如果对单引号有限制,可以使用表名的十六进制。
如果查询的是当前库,可以用database()代替'表名'。
提示:
1、所有类型的sql注入,都是基于查库、表、列语句
2、如果数据太多,导致无法返回查询结果,可用limit限制返回的数量及位置,一次查询
回显数据的场景:concat链接多个语句成为一条返回结果
3、在一些场景想要快速获取数据,需要借助工具如burpsuite
union介绍
union操作符用于合并两个或多个select语句的结果集
注意:union内部的select语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条select语句中的列的顺序必须相同。
默认情况,union操作符选取不同的值,如果允许重复的值,请使用unin all。
union注入应用场景
1、只有最后一个select子句允许有order by;
2、只有最后一个select子句允许有limit;
3、只要union拦截的几个查询的字段数一样且列的数据类型转换没有问题,就可以查询出结果;
4、注入点页面有回显
union注入过程
1、order by 确定列数
2、观察页面返回,选取可以显示数据的位置上,进行下一步注入
3、读库信息 --------
4、读表信息 |
5、读字段 | > 在这个阶段,可以执行任意语句
6、读数据 --------