渗透测试 day2

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、读数据           --------

 

posted @ 2019-10-11 15:49  酒友az  阅读(101)  评论(0编辑  收藏  举报