人工智能安全-6-SQL注入检测

慈云数据 1年前 (2024-03-19) 技术支持 88 0

0 提纲

  • 概述
  • SQL注入方法
  • SQL注入的检测方法
  • SQL语句的特征提取
  • 天池AI上的实践

    1 概述

    SQLIA:SQL injection attack SQL 注入攻击是一个简单且被广泛理解的技术,它把 SQL 查询片段插入到 GET 或 POST

    参数里提交到网络应用

    由于SQL数据库在Web应用中的普遍性,使得SQL攻击在很多网站上都可以进行。并且这种攻击技术的难度不高,但攻击变换手段众多,危害性大,使得它成为网络安全中比较棘手的安全问题。

    1.1 当前发展水平与现状

    SQLIA 被大量关注并有丰富的文献。

    基于端到端的网站应用架构的 5 个关键层:

    • 客户端
    • 网络应用防火墙(WAF)
    • 网络应用
    • 数据库防火墙
    • 数据库服务器

      在这里插入图片描述

      2 SQL注入方法

      发生于Web+数据库的应用架构中。

      Web页面存在注入点,如一个登录页面:

      在这里插入图片描述

      假如对登录用户身份进行合法性验证的SQL语句为:

      select * from user where name = ‘{$name}’ and password ={$password}
      

      攻击者即使没有该网站的用户账号和密码,也可能绕过账号验证而获得相应登录权限。

      只需在登录提交表单中,用户名输入一个随意的字符串,如asndfas,密码框输入1 or 2=2。从而生成如下的注入SQL:

      select * from user where username='asndfas' and passwd=1 or 2=2
      

      由于2=2的条件恒成立,因此SQL执行的结果是返回user表中的所有记录。

      利用注入SQL语句来进行数据库结构的猜测。例如攻击者想知道数据库中是否存在指定的表或表的字段名,在确定用户名/密码为bbb/2345的情况下,可以构建如下SQL语句来检查users表中是否存在emails字段:

      select * from users where username='bbb' and passwd=2345 and exists(select emails from users)
      

      攻击者可以执行一些数据库操作,导致数据丢失。在密码框中输入2345; drop table

      tmp,从而形成了如下的注入SQL,其中注入的分号是将SQL指令分成多条指令执行。

      select * from users where username='bbb' and passwd=2345; drop table tmp
      

      当用户bbb具有数据库执行drop

      table的权限时,这条语句会实现删除tmp表的操作。也可以使用update等语句对数据表信息进行修改。由此会产生严重的数据库安全问题

      3 SQL注入的检测方法

      SQL注入的检测通常要对输入的内容进行校验,其中较为有效的是对请求数据格式或者内容进行规则处理。目前主要的检测方法有:

      • 针对特定类型的检查;
      • 对特定格式的检查;
      • SQL预编译的防御方法;
      • 机器学习方法。

        3.1 针对特定类型的检查

        考虑到SQL注入是在特定的Web页面输入框中实现的,每个输入有其特定的格式要求。因此可以对页面变量的数据类型、数据长度、取值格式、取值范围等进行检查。例如:

        where id = {$id}
        

        对于输入的id进行类型检查。只有当这些要求都通过检查之后,才把请求发送到数据集执行。

        优点:

        • 对有特定数据格式输入可以起到防SQL注入的作用。

          缺点:

          • 局限性较大:只能对特定数据格式输入起作用,存在较大的遗漏或不准确;
          • 工作量较大:对每个网页程序接口输入都进行格式判断。

            3.2 对特定格式的检查

            对于格式有明确要求的输入,如邮箱或电话等,可以采用正则表达式过滤方法,排除不符合要求的变量。

            一些常见的注入也可以采用正则表达式过滤方法。例如对于

            ' or 1 = 1
            

            这样的注入,可以用如下正则表达式进行过滤:

            ('\s+)? or\s +[[:alnum:]] +\s * = \s * [[:alnum:]]+\s *(--)?
            

            只要拒绝符合该正则表达式的输入即可达到防止SQL注入的目的。

            优点:

            • 可以过滤已知的各种注入方法。

              缺点:

              • 不能过滤未知的注入;
              • 这种方法也会将带有符合过滤正则表达式的合法输入过滤掉,例如用户博客中的某一个句子带有’ or 1 = 1 --,那么这个句子会被错误过滤掉。

                3.3 SQL预编译的防御方法

                SQL预编译的基本思想是创建SQL语句模板,将参数值用“?”代替,例如:

                select from table where id = ?
                

                然后通过语法树分析、查询计划生成、缓存到数据库。这种方式不论输入内容包含什么,总是被当作字符串。这样用户传进来的参数只能被视为字符串用于查询,而不会被嵌入SQL中去执行语法分析。

                一些Web框架如Hibernate、MyBatis等已经实现了参数化查询,是目前比较有效防止SQL注入的方法。

                3.4 机器学习方法

                机器学习方法把SQL注入检测看作一个二分类问题,从而按照机器学习的一般流程进行设计。主要环节包括:

                • 训练数据集收集与标注;
                • 特征提取;
                • 分类器选择与训练;
                • 执行分类。

                  4 SQL语句的特征提取

                  使用机器学习进行SQL注入的检测,首先需要解决SQL语句特征表示的问题。主要的方法有基于图论的方法,基于文本分析的方法。

                  4.1 基于图论的方法

                  基于图论的方法把SQL查询建模成标记图,进而生成以标记为节点、节点间的交互为带权边的图,利用该图实现SQL语句的转换和表示。

                  4.1.1 节点标记

                  定义SQL语句中的标记(Token),把SQL中的关键字、标识符、操作符、分隔符、变量以及其他符号都称为标记。

                  一条SQL查询,无论是真正的查询还是注入的查询,都是一个标记序列。

                  检测的基本思路就是,对真正查询和注入查询的序列进行特征提取,然后在特征空间中构建识别注入查询的分类器模型。

                  定义映射表

                  在这里插入图片描述

                  在这里插入图片描述

                  在这里插入图片描述

                  在这里插入图片描述

                  对于一条SQL语句,使用token对照表进行转换,同时对语句做特殊处理:

                  • (1) 对能够匹配的括号对进行删除;对不能匹配的括号给予保留,并转化成标记;
                  • (2)可以删除空注释(包含只有空白字符的注释),但非空注释必须保留。这是因为攻击者通常在注入代码中嵌入空注释来做混淆(例如/**/ OR / ** /1/ ** / = / ** /1),企图绕过检测。

                    两个例子:

                    (1)

                     select * from books where price>20.5 and discount
微信扫一扫加客服

微信扫一扫加客服