一、SQL注入简介:
SQL注入一般针对基于Web平台的应用程序。造成SQL注入攻击漏洞的原因,是由于程序员在编写Web程序时,没有对浏览器端提交的参数进行严格的过滤和判断。用户可以修改构造参数,提交SQL查询语句,并传递至服务器端,从而获取想要的敏感信息,甚至执行危险的代码或系统命令。
二、常见的SQL注入分类:
A、按照数据库执行结果是否显示到页面上分类:
a、SQL回显注入(数据库的执行结果直接显示到页面上)
SQL回显注入又可以分为:
1:union联合查询注入
2:报错注入
b、SQL盲注(不显示到页面上)
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错误信息,统一返回错误页面,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。