- 什么是SQL注入
- 如何寻找SQL注入漏洞
- 如何利用SQL注入漏洞
- 如何防御SQL注入漏洞
什么是SQL注入
A SQL injection attack consists of insertion or “injection” of a SQL query via the input data from the client to the application.
SQL注入(SQL injection)是因为程序未能正确对用户的输入进行检查,将用户的输入以拼接的方式带入SQL语句中,
SQL注入的主要危害
- 由于SQL数据库通常保存有敏感数据,因此丢失机密性是SQL注入常见的问题
- 如果用危险的SQL命令来查询用户名和密码,可能会以其他用户的身份登录到系统,尽管攻击者不知道密码。
- 如果授权信息保存在SQL数据库中,则有可能通过利用SQL注入漏洞来更改此信息
- 正如可以读取敏感信息一样,也可以通过SQL注入来更改甚至删除这些信息。
SQL注入的种类
1 | . |
- 内联型SQL注入,是最常见和最容易利用的SQL注入。当攻击者能够使用相同的通信通道发起攻击并收集结果的时候,就会发生内联SQL注入。并且向查询注入一些SQL代码之后,原来的查询仍然会全部执行。两种最常见的内联SQL注入是,报错型SQL注入和联合型SQL注入
- 报错型SQL注入,通过数据库服务器抛出的错误信息来获取有关数据库结构的信息。在某些情况下,仅基于错误的SQL注入就足以让攻击者枚举整个数据库。
- 联合型SQL注入,利用 UNION SQL语句将两个或多个 SELECT 语句的结果组合成 单个结果,然后作为HTTP响应的一部分返回。
- SQL盲注,SQL盲注与内联SQL注入不同,攻击者需要更长的时间来利用它。在SQL盲注中,实际上没有数据通过Web应用程序传输,攻击者将无法看到内联攻击的结果(这就是为什么要叫SQL盲注)。然而,攻击者能够通过发送 payload,观察Web应用程序的响应以及数据库服务器的结果来重建数据库结构。SQL盲注的两个种类是,布尔型SQL盲注和基于时间的SQL盲注
- 布尔型SQL盲注(也叫基于内容的盲注),向数据库发送SQL查询后强制应用程序返回不同的结果,具体取决于查询结果为 True 或者 False。根据返回的结果,HTTP响应中的内容将发生变化或保持不变。这允许攻击者推断所使用的有效负载是否返回 True 或者 False,即使没有返回数据库中的数据
- 时间盲注,向数据库发送SQL查询后,强制数据库在响应之前等待指定的时间。响应时间将向攻击者表明查询的结果是 True 还是 False。根据结果,HTTP响应 将延迟返回或者立即返回。这允许攻击者推断所使用的有效负载是否返回 True 或者 False,即使没有返回数据库中的数据
- 带外SQL不是特别常见,它需要依赖于Web应用程序使用的数据库服务器上启用的功能。当攻击者无法使用同一通道发起攻击并收集结果时,会使用到带外SQL注入。带外技术为攻击者提供了一种替代时间盲注的方法,尤其是在服务器响应不是很稳定的情况下(使基于时间的推理攻击不可靠)
- 基于语音的SQL注入。可应用于 通过语音命令提供对数据库的访问 的应用程序。攻击者可以通过发送带有声音的SQL查询来从数据库中提取信息。
SQL注入常用工具
- SQLMap