SQL注入概论

什么是SQL?

结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统

什么是SQL注入?

SQL注入一种代码注入技术,用于攻击基于数据库的应用,基本原理是将SQL语句插入到参数位置,后台将该参数与SQL语句拼接后对数据库进行操作而导致的漏洞


SQL注入流程
  1. web服务器将表格发送给用户
  2. 攻击者将带有SQL注入特征的参数发送给web服务器(user=" " ;pass=" ' or 1=1 -- ")
  3. web服务器利用用户输入的数据构建SQL串(select * from user where user=' ' and pass='' or 1=1-- ')
  4. web服务器将SQL发送给数据库服务器
  5. 数据库服务器执行被注入的SQL,返回结果给服务器
  6. web服务器将数据返回给用户

SQL注入类型

  • 按数据库执行结果是否显示在页面上分类

    1. SQL回显注入(数据库的执行结果直接显示在页面上)
      SQL回显注入可再分为:
      a. union联合查询注入:通过union联合查询数据,回显数据在正常页面
      b. 报错注入:通过报错页面回显数据库的敏感信息
    2. SQL盲注(不显示在页面上)
      SQL盲注有可以分为:
      a. 布尔盲注:通过页面的变化判断注入语句的正确性,猜解数据
      b. 时间注入:通过页面的返回时间猜解数据
  • 按注入点类型来分类

    1. 数学型注入点
      在web端大概是http://www.xxx.com/news.php?id=1 这种形式,其注入点id类型为数字,因此为数字型注入。其SQL语句原型大致为 :select * form 表名 where id=1
    2. 字符型注入点
      在web端大概是http://www.xxx.com/news.php?name=admin,其注入点name为字符类型,因此为字符型注入。其SQL语句原型大致为: select * form 表名 where name='admin'。有时候为双引号:where name="admin"
    3. 搜索型注入点
      这是一类特殊的注入点,主要是因为在数据搜索时没过滤搜索参数,一般在链接地址中存在"keyword=关键字",有的不显示在链接地址里面,而是通过搜索框表单提交。其SQL语句原型大致为:select * from 表名 where 字段 like '%关键字%'
  • 按提交数据的方式和位置来分类

    1. GET注入
      提交数据的方式是GET,注入点的位置在GET参数部分,如http://www.xxx.com/news.php?id=1,id为注入点
    2. POST注入
      使用POST方式提交数据,注入点位置在POST的BODY部分,常发生在表单处
    3. Cookie注入
      HTTP请求的时候header部分的Cookie信息存在注入点
    4. HTTP注入
      注入点在header的其他字段,如User-Agent字段,Cookie注入其实也是HTTP注入的一部分

SQL注入的主流防御方法

  1. 代码层防御方法
    1.1 严格检查用户输入的数据类型
    1.2 限制用户输入长度
    1.3 对敏感字符进行转义,如单引号,双引号
    1.4 对特殊字符进行过滤,如(select;union;and;or)
    1.5 参数化语句,使用占位符或绑定变量向SQL查询提供参数
    1.6 数据库控制,如使用权限有限用户连接数据库;机密数据加密后存入数据库
    1.7 错误返回统一化:应用报错时,使用统一页面返回,并尽可能给出少的提升
  2. 平台层防御方法
    2.1 web应用防火墙(WAF)
    2.2 数据库防火墙


    方案比较

你可能感兴趣的:(SQL注入概论)