分享免费的编程资源和教程

网站首页 > 技术教程 正文

SQL 入侵的防范

goqiw 2024-11-21 15:12:32 技术教程 19 ℃ 0 评论

什么是SQL入侵?

SQL入侵,也称为SQLI,是一种常见的攻击方式,它使用恶意SQL代码对后端数据库进行操作,以访问数据库中私密的信息。这些信息可能包括任何数量的条目,包括敏感的公司数据、用户列表或私人客户详细信息。

SQL注入对业务的影响是深远的。成功的攻击可能导致未授权查看用户列表、删除整个表甚至数据库。在某些情况下,攻击者还会获得对数据库的管理权限,所有这些都对业务非常不利。

在计算SQLi的潜在成本时,重要的是要考虑到如果用户电话号码、地址和信用卡详细信息等个人信息被盗,客户信任的丧失。

虽然SQLi可以用来攻击任何SQL数据库,但网站是最常见的目标。

SQL查询

SQL是一种标准化语言,用于访问和操作数据库,为每个用户构建可定制的数据视图。SQL查询用于执行命令,如数据检索、更新和删除记录。不同的SQL元素实现这些任务,例如,使用SELECT语句根据用户提供的参数检索数据的查询。

一个典型的SQL数据库查询可能看起来像这样:

SELECT ItemName, ItemDescription

FROM Item

WHERE ItemNumber = ItemNumber

如果web应用程序构建了一个字符串查询,作为一条SQL语句发送到数据库:

sql_query= "

SELECT ItemName, ItemDescription

FROM Item

WHERE ItemNumber = " & Request.QueryString("ItemID")

用户提供的输入http://www.estore.com/items/items.asp?itemid=999可以生成以下SQL查询:

SELECT ItemName, ItemDescription

FROM Item

WHERE ItemNumber = 999

从语法可以看出,该查询应该返回商品编号999的名称和描述。

SQL入侵的类型

SQL注入通常分为三类:带内SQLi、推理SQLi和带外SQLi。您可以根据SQL注入用于访问后端数据的方法及其可能造成的损害对它们进行分类。

带内SQLi

攻击者使用相同的通信通道来发起攻击并收集攻击结果。带内SQLi的简单和高效使它成为最常见的SQLi攻击类型之一。这个方法有两个子变体:

基于错误的sql—攻击者执行导致数据库产生错误消息的操作。攻击者可能会使用这些错误消息提供的数据来收集有关数据库结构的信息。

基于UNION的sql---此技术利用了UNION SQL操作符,该操作符融合数据库生成的多个选择语句以获得单个HTTP响应。这个响应可能包含攻击者可以利用的数据。

推论SQLi

攻击者向服务器发送有效数据,并观察服务器的响应和行为,以了解更多关于它的结构。这种方法被称为盲SQLi,因为数据没有从网站数据库传输给攻击者,因此攻击者无法看到关于带内攻击的信息。

盲SQL注入依赖于服务器的响应和行为模式,所以它们通常执行速度较慢,但可能同样有害。盲SQL注入可以分为以下几种:

布尔条件——攻击者向数据库发送一个SQL查询,提示应用程序返回结果。结果将根据查询是真还是假而有所不同。根据结果,HTTP响应中的信息将被修改或保持不变。然后攻击者可以计算出消息生成的结果是真还是假。

基于时间 ------攻击者向数据库发送一个SQL查询,这使得数据库在做出反应之前等待(以秒为单位的时间段)。攻击者可以从数据库响应所需的时间看出查询是真还是假。根据结果,HTTP响应将立即生成或在等待一段时间后生成。因此,攻击者可以计算出他们使用的消息返回的是真还是假,而不需要依赖数据库中的数据

带外SQLi

只有当web应用程序使用的数据库服务器启用某些特性时,攻击者才能执行这种形式的攻击。这种形式的攻击主要用于替代带内和推断SQLi技术。

当攻击者不能使用相同的通道来发起攻击和收集信息,或者当服务器太慢或不稳定,无法执行这些操作时,就会执行带外SQLi。这些技术依赖于服务器创建DNS或HTTP请求的能力,以向攻击者传输数据。

SQL入侵例子

希望执行SQL注入的攻击者通过操纵标准SQL查询来利用数据库中未经验证的输入漏洞。执行这个攻击向量的方法有很多,这里将展示其中几种方法,让您大致了解SQLI的工作原理。

例如,上述提取特定产品信息的输入可以修改为http://www.estore.com/items/items.asp?itemid=999 or 1=1。

结果,相应的SQL查询如下:

SELECT ItemName, ItemDescription

FROM Items

WHERE ItemNumber = 999 OR 1=1

由于语句1 = 1总是为真,因此查询将返回数据库中的所有产品名称和描述,即使是那些您可能没有资格访问的产品名称和描述。

攻击者还能够利用不正确的过滤字符来修改SQL命令,包括使用分号来分隔两个字段。

例如,输入http://www.estore.com/items/iteams.asp?itemid=999;DROP TABLE USERS用户将生成以下SQL查询:

SELECT ItemName, ItemDescription

FROM Items

WHERE ItemNumber = 999; DROP TABLE USERS

因此,可能会删除整个用户数据库。

操纵SQL查询的另一种方法是使用UNION SELECT语句。这将结合两个不相关的SELECT查询从不同的数据库表检索数据。

例如,输入http://www.estore.com/items/items.asp?itemid=999 UNION SELECT user-name, password FROM USERS生成以下SQL查询:

SELECT ItemName, ItemDescription

FROM Items

WHERE ItemID = '999' UNION SELECT Username, Password FROM Users;

使用UNION SELECT语句,该查询将对999项的名称和描述的请求与另一个提取数据库中每个用户的名称和密码的请求结合起来。

SQL入侵的预防和缓解

有几种有效的方法可以防止SQLI攻击的发生,并在发生攻击时提供保护。

第一步是输入验证,通过编写验证sql语句验证可以识别非法用户输入并阻止。

虽然输入验证总是应该被视为最佳实践,但它不是万无一失的解决方案。现实情况是,在大多数情况下,列出所有合法和非法输入是不可行的——至少在不造成大量误报的情况下是不行的,这会干扰用户体验和应用程序的功能。

因此,通常使用web应用程序防火墙来(WAF,Web Application Firewall)过滤SQLI以及其他在线威胁。为此,WAF通常依赖于一个庞大的、不断更新的、精心制作的签名列表,这些签名允许它像手术一样清除恶意SQL查询。通常,这样的列表包含解决特定攻击向量的签名,并定期进行修补,为新发现的漏洞引入阻塞规则。

现代web应用程序防火墙也经常与其他安全解决方案集成在一起。WAF可以从这些文件中接收到额外的信息,从而进一步增强其安全能力。

例如,一个web应用防火墙遇到一个可疑的,但不是完全恶意的输入,可能会在决定阻止请求之前用IP数据交叉验证它。它只会在IP本身有不良声誉历史的情况下屏蔽输入。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表