帮助文档>网络安全 > 什么是SQL注入攻击?如何保护和识别攻击

什么是SQL注入攻击?如何保护和识别攻击

发布时间:2021-03-13 08:07

SQL注入是最常见的网络攻击类型之一。不幸的是,SQL注入也是应用程序可能面临的最具破坏性的威胁之一。这些攻击通常会导致数据丢失,对于具有共享数据库的基础架构尤其危险。

本文介绍了如何防止SQL注入。继续阅读以了解什么是SQL注入,这些攻击如何工作以及公司采取了哪些步骤来保护其数据库免受恶意注入。

什么是SQL注入攻击?

SQL注入(SQLi)是一种网络攻击,黑客在其中通过应用程序运行恶意SQL语句来操纵数据库。这些攻击可能会影响依赖SQL数据库(MySQL,Oracle,Sybase,Microsoft SQL Server,Access,Ingres等)的任何网站或Web应用程序。

SQLi的后果从轻度到严重不等。注入后,黑客可以:

损坏,窃取或删除数据。
获得对系统的root访问权限。
创建新记录,为更高级的突破(例如APT攻击)打开大门。
提升特权以访问网络上的其他应用程序和系统。
损害服务器或其他后端基础结构。
发起DDoS(拒绝服务)攻击。
通过数据库服务器访问操作系统。
损害程度取决于攻击者的能力。从几个数据库错误到Web服务器的完全接管,受害者可能会遇到任何事情。

SQL注入如何工作?
大多数Web应用程序要求用户提供凭据以证明其身份和访问级别。如果经过验证的用户请求数据,则应用程序将以查询的形式向数据库发送一条SQL语句,并返回所请求的数据。

当应用程序具有SQLi漏洞时,黑客可以跳过身份验证过程,并手动将SQL语句(或恶意有效负载)注入数据库中。数据库无法识别威胁,并像应用程序正在发送请求一样执行语句。

与某些类型的网络攻击不同,SQL注入要求目标系统具有可利用的漏洞。大多数缺点是由于程序代码和用户提供的输入之间缺乏严格的分隔。

黑客通常通过应用程序或网站来瞄准数据库。但是,一些更复杂的攻击直接发生在数据库之后。

SQL注入类型
有两种SQL注入:

经典的SQLi:攻击是黑客将命令发送到数据库并从输出中收集结果。
盲目的SQLi:黑客在其中散发命令,将命令发送到数据库,但不直接从输出中收集结果。
以下是企业可以面对的七种最常见的SQL注入类型。

带内SQLi(经典SQLi)
当黑客使用相同的通信渠道发起攻击并收集结果时,就会发生带内SQLi。这是WordPress代码中的带内注入漏洞的示例:

全局$ wpdb;

$ title = $ wpdb-> get_var(“从”。$ wpdb-> posts。“中选择post_title,其中ID =”。$ _GET ['id']);

回声$ title;
该代码具有SQLi弱点,因为用户输入$_GET[‘id’]直接进入数据库。没有清理或转义,因此攻击者可以将命令直接发送到数据库,然后将输出接收回浏览器。例如,黑客可以发送:

SELECT 从数据库检索记录的命令。
INSERT 创建新用户帐户的命令。
UPDATE 修改现有记录的命令。
带内SQLi是最常见的SQL注入类型。

基于错误的SQLi
基于错误的SQLi是一种依赖于错误消息的带内注入技术。黑客反复调查应用程序是否存在错误,以收集有关数据库结构的信息。

基于错误的SQL注入使攻击者可以从可见错误中检索表名称和内容之类的数据。在某些情况下,基于错误的SQL注入足以使黑客枚举整个数据库。

基于联合的SQLi
基于联合的SQLi是带内注入,它利用了UNIONSQL运算符的漏洞。

该UNION命令将执行一个或多个其他SELECT查询,并将结果附加到原始查询中。攻击者可以利用扩展结果从数据库中的其他表中检索数据。

基于联合的SQLi仅在原始查询和新查询具有相同的列数和数据类型时才有效。

推理SQLi(盲SQLi)
在推论SQLi中,Web应用程序不通过直接输出传输数据。相反,攻击者必须通过发送有效载荷并观察以下内容来收集信息:

Web应用程序的响应。
数据库服务器的行为。
网页中的差异。
这是一个盲SQLi的示例:

全局$ wpdb;

$ title = $ wpdb-> get_var(“从”。$ wpdb-> posts。“中选择post_title,其中ID =”。$ _GET ['id']);
通过将$_GET[‘id’]变量连接到查询,用户输入直接进入数据库。浏览器从不显示输出,但是攻击者可以通过分析服务器的反应来收集有关数据库的信息。

与带内SQLi相比,这种注入类型需要更多的时间进行开发,但后果同样危险。

基于内容的盲SQLi
基于内容的SQLi是一种推论性技术,攻击者可根据查询是返回aTRUE还是返回结果来迫使数据库返回不同的结果FALSE 。

这是基于内容的SQLi的示例:

从wp_posts中选择post_status,其中

ID = 1,并且(从wp_users中选择1,其中

substring(user_pass,1,1)='a'并且ID = 1)
此查询检查ID为1的用户的哈希密码的第一个字母是否为A。攻击者看不到输出时,网页行为显示查询是否为真。黑客可以使用此技术遍历每个字符并提取管理员密码。

基于内容的SQLi攻击速度很慢,尤其是在大型数据库上。攻击者必须逐个枚举数据库。这种攻击类型的另一个名称是基于布尔的盲SQL注入。

基于时间的盲SQLi
基于时间的SQLi是另一种推理注入技术。攻击者发送查询,迫使数据库在响应之前等待(休眠)特定的秒数。

例如,黑客可以询问数据库管理员帐户的首字母是否以A开头。如果首字母为A,则黑客指示数据库休眠10秒钟。该代码如下所示:

从wp_posts中选择post_title,其中ID = 1

联合选择IF(

substring(wp_users.user_login,1,1)='a',

基准(10000000,ENCODE('blah','asdf')),

空值)

来自wp_users,其中ID = 1
黑客可能看不到输出,但是生成网页的响应时间揭示了答案。

与基于内容的SQLi一样,基于时间的注入速度很慢。不幸的是,这些攻击通常是完全自动化的,因此不正确的猜测不会减慢该过程。

带外SQLi
带外SQLi是最常见的注入类型,通常在黑客无法发起直接查询响应攻击时发生。取而代之的是,黑客制作了SQL语句,这些语句触发数据库在攻击者的控制下创建与外部服务器的连接。

数据库服务器必须具有发出DNS或HTTP请求的能力,才能将数据传递给攻击者。否则,带外SQLi将不起作用。

当服务器响应不稳定时,攻击者通常选择带外方法来替代基于时间的技术。

如何检测SQ​​L注入?
SQLi尝试通常显示为标准数据库错误,因此如果没有工具,则很难检测到注入。但是,您的安全团队应监视SQL注入的迹象。

每个SQLi都涉及反复试验。黑客通常会设置蠕虫或机器人来反复探测网站是否存在漏洞。设置您的扫描工具,以监视登录失败和语法错误。

以下是检测SQL注入的其他方法:

检查error_reported事件是否存在奇数错误。
在数据库中搜索常见的HTML标记,例如http-equiv="refresh"或iframe。
监视流量以了解行为的可疑更改,尤其是权限和密码的更改。
设置基于网络的入侵检测系统(IDS),以监视与数据库服务器的连接。
设置基于主机的IDS来监视Web服务器日志。

输入清理(或验证)是检查和过滤用户输入的一种做法。此技术确保应用程序可以识别非法的用户输入和危险的可执行文件。

开发人员可以通过以下三种方式清除输入:

清除白名单:只有预先批准的字符和代码字符串才能到达数据库。
黑名单清理:开发人员禁止某些字符进入数据库(换行符,多余的空格,标签,制表符等)。
转义清理:查询中的所有数据在执行查询之前都需要先进行SQL转义。
通常,白名单比黑名单更简单,更安全。聪明的黑客可以找到解决黑名单的方法,因此请尽可能在白名单上验证用户输入。

另一个好的做法是使用下拉菜单和单选按钮来验证用户输入。这些输入字段可防止用户键入输入并停止注入可执行代码。

参数化的SQL代码
参数化查询要求开发人员先定义所有SQL代码,然后再将每个参数传递给查询。这种编码风格使数据库能够区分代码和数据,这是动态SQL查询无法实现的功能。

参数化的SQL代码可防止攻击者即使插入命令也无法更改查询的意图。例如,如果黑客输入了用户ID'1 '='1,则查询将查找与整个'1'='1字符串匹配的用户名。数据库将不接受该查询作为命令。

限制用户权限
采用零信任安全性,并将用户限制为执行角色所需的最低限度权限。具有读写执行权限的帐户越少越好。

例如,如果一个网站只返回数据库内容与SELECT声明,不授予连接其他特权,比如INSERT,UPDATE或者DELETE。

另一个好的做法是不信任所有用户输入。将内部用户的输入与来自外部和第三方的输入一样对待。另外,切勿允许Web应用程序以管理员权限连接到数据库。

设置防火墙
使用Web应用程序防火墙(WAF)筛选Web应用程序和数据库之间的所有流量。防火墙可以保护所有面向Web的应用程序,因此请设置防御措施以阻止SQLi和类似的网络攻击。

 

本文导读

客户热线:037125966675

客户服务中心
云产品 服务器 合 作                  Skype