• SQL注入基础篇


    一、SQL注入简介:

      SQL注入一般针对基于Web平台的应用程序。造成SQL注入攻击漏洞的原因,是由于程序员在编写Web程序时,没有对浏览器端提交的参数进行严格的过滤和判断。用户可以修改构造参数,提交SQL查询语句,并传递至服务器端,从而获取想要的敏感信息,甚至执行危险的代码或系统命令。

     二、常见的SQL注入分类:

    A、按照数据库执行结果是否显示到页面上分类:

    a、SQL回显注入(数据库的执行结果直接显示到页面上)

      SQL回显注入又可以分为:

      1:union联合查询注入

      2:报错注入

    bSQL盲注不显示到页面上)

      SQL 盲注又可以分为:

      1:布尔盲注

      2:时间注入

    B、按照注入点类型来分类:

    1、数字型注入点

      在 Web 端大概是 http://xxx、com/news、php?id=1 这种形式,其注入点 id 类型为数字,所以叫数字型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where id=1。

    2、字符型注入点

      在 Web 端大概是 http://xxx、com/news、php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where name='admin'。有时候是是双引号:where name="admin",注意多了引号。

    3、搜索型注入点

      这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有“keyword=关键字”,有的不显示在的链接地址里面,而是直接通过搜索框表单提交。 此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like '%关键字%'。


    C、按照数据提交的方式来分类

      这种分类其实只是 HTTP 传递数据的方式不同,严格来讲和 SQL 没多大关系,但是在编写 PoC (漏洞验证程序)的时候,这会影响到我们的代码中发送数据的形式,所以我在这里提出来了。

    1、GET 注入:

      提交数据的方式是 GET , 注入点的位置在 GET 参数部分。比如有这样的一个链接 http://xxx、com/news、php?id=1 , id 是注入点。

    2、POST 注入:

      使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中。

    3、Cookie 注入:

      HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某个字段中。

    4、HTTP 头部注入:

      注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。严格讲的话,Cookie 其实应该也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字段。

    三、sql注入的危害:

    1、数据库信息泄露

    2、网页篡改:登陆后台后发布恶意内容

    3、网站挂马 : 当拿到webshell时或者获取到服务器的权限以后,可将一些网页木马挂在服务器上,去攻击别人

    4、私自添加系统账号

    5、读写文件获取webshell

     

    四、如何防御SQL注入:


    1、使用预编译。

    2、对进入数据库的特殊字符(’”尖括号&*;等)进行转义处理,或编码转换。

    3、严格限制变量类型,比如整型变量就采用intval()函数过滤,数据库中的存储字段必须对应为 int 型。

    4、数据长度应该严格规定,能在一定程度上防止比较长的 SQL 注入语句无法正确执行。(前后端同时限制)

    5、网站每个数据层的编码统一,建议全部使用 UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过。(UTF-7 / 宽字节注入 )

    6、严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。(最小权限原则)

    7、避免网站显示 SQL错误信息,统一返回错误页面,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。

  • 相关阅读:
    testng遇到的一些问题
    Redis-常用命令总结
    Spring AOP
    Spring IOC
    Java-J.U.C总结
    Java-将map拼接成“参数=值&参数=值”
    java多线程-线程池
    mysql 二进制文件增量备份
    Centos下mysql数据库备份与恢复的方法
    CentOS下mysql默认安装位置
  • 原文地址:https://www.cnblogs.com/xyz315/p/13031169.html
Copyright © 2020-2023  润新知