SQL注入被称为漏洞之王,是最常用的漏洞之一

SQL注入原理

SQL注入是指用户在参数中插入恶意的SQL语句 , 破坏原有的SQL语法结构,从而执行攻击者的操作

触发点/检测

SQL注入常出现在登录,搜索等功能,凡是与数据库交互的地方都有可能发生SQL注入

SQL注入利用方式

SQL注入根据注入点可以分为数值型注入字符型注入

根据注入方式可以分为联合注入,报错注入,布尔盲注,时间盲注,二次注入,堆叠注入,宽字节注入HTTP Header注入

其中HTTP Header注入又分 Referer注入 , Cookie注入 和 User-agent注入

时间盲注又有一种替代方式,叫DNSlog注入,也叫带外注入

SQL注入应对方案

分为三个方面: 参数过滤 , 预编译 以及 限制权限和报错

 参数过滤以各种厂商以及代码的WAF为主,比如替换空格,关键字,双写,大小写,特殊字符转义

预编译主要依赖各种框架,比如Java的mybatis框架 和 PHP的 thinkphp框架

限制权限和报错是指限制数据库的权限,以及控制数据库的报错信息,报错信息不要对外展示

报错注入函数

MySQL

  1. updatexml();        第二个参数包含特殊字符会报错
  2. extractvalue();     第二个参数包含特殊字符会报错
  3. floor();                 用来取整,不是数值就会报错

SQLserver

  1. convert();   用来类型转换,第二个参数包含特殊字符会报错
  2. cast();        用来类型转换,参数包含特殊字符会报错

Oracle

  1. 没有报错函数,可以用比较运算符报错

Access

  1. 不支持报错注入,只能使用枚举

MySQL和SQLserver的区别

  1. MySQL脱库时使用information_schema默认数据库,其中schemata存数据库,tables存表,columns存字段;SQLserver脱库时使用系统表,databases存数据库,objects存表,columns存字段
  2. MySQL支持limnt分页,SQLserver只能用top来替代分页
  3. MySQL支持双系统,SQLserver只能支持Windows系统

注释

  • MySQL:        -- , /**/ , #
  • SQLserver    -- , /**/
  • Oracle           -- , /**/
  • Access          没有注释

Access数据库

Access是文件型数据库,不需要端口号,它没有数据库的概念,所有表都在同一个数据库下,没有注释,不支持报错注入,也不能执行系统命令,有一个默认表msysobjects,可以用来判断数据库类型,Access脱库时只能用枚举,也就是配合exists()函数猜表名和列名