SQL 注入基础
SQL 注入原理
SQL 注入漏洞是发生于应用程序与数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的 SQL 指令而运行,因此遭到破坏或是入侵。
如果你不懂什么是 SQL 注入的话,这里我推荐去看 sqli-labs 这是目前我见过的最详细讲解 SQL 注入的资料了。不过都是纯英文的,但是也没多少难度。FreeBuf 上有两篇对应的中文介绍,你也可以去看看,相信对你是有帮助的。
倘若要是连 SQL 都不知道的话,我觉得吧,磨刀不误砍柴工,你觉得呢?
SQL 注入分类
分类这种东西对是相对的,看你站在什么角度了,我一直都很讨厌这些分类,如果你仔细去研究这些个分类,你会觉得这世界上的发明家太多了,想一出是一出啊。
反正我也是发明家,下面这些个分类是我个人的见解。
按照注入点类型来分类
-
数字型注入点
在 Web 端大概是 http://xxx.com/news.php?id=1 这种形式,其注入点 id 类型为数字,所以叫数字型注入点。这一类的 SQL 语句原型大概为
select * from 表名 where id=1
。 -
字符型注入点
在 Web 端大概是 http://xxx.com/news.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为
select * from 表名 where name='admin'
。注意多了引号。 -
搜索型注入点
这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有“keyword=关键字”,有的不显示在的链接地址里面,而是直接通过搜索框表单提交。 此类注入点提交的 SQL 语句,其原形大致为:
select * from 表名 where 字段 like '%关键字%'
。
按照数据提交的方式来分类
这种分类其实只是 HTTP 传递数据的方式不同,严格来讲和 SQL 没多大关系,但是在编写 PoC 的时候,这会影响到我们的代码中发送数据的形式,所以我在这里提出来了。
-
GET 注入
提交数据的方式是 GET , 注入点的位置在 GET 参数部分。比如有这样的一个链接
http://xxx.com/news.php?id=1
, id 是注入点。 -
POST 注入
使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中。
-
Cookie 注入
HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某个字段中。
-
HTTP 头部注入
注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。严格讲的话,Cookie 其实应该也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字段。
按照执行效果来分类
这个分类也是 SQL 注入神器 sqlmap 所支持的注入模式,这个的分类的依据也是后面我们用 PoC 判断是否存在注入的依据。
-
基于报错注入
这一类的也叫有回显注入,页面会返回错误信息,或者是把注入语句的结果直接返回在页面中。
-
基于布尔的盲注
根据返回页面的结果判断构造的SQL条件语句的真假性
-
基于时间的盲注
当根据页面返回的内容不能判断出任何信息时,使用条件语句查看时间延迟语句是否执行,也就是看页面返回时间是否增长来判断是否执行。
【注】本文转自:https://poc.evalbug.com/chapter3/3-1.html