SQL 注入基础


SQL 注入原理

SQL 注入漏洞是发生于应用程序与数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的 SQL 指令而运行,因此遭到破坏或是入侵。

如果你不懂什么是 SQL 注入的话,这里我推荐去看 sqli-labs 这是目前我见过的最详细讲解 SQL 注入的资料了。不过都是纯英文的,但是也没多少难度。FreeBuf 上有两篇对应的中文介绍,你也可以去看看,相信对你是有帮助的。

安全科普:SQLi Labs 指南 Part 1

安全科普:SQLi Labs 指南 Part 2

倘若要是连 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条件语句的真假性

  • 基于时间的盲注

    当根据页面返回的内容不能判断出任何信息时,使用条件语句查看时间延迟语句是否执行,也就是看页面返回时间是否增长来判断是否执行。

我们后面会以执行的效果来讲怎么写每一类的 PoC。