SQL注入
在本节中,我们将解释哪些SQL注入(SQLI)是什么,描述一些常见的例子,说明如何查找和利用各种SQL注入漏洞,并总结如何防止SQL注入。
什么是SQL注入(SQLI)?
SQL注入(SQLI)是一个Web安全漏洞,允许攻击beplay体育能用吗者干扰应用程序对其数据库的查询。它通常允许攻击者查看他们通常无法检索的数据。这可能包括属于其他用户的数据或应用程序本身能够访问的任何其他数据。在许多情况下,攻击者可以修改或删除此数据,从而导致应用程序的内容或行为的持续更改。
在某些情况下,攻击者可以升级SQL注入攻击,以损害基础服务器或其他后端基础架构,或执行拒绝服务攻击。
成功的SQL注射攻击有什么影响?
成功的SQL注入攻击可能会导致未经授权访问敏感数据,例如密码,信用卡详细信息或个人用户信息。近年来,许多备受瞩目的数据泄露是SQL注射攻击的结果,导致声誉损失和监管罚款。在某些情况下,攻击者可以在组织的系统中获得持续的后门,从而导致长期妥协,这可能会在很长的时间内忽略。
SQL注入示例
在不同情况下出现的SQL注入漏洞,攻击和技术各种各样。一些常见的SQL注入示例包括:
- 检索隐藏数据,您可以在其中修改SQL查询以返回其他结果。
- 颠覆应用程序逻辑,您可以更改查询以干扰应用程序的逻辑。
- 工会攻击,您可以从不同的数据库表中检索数据。
- 检查数据库,您可以在其中提取有关数据库版本和结构的信息。
- 盲目注射,如果您控制的查询结果未在应用程序的响应中返回。
检索隐藏数据
考虑一个在不同类别中显示产品的购物应用程序。当用户单击礼品类别时,他们的浏览器请求URL:
https://insecure-beplay体育能用吗website.com/products?category=gifts
这会导致应用程序进行SQL查询以从数据库中检索相关产品的详细信息:
从类别='礼物'并发布的产品中选择 * *
此SQL查询要求数据库返回:
- 所有细节(*)
- 从产品表中
- 该类别是礼物的地方
- 并发行是1。
限制释放= 1
被用来隐藏未发布的产品。对于未发行的产品,大概是释放= 0
。
该应用程序不能对SQL注入攻击实施任何防御措施,因此攻击者可以构建类似的攻击:
https://insecure-beplay体育能用吗website.com/products?category=gifts'---
这导致SQL查询:
从类别='礼物' - ' - '和发布= 1的产品中选择 *
这里的关键是双重划线序列- -
是SQL中的评论指标,意味着查询的其余部分被解释为评论。这有效地消除了查询的其余部分,因此不再包括并发布= 1
。这意味着显示所有产品,包括未发行的产品。
进一步,攻击者可以使应用程序显示任何类别中的所有产品,包括他们不知道的类别:
https://insecure-beplay体育能用吗website.com/products?category=gifts'+ +1 = 1-
这导致SQL查询:
从类别='礼物'或1 = 1-'的产品中选择 *
修改的查询将返回类别为礼物的所有项目,或1等于11 = 1
总是正确的,查询将返回所有项目。
颠覆应用程序逻辑
考虑一个使用户可以使用用户名和密码登录的应用程序。如果用户提交用户名维纳
和密码蓝乳酪
,该应用程序通过执行以下SQL查询来检查凭据:
从用户中选择 *用户名='Wiener'和password ='Bluecheese'
如果查询返回用户的详细信息,则登录成功。否则,它将被拒绝。
在这里,攻击者只需使用SQL评论序列即可作为任何没有密码的用户登录。- -
从在哪里
查询的条款。例如,提交用户名行政人员' -
并在以下查询中导致空白密码:
从用户中选择 *用户名='管理员' - '和password =''
此查询返回用户名为的用户行政人员
并成功地将攻击者记录在该用户中。
从其他数据库表中检索数据
如果在应用程序的响应中返回SQL查询的结果,则攻击者可以利用SQL注入漏洞从数据库中的其他表中检索数据。这是使用联盟
关键字,这使您可以执行其他选择
查询并将结果附加到原始查询中。
例如,如果应用程序执行以下查询,其中包含用户输入“礼物”:
选择名称,描述类别='礼物'的产品
然后攻击者可以提交输入:
'联合选择用户的用户名,密码 -
这将导致应用程序返回所有用户名和密码以及产品的名称和描述。
阅读更多
SQL注射联盟攻击检查数据库
在最初识别SQL注入漏洞后,获得有关数据库本身的一些信息通常是有用的。这些信息通常可以为进一步的开发铺平道路。
您可以查询数据库的版本详细信息。完成此操作的方式取决于数据库类型,因此您可以从哪种技术中推断数据库类型。例如,在Oracle上您可以执行:
从V $版本中选择 *
您还可以确定存在哪些数据库表以及它们包含哪些列。例如,在大多数数据库中,您可以执行以下查询以列出表:
选择 *来自信息_schema.tables
盲SQL注入漏洞
SQL注射的许多实例都是盲目的漏洞。这意味着该应用程序不会返回SQL查询的结果或其响应中任何数据库错误的详细信息。仍然可以利用盲弱漏洞来访问未经授权的数据,但是所涉及的技术通常更复杂且难以执行。
根据脆弱性的性质和所涉及的数据库的性质,可以使用以下技术来利用盲目的SQL注入脆弱性:
- 您可以更改查询的逻辑,以根据单个条件的真实性触发应用程序响应的可检测差异。这可能涉及将新条件注入某些布尔逻辑,或者有条件地触发错误,例如按零分割。
- 您可以有条件地触发查询处理的时间延迟,从而使您可以根据应用程序响应的时间来推断条件的真相。
- 您可以使用触发带外网络交互Oast技术。该技术非常强大,并且在其他技术没有的情况下起作用。通常,您可以通过带外通道直接渗透数据,例如,将数据放入DNS查找中以查找您控制的域。
阅读更多
盲目注射如何检测SQL注入漏洞
大多数SQL注入漏洞都可以使用Burp Suite的套件迅速而可靠地找到bepaly下载 。
可以通过对应用程序中每个入口点进行系统的测试来手动检测SQL注入。这通常涉及:
- 提交单引号字符
'
并寻找错误或其他异常。 - 提交一些SQL特异性语法,这些语法评估了入口点的基础值(原始)值,并提交不同的值,并在结果应用程序响应中寻找系统的差异。
- 提交布尔条件,例如
或1 = 1
和或1 = 2
,并寻找应用程序响应的差异。 - 提交有效载荷,旨在在SQL查询中执行时触发时间延迟,并寻找响应时间的差异。
- 提交旨在在SQL查询中执行时触发带外网络交互的OAST有效载荷,并监视任何结果交互。
查询不同部分的SQL注入
大多数SQL注入漏洞都在在哪里
条款选择
询问。经验丰富的测试人员通常会很好地理解这种SQL注入。
但是SQL注入漏洞原则上可以在查询中的任何位置和不同的查询类型中发生。最常见的其他SQL注入的位置是:
- 在
更新
语句,更新的值或在哪里
条款。 - 在
插入
语句,在插入的值中。 - 在
选择
语句,表格或列名。 - 在
选择
陈述,在顺序
条款。
二阶SQL注入
一阶SQL注入出现,该应用程序从HTTP请求中获取用户输入,并且在处理该请求的过程中,将输入以不安全的方式合并到SQL查询中。
在二阶SQL注入(也称为存储的SQL注入)中,该应用程序从HTTP请求中获取用户输入,并将其存储以供将来使用。这通常是通过将输入放入数据库中来完成的,但是在存储数据的点没有漏洞。后来,当处理其他HTTP请求时,应用程序会检索存储的数据并以不安全的方式将其集成到SQL查询中。
二阶SQL注入通常在开发人员知道SQL注入漏洞并因此安全地处理输入到数据库中的初始放置的情况下通常会出现。后来处理数据时,它被认为是安全的,因为先前将其安全地放入数据库中。在这一点上,数据以不安全的方式处理,因为开发人员错误地认为它是值得信赖的。
数据库特异性因素
SQL语言的某些核心功能以相同的方式在流行的数据库平台上实现,并且在不同类型的数据库上检测和利用SQL注入漏洞的许多方法相同工作。
但是,通用数据库之间也存在许多差异。这些意味着某些用于检测和利用SQL注入的技术在不同平台上的工作不同。例如:
- 字符串串联的语法。
- 注释。
- 批处理(或堆叠)查询。
- 平台特定的API。
- 错误消息。
阅读更多
SQL注入备忘单如何防止SQL注入
可以通过使用参数化查询(也称为准备的语句)而不是查询中的字符串串联来防止SQL注入的大多数实例。
以下代码很容易受到SQL注入的影响,因为用户输入直接连接到查询中:
字符串查询=“从category ='“ + input +”''select *从产品中进行选择 *'';语句语句= Connection.CreateStatement();resultset resultset = statement.executequery(query);
可以以防止用户输入干扰查询结构的方式轻松重写此代码:
准备陈述语句= connection.preparestatement(“从category =?”的产品中选择 * *);statement.setString(1,输入);resultset resultset = statement.executequery();
参数化查询可用于任何不受信任输入作为数据中出现在查询中的数据的情况,包括在哪里
子句和价值插入
或者更新
陈述。它们不能用于处理查询其他部分中的不受信任的输入,例如表或列名,或顺序
条款。将不受信任的数据置于查询部分的应用功能将需要采用不同的方法,例如允许输入值,或使用不同的逻辑来提供所需的行为。
为了使参数化查询有效防止SQL注入,查询中使用的字符串必须始终是硬编码常数,并且绝对不能包含来自任何原点的任何可变数据。不要试图逐案确定是否信任数据项目,并继续在查询中使用字符串串联来确定被认为是安全的情况。对于数据的可能来源或其他代码的更改以违反对哪些数据被污染的假设,这太容易了。