zoukankan      html  css  js  c++  java
  • SQL注入学习(一)

    SQL注入(SQL Injection)是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击。

    SQL注入基础

    漏洞原理

    针对SQL注入的攻击行为可描述为通过用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为。其成因可以归结外以下两个原因叠加造成的:
    1、程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造SQL语句。
    2、未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中。

    注入点可能存在的位置

    根据SQL 注入漏洞的原理,在用户“可控参数”中注入SQL 语法,也就是说Web 应用在获取用户数据的地方,只要带入数据库查询,都有存在SQL 注入的可能,这些地方通常包括:

    @ GET 数据@ POST 数据@ HTTP 头部(HTTP 请求报文其他字段)@ Cookie 数据        

    漏洞危害

    攻击者利用SQL注入漏洞,可以获取数据库中的多种信息(例如:管理员后台密码),从而脱取数据库中内容(脱库)。在特别情况下还可以修改数据库内容或者插入内容到数据库,如果数据库权限分配存在问题,或者数据库本身存在缺陷,那么攻击者可以通过SQL注入漏洞直接获取webshell或者服务器系统权限。

    注入分类

    SQL 注入漏洞根据不同的标准,有不同的分类。但是从数据类型分类来看,SQL 注入分为数字型和字符型。

    数字型注入就是说注入点的数据,拼接到SQL 语句中是以数字型出现的,即数据两边没有被单引号、双引号包括。字符型注入正好相反。

    根据注入手法分类,大致可分为以下几个类别:

    1. UNION query SQL injection(可联合查询注入) 联合查询(查)
    2. Error-based SQL injection(报错型注入) 报错注入(查)
    3. Boolean-based blind SQL injection(布尔型注入) 布尔盲注(查)
    4. Time-based blind SQL injection(基于时间延迟注入) 延时注入(查)
    5. Stacked queries SQL injection(可多语句查询注入) 堆叠查询(增删改)

    MySQL相关

    注释 mysql 数据库的注释大概有以下几种。

        #
        -- (杠杠空格)
        /* ..... */
        /*! .... */ 内联查询

    mysql 元数据(库名、表名、字段名)库数据库information_schema

      information_schema   (存了库名、表名、字段名)  一个数据库

        tables       (存了所有的表名)        一个表

          table_name   (存了所有的表名)       一个字段

           table_schema      (表名所属的数据库)       一个字段

         columns         (存了所有字段的名字)       一个表

          column_name  (存了所有的字段名)        一个字段

           table_name   (字段所属的表名)          一个字段

         table_schema  (字段所属的数据库名)      一个字段

    MYSQL 常用函数与参数

    =|>|>=|<=|<>           比较运算符【select 1<>2】

    and|or               逻辑运算符【select true and false】

    version()              mysql 数据库版本【select version()】

    database()             当前数据库名【select database()】

    user()               用户名

    current_user()            当前用户名

    system_user()            系统用户名

    @@datadir             数据库路径

    @@versoin_compile_os       操作系统版本

    length()             返回字符串的长度【select length('123456')】

    substring()           截取字符串

       substr()

       mid()           这三个函数都有以下3个参数【select substr(database(),1,1)】

                     1、截取的字符串2、截取起始位置,从1开始计数3、截取长度,为1

    left()             从左侧开始取指定字符个数的字符串【select left('123456'),3】从左取3个

    concat()           没有分隔符的连接字符串【select concat('a','b','c')】

    concat_ws()         含有分割符的连接字符串【select concat_ws('-','a','b','c')】第一个参数是分隔符

    group_conat()         连接一个组的字符串

    ord()             返回ASCII 码【select ord(a)】

      ascii()           返回ASCII 码【select ascii(a)】

    hex()            将字符串转换为十六进制

    unhex()           hex 的反向操作

    md5()            返回MD5 值

    floor(x)           返回不大于x 的最大整数

    round()           返回参数x 接近的整数

    rand()            返回0-1 之间的随机浮点数

    load_file()         读取文件,并返回文件内容作为一个字符串

    sleep()           睡眠时间为指定的秒数

    if(true,t,f)          if 判断【select if (true,1,2)】

    find_in_set()         返回字符串在字符串列表中的位置

    benchmark()         指定语句执行的次数

    name_const()         返回表作为结果

  • 相关阅读:
    初识Tensorboard
    sql优化的几种方法
    nginx+ffmpeg+jwplayer
    jwplayer播放器
    详解spring 每个jar的作用
    RabbitMQ安装
    Migration 使用方法
    VisualSVN server 启用日志编辑
    nodejs prefix(全局)和cache(缓存)windows下设置
    python3 eval字符串str 转字典dict
  • 原文地址:https://www.cnblogs.com/tsimfeiwan/p/11707992.html
Copyright © 2011-2022 走看看