SQL注入(或SQLi)是一种严重的漏洞,导致许多引人注目的数据泄露。
SQL注入通常允许攻击者从易受攻击的网站中提取整个数据库,包括用户信息,加密密码和业务数据。这可能导致用户帐户的大规模泄露,数据被加密并被勒索,或被盗数据被出售给第三方。许多SQL注入漏洞可以使用现成的工具轻松找到和滥用,这使得它们比需要熟练攻击者的漏洞更有可能被利用。
SQL注入漏洞通常出现在应用程序以不安全的方式将用户数据合并到数据库查询中的时候。攻击者可以操纵数据,使其执行自己的数据库查询,从而允许他们读取或修改数据库的内容。
遭受SQL注入攻击的组织通常不知道漏洞已被利用。在某些情况下,受害者在攻击者窃取组织数据几个月或几年后才意识到漏洞。
描述:SQL注入
SQL注入漏洞出现在将用户可控数据以不安全的方式合并到数据库SQL查询中时。攻击者可以提供精心制作的输入,以跳出其输入出现的上下文数据,并干扰周围查询的结构。
通过SQL注入可以实施多种破坏性攻击,包括读取或修改关键应用程序数据,干扰应用程序逻辑,提升数据库中的权限,并控制数据库服务器。
补救:SQL注入
防止SQL注入攻击的最有效方法是对于所有数据库访问使用参数化查询(也称为准备好的语句)。该方法采用两个步骤将潜在污染的数据合并到SQL查询中:首先,应用程序指定查询的结构,为每个用户输入项留出占位符;第二,应用程序指定每个占位符的内容。由于查询的结构已经在第一步中定义好了,所以在第二步中不可能出现格式错误的数据干扰查询结构。您应该查看您的数据库和应用程序平台的文档,以确定您可以用来执行参数化查询的适当API。强烈建议您对纳入数据库查询的每个变量数据项进行参数化,即使它们没有明显的污染,以防止出现疏忽,避免应用程序代码库的其他地方发生更改时引入漏洞。
您应该意识到,一些常用且推荐用于缓解SQL注入漏洞的措施并不总是有效的:
-
一种常见的防御措施是在将用户输入的数据合并到SQL查询之前,将出现在用户输入中的任何单引号成对出现。这种防御措施旨在防止恶意数据终止它被插入的字符串。然而,如果被合并到查询中的数据是数字,那么这种防御措施可能会失败,因为数字数据可能不会用引号括起来,在这种情况下只需要一个空格就可以跳出数据上下文并干扰查询。此外,在第二阶SQL注入攻击中,当数据首次插入数据库时已经安全地转义了,随后从数据库中读取出来,然后再次传递回数据库。当数据被重复使用时,最初成对出现的引号将返回到原始形式,从而允许绕过防御。
-
另一种经常被引用的防御措施是使用存储过程进行数据库访问。虽然存储过程可以提供安全保障,但并不能保证防止SQL注入攻击。如果任何SQL在存储过程中动态构建,则会出现与标准动态SQL查询中出现的相同类型的漏洞。此外,即使该过程是健全的,如果使用用户可控的数据以不安全的方式调用该过程,也会引起SQL注入攻击。
原文始发于微信公众号(张无瑕思密达):什么是SQL注入?
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论