如何防范SQL注入攻击(如何防范sql注入攻击问题)

如何防范SQL注入攻击(如何防范sql注入攻击问题)

浏览次数:
信息来源: 用户投稿
更新日期: 2026-07-21
文章简介

您是否意识到SQL注入漏洞的威胁越来越大?2022年第四季度,AppTrana阻止了1,111,548次此类攻击。在短短三个月内阻止了超过一百万次SQL注入攻击,很明显Web应用程序正处于围攻之中。

2025阿里云双十一服务器活动

您是否意识到SQL注入漏洞的威胁越来越大?2022年第四季度,AppTrana阻止了1,111,548次此类攻击。在短短三个月内阻止了超过一百万次SQL注入攻击,很明显Web应用程序正处于围攻之中。

现在如何保持领先地位并保护您的业务?这是了解此OWASP前10大漏洞以及如何防止SQL注入攻击的指南。什么是数据库和SQL?数据库是一组描述的表,可以从中访问或存储数据。数据库应用程序需要前端和数据库之间的通信媒介。这就是SQL发挥作用的地方。

结构化查询语言(SQL)开发于1970年代,是一种用于从数据库访问和操作数据的语言。应用程序可以使用SQL语句与数据库通信。通过使用SQL语句,应用程序可以执行一些标准的SQL命令,例如“SELECT”、“UPDATE”、“INSERT”、“DELETE”、“CREATE”和“DROP”。

攻击者使用Web应用程序中的输入字段在服务器上运行任意查询(注入)。因此,攻击过程称为SQL注入或SQLi攻击。

他们可以访问不打算显示的信息。这些注入攻击被OWASPTop10归类为“高影响严重性”。

SQLi的根本原因通常是未能正确清理用户输入。当应用程序允许用户在未经适当验证的情况下输入SQL语句时,攻击者可以使用其他命令制作SQL查询。它会导致未经授权的访问、数据修改或其他恶意行为。

例如,攻击者可以通过编写始终返回true的SQL查询来使用SQL注入来绕过身份验证机制。它允许他们在没有有效用户名和密码的情况下登录。或者他们可以使用SQL注入来修改存储在数据库中的数据、窃取敏感数据或执行其他恶意操作。

下面是一个示例来说明SQL注入的工作原理:

假设我们有一个带有SQL数据库的网站来存储用户信息。该网站有一个登录表单,用户可以在其中输入用户名和密码。该网站的代码可能如下所示:

$用户名=$_POST['用户名'];

$password=$_POST['密码'];

$sql=“SELECT*FROMusersWHEREusername='$username'ANDpassword='$password'”;

$result=mysqli_query($conn,$sql);

if(mysqli_num_rows($result)>0){

在这段代码中,用户的输入被直接插入到SQL语句中。如果用户输入用户名,如admin'–,则SQL语句变为:

SELECT*FROMusersWHEREusername='admin'–'ANDpassword=”

双破折号(–)是SQL中的注释符,表示忽略后面的所有内容。这允许攻击者绕过密码检查并以管理员身份登录。

攻击使用常见的SQL注入命令尝试SQLi的不同变体,以查看数据库执行了哪些命令。

基于此,他们不断执行SQLi攻击以访问所需的信息。他们可能会在收集到他们需要的东西后停止,或者继续回来执行他们的命令,直到这些漏洞存在。

SQL注入攻击的类型有哪些?

SQL注入预防和缓解的一大障碍是它涉及多种技术。以下是不同SQL注入类型的细分:

基于错误的SQL注入是一种攻击,恶意用户使用恶意SQL查询来获得某种错误或确认他们的输入存在问题。

它通常是关于数据库语法中的规则。然后他们可以使用这些信息从数据库中提取信息,例如密码或个人银行账户。

如何检测基于错误的SQL注入?

攻击者可以执行的SQL命令类型非常多,而且它们都非常难以预测。

以下是一些示例:单引号、双引号或SQL运算符,如AND、OR和NOT

http://demo.testfire.net/index.php?title=1’

错误消息向攻击者致意:“你的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解在''VALUE''附近使用的正确语法。

错误消息为他提供了重要信息,例如:

  • 语法错误是双引号
  • 导致错误的地方在参数的末尾
  • 在这种类型的SQL注入中,攻击者试图在“UNION”运算符的帮助下利用漏洞。

    UNION运算符用于组合2个表或同时执行2个选择查询。在联合运算符中,它们会删除我们尝试同时执行的重复行或列。

    假设我们有一个Web应用程序,它接受用户的输入并构建如下SQL查询:

    SELECTname,email,phoneFROMusersWHEREname='[user_input]'

    用户输入没有经过适当的过滤,因此攻击者可以注入他们自己的SQL代码。例如,他们可以输入以下值作为他们的名字:

    'UNIONSELECTpassword,NULL,NULLFROMusers—

    这将导致执行以下SQL查询:

    SELECTname,email,phoneFROMusersWHEREname=”UNIONSELECTpassword,NULL,NULLFROMusers–'

    注入字符串末尾的—是一个注释符号,它注释掉了原始查询的其余部分。因此,生成的查询将等效于:

    SELECTname,email,phoneFROMusersWHEREname=”

    UNIONSELECTpassword,NULL,NULLFROM用户

    此查询将返回一个包含用户名、电子邮件和电话号码的表,以及一个包含用户表中所有密码的表。然后,攻击者可以使用此信息进一步破坏系统。

    BlindSQLi是一种SQL注入攻击,攻击者利用Web应用程序中的漏洞从数据库中提取敏感信息,而无法直接查看数据。这种类型的攻击称为“盲”攻击,因为攻击者看不到实际的数据库内容。而是依赖于应用程序的响应来推断信息。

    SQL盲注攻击主要有两种类型:

    在这种类型的SQL注入攻击中,攻击者发送一系列SQL查询,根据注入的代码是否成功执行来评估true或false。然后,攻击者可以使用应用程序的响应,通过构建复杂的查询来探测特定信息,从而推断出有关数据库的信息。

    如何防范SQL注入攻击,如何防范sql注入攻击问题

    它是如何工作的:一个常见的在线商店的SQL数据库查询可能是这样的:

    从ItemWHEREItemNumber=ItemNumber中选择ItemName、ItemDescription

    因此,在线商店中的产品URL可以是

    http://www.exampleshop.com/items/items.asp?itemid=999或1=1。

    从ItemNumber=999或1=1的项目中选择ItemName、ItemDescription

    一永远等于一。这只是一个基本的数学事实,无论您身在何处都适用。SQL查询返回数据库中的所有产品名称和描述,即使是那些您无权访问的产品。

    这种攻击涉及注入一个旨在导致应用程序响应延迟的查询。通过测量应用程序响应查询所需的时间,攻击者可以确定查询是否成功。当攻击者没有来自应用程序的答案(错误/输出),因为输入验证已被清理时,此技术很有用。

    例如,假设Web应用程序上有一个登录表单,它使用SQL查询来检查用户的凭据是否有效。查询可能看起来像这样:

    SELECT*FROMusersWHEREusername='admin'ANDpassword='password123'

    要执行盲目SQLi攻击,攻击者可以注入如下查询:

    SELECTCASEWHEN(1=1)THENpg_sleep(10)ELSEpg_sleep(0)END;

    如果条件“1=1”为真,此查询将使应用程序休眠10秒。攻击者可以通过测量应用程序响应此查询所花费的时间来确定条件是真还是假。

    如果响应需要10秒,则攻击者知道条件为真,应用程序容易受到盲目SQLi的攻击。如果响应是立即的,攻击者就知道条件是错误的。一旦攻击者确认盲SQLi是可能的,他们就可以开始注入更复杂的查询以从数据库中提取敏感信息。

    SQL注入是如何由机器人驱动的?

    SQL注入攻击可以通过几种不同的方式由机器人驱动。机器人可以被编程为自动扫描网站的漏洞,然后尝试使用SQL注入技术来利用它们。这里有些例子:

  • 自动扫描:机器人可以被编程为自动扫描许多网站,寻找可以被SQL注入攻击利用的漏洞。一旦识别出易受攻击的网站,机器人就可以尝试使用一组预定义的SQL注入有效负载来利用该漏洞。
  • 暴力攻击:机器人也可用于对Web表单(例如登录页面或搜索框)进行暴力攻击,以尝试将SQL代码注入应用程序。机器人可以使用不同的技术(例如字典攻击或模糊测试)来生成不同的有效负载并将它们提交给应用程序以找到易受攻击的入口点。
  • 自动利用:一旦确定易受攻击的入口点,机器人就可以自动注入恶意SQL代码并从数据库中提取数据。
  • 僵尸程序可以使用不同的技术,例如SQL盲注或基于错误的SQL注入,从数据库中提取敏感数据。机器人可用于自动化识别和大规模利用SQL注入漏洞的过程。它使攻击者更容易破坏许多网站并提取敏感数据。这就是为什么实施适当的安全措施以防止SQL注入攻击很重要的原因。

    SQL注入攻击的影响可能是深远的,并且可能因目标而异。数据完整性和机密性泄露是最常见的后果。当数据库执行恶意代码时,它可能允许攻击者:

  • 窃取敏感数据:攻击者可以使用SQL注入从数据库中提取敏感数据,例如用户名、密码、信用卡号或个人信息。
  • 修改或删除数据:攻击者可以使用SQL注入修改或删除数据库中的数据,从而导致数据丢失或损坏。
  • 控制系统:攻击者可以使用SQL注入获得管理访问权限,从而允许他们执行进一步的攻击、安装恶意软件或将系统用于恶意目的。
  • SQL注入攻击的潜在成本甚至更高。经济损失可能是直接的经济损失,例如遭受攻击后恢复系统和数据的成本。间接损失包括因业务运营中断而造成的收入损失。此外,企业还可能因注入攻击导致的数据泄露而面临经济处罚或法律诉讼。这尤其会损害处理敏感信息的企业,例如金融机构或医疗保健提供者。

    此外,声誉受损可能是长期的且难以恢复,从而对公司未来的增长和盈利能力产生负面影响。常见的SQL注入攻击会导致知识丢失或拒绝访问。多年来,黑客将这些攻击与不充分的身份验证、DNS劫持、XSS和DDoS攻击相结合,造成了巨大的经济损失和绝对主机接管。停机会导致收入损失和客户失望,进一步损害企业声誉。

    历史上最臭名昭著的SQLi攻击

    以下是近年来最著名的一些SQL攻击,每个公司都必须知道:

  • HeartlandPaymentSystems:2010年3月,AlbertGonzalez被判处20年徒刑。他将自己的代码安装到HeartlandPaymentSystems的信用卡服务器中,并窃取了1.3亿个信用卡号码。该公司的攻击成本约为1200万美元。
  • 索尼PlayStation网络黑客攻击:2011年,索尼PlayStation网络(PSN)遭到黑客攻击,导致7700万用户的个人信息丢失。据报道,这次黑客攻击是SQL注入攻击的结果。攻击者能够访问敏感信息,例如用户姓名、地址和信用卡号。
  • YahooHack:2012年7月,雅虎语音用户的453,000个电子邮件地址和密码被泄露。凭据以未加密的方式存储。黑客通过执行SQL注入攻击窃取了数据。
  • Target数据泄露:2013年,TargetCorporation成为大规模数据泄露的受害者,影响了4000万客户。专家声称服务器受到了SQL注入攻击。
  • DrupalSQL注入:2014年10月,Drupal宣布其高度易受攻击。缺乏用户输入清理导致SQL注入漏洞。从7.0到7.31的Drupal核心版本容易受到攻击。
  • Kaseye勒索软件攻击:2021年7月,一个名为REvil的臭名昭著的组织影响了Kaseya管理的1500多家企业。黑客远程利用了KaseyaVSA服务器的SQL漏洞。
  • WooCommerce?未经身份验证的SQL注入:2021年7月,WooCommerce披露其多个功能插件和软件版本存在SQL注入漏洞;他们注意到在那段时间发生了几次安全攻击。
  • 防止或减轻SQL注入攻击是关于确保没有任何字段容易受到无效输入和应用程序执行的影响。手动检查网站上的每个页面和每个应用程序是不可能的。尤其是在更新频繁,用户友好性是重中之重的情况下。尽管如此,安全分析师和开发人员还是建议以下几点确保您的数据库在服务器内受到良好保护。

    持续的Web应用程序扫描涉及定期运行自动漏洞扫描工具,以识别和评估系统中的任何潜在漏洞。渗透测试,也称为“笔测试”,涉及模拟对系统的攻击以识别和利用漏洞。通过定期执行这些测试,组织可以在攻击者利用它们之前快速识别并解决任何漏洞。开发人员可以遵循最佳实践指南并使用带有参数化输入的准备好的语句来防止SQL注入攻击。

    限制权限是防止SQL注入攻击影响的另一个重要措施。这涉及限制用户和应用程序对数据库及其组件的访问和权限。这样做会限制潜在的攻击面,并使攻击者更难利用漏洞。限制权限的一种方法是使用最小权限原则。它涉及仅向用户和应用程序提供执行其任务所需的最低访问权限和权限。这可以通过为不同的角色和职责创建单独的用户帐户来完成。并且还通过限制这些帐户对特定数据库对象和操作的权限。另一种限制权限的方法是使用安全框架,例如基于角色的访问控制(RBAC)。它允许您定义用户角色并分配特定权限。简而言之,限制权限可以减少潜在的攻击面,并使攻击者更难利用漏洞。

    动态查询给安全专业人员带来了很多麻烦。他们必须处理每个应用程序中的可变漏洞,这些漏洞只会随着更新和更改而变得更加严重。建议准备参数化查询。查询参数是SQL查询中的占位符,其中填充了来自用户输入或其他来源的值。使用查询参数,您可以将用户输入与SQL查询分开,使攻击者更难注入恶意代码。

    以下是使用查询参数的SQL查询示例:

    $用户名=$_POST['用户名'];

    $password=$_POST['密码'];

    $query=“SELECT*FROMusersWHEREusername=:usernameANDpassword=:password”;

    $stmt=$pdo->准备($query);

    $stmt=bindParam(':用户名',$用户名);

    $stmt->bindParam(':密码',$密码);

    在此示例中,使用查询参数:username和:password将SQL查询与用户输入分开。然后将这些参数的值分别传递给bindParam()函数,该函数在执行查询之前将值绑定到参数。这些查询简单、易于编写,并且只有在SQL代码中的每个参数都被明确定义时才会通过。这样,您的信息会随武器一起提供,以区分代码和信息输入。

    大多数组织都会遇到过时的代码、缺乏用于测试和进行更改的资源、不了解应用程序安全性以及应用程序中的频繁更新等问题。对于这些,Web应用程序保护是最好的解决方案。可以部署托管Web应用程序防火墙(WAF)以立即缓解此类?攻击。?它可以在恶意流量到达Web应用程序之前检测并阻止它。WAF可以配置为检测和阻止已知的SQL注入负载。

    WAF可以分析传入流量的行为并查找指示SQL注入攻击的模式。例如,它可以查找在短时间内重复提交SQL代码的尝试或异常活动。它包含自定义策略以阻止不符合应用程序安全策略的流量。这样,您就不必手动查找漏洞并在事后修复问题。即使代码更改很小,引入注入问题也很常见。因为此类更改可能不会在开发周期中经过全面的安全审查流程。当无法及时修复检测到的漏洞代码时,?部署后可以使用WAF进行虚拟补丁。

    标签:
    构建可扩展的Linux容器编排与管理平台(linux容器技术原理)
    « 上一篇
    国外网站空间是如何提升网站速度的(如何提高国外网站访问速度)
    下一篇 »

    如本文对您有帮助,就请抽根烟吧!