1. beplay体育能用吗网络安全学院
  2. SQL注入

SQL注入

在本节中,我们将解释一下SQL注入的内容,描述了一些常见的例子,解释了如何查找和利用各种SQL注入漏洞,并概括了如何防止SQL注入。

SQL注入

什么是SQL注射(SQLI)?

SQL注入是一个Web安全漏洞,允许攻beplay体育能用吗击者干扰应用程序对其数据库的查询。它通常允许攻击者查看它们通常不能检索的数据。这可能包括属于其他用户的数据,或应用程序本身能够访问的任何其他数据。在许多情况下,攻击者可以修改或删除此数据,从而导致应用程序的内容或行为的持久更改。

在某些情况下,攻击者可以升级SQL注入攻击以损害底层服务器或其他后端基础架构,或执行拒绝服务攻击。

成功的SQL注入攻击的影响是什么?

成功的SQL注入攻击可能导致对敏感数据的未经授权访问,如密码、信用卡详细信息或个人用户信息。近年来,许多备受瞩目的数据泄露都是SQL注入攻击的结果,导致了声誉受损和监管罚款。在某些情况下,攻击者可以获得进入组织系统的持久后门,从而导致在很长一段时间内不被注意到的长期妥协。

SQL注射例子

在不同的情况下会出现各种各样的SQL注入漏洞、攻击和技术。一些常见的SQL注入示例包括:

  • 检索隐藏数据,您可以在其中修改SQL查询以返回其他结果。
  • 颠覆应用程序逻辑,您可以在其中更改查询以干扰应用程序的逻辑。
  • 工会的攻击,您可以在其中检索来自不同数据库表的数据。
  • 检查数据库,您可以在其中提取有关数据库的版本和结构的信息。
  • SQL盲注,在应用程序的响应中不会返回所需查询的结果。

检索隐藏数据

考虑一个在不同类别中显示产品的购物应用程序。当用户点击礼品类别时,他们的浏览器请求URL:

https://insecure-beplay体育能用吗website.com/products?category=Gifts

这导致应用程序使SQL查询从数据库中检索相关产品的详细信息:

选择*来自类别='礼物'和释放= 1的产品

这个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'AditeR+1=1---

这会导致SQL查询:

选择*从类别='礼物'或1 = 1--'并发布= 1

修改后的查询将返回类别为礼物的所有项目,或者1等于1.以来1 = 1总是如此,查询将返回所有项目。

颠覆应用程序逻辑

考虑一个允许用户使用用户名和密码登录的应用程序。用户提交用户名维纳和密码bluecheese,应用程序通过执行以下SQL查询检查凭据:

SELECT * FROM users WHERE username = 'wiener' AND password = 'bluecheese'

如果查询返回用户的详细信息,则登录成功。否则,它被拒绝了。

在这里,攻击者只需使用SQL注释序列就可以作为不需要密码的任何用户登录-删除密码检查在哪里查询条款。例如,提交用户名管理员”,和空白密码在以下查询中产生:

选择*来自UserName ='Administrator' - ' - '和Password =''的用户

该查询返回用户名为的用户行政人员并成功将攻击者身份记录为该用户。

从其他数据库表中检索数据

在应用程序的响应中返回SQL查询结果的情况下,攻击者可以利用SQL注入漏洞来从数据库内的其他表中检索数据。这是使用的联盟关键字,允许您额外执行选择查询并将结果附加到原始查询。

例如,如果一个应用程序执行以下包含用户输入“Gifts”的查询:

SELECT name, description FROM products WHERE category = '礼品'

然后攻击者可以提交输入:

'联盟选择用户名,来自用户的密码 -

这将导致应用程序返回所有用户名和密码以及产品的名称和描述。

检查数据库

在初步识别SQL注入漏洞之后,获取关于数据库本身的一些信息通常是有用的。这些信息通常可以为进一步开发铺平道路。

您可以查询数据库的版本详细信息。这样做的方式取决于数据库类型,因此您可以从任何技术工作中推断数据库类型。例如,在Oracle上,您可以执行:

选择*来自V $版本

您还可以确定存在的数据库表,以及它们包含哪些列。例如,在大多数数据库上,您可以执行以下查询以列出表:

从Information_schema.tables中选择*

盲目SQL注入漏洞

许多SQL注入实例是盲漏。这意味着应用程序不会返回SQL查询的结果或其响应中的任何数据库错误的详细信息。仍然可以利用盲人漏洞来访问未经授权的数据,但涉及的技术通常更复杂且难以执行。

根据涉及漏洞和数据库的性质,以下技术可用于利用盲目SQL注入漏洞:

  • 您可以更改查询的逻辑,以根据单个条件的真实性在应用程序的响应中触发可检测的差异。这可能涉及到将一个新条件注入到某个布尔逻辑中,或者有条件地触发一个错误,比如被零除的错误。
  • 您可以有条件地触发查询处理中的时间延迟,允许您根据应用程序响应所需的时间推断条件的真实性。
  • 您可以使用触发带外网络交互,使用Oast.技巧。这种技术非常强大,在其他技术没有的情况下工作。通常,您可以通过带外通道直接抵消数据,例如,通过将数据放入您控制的域中的DNS查找。

如何检测SQ​​L注入漏洞

使用Burp Suite的Burp套件可以快速可靠地发现大多数SQL注入漏洞bepaly下载

通过使用系统集合对应用程序中的每个入口点来手动检测SQL注入。这通常涉及:

  • 提交单引号字符'并寻找错误或其他异常。
  • 提交一些特定于sql的语法,这些语法计算为入口点的基本(原始)值,以及一个不同的值,并在结果应用程序响应中寻找系统差异。
  • 提交布尔条件,如或1 = 1或1 = 2,寻找应用程序响应的差异。
  • 提交用于在SQL查询中执行时触发时间延迟的有效负载,并查找响应所需时间的差异。
  • 提交OAST有效负载,用于在SQL查询中执行时触发带外网络交互,并监视产生的任何交互。

SQL注入在查询的不同部分

大多数SQL注射漏洞都会内出现在哪里A.选择询问。经验丰富的测试仪通常很好地理解这种SQL注射。

但是,SQL注入漏洞原则上可能发生在查询中的任何位置,以及在不同的查询类型中。SQL注入出现的最常见的其他位置是:

  • 更新语句,在更新的值中或在哪里条款。
  • 语句中插入的值。
  • 选择语句,表格或列名。
  • 选择陈述,内部命令条款。

二阶SQL注射

在应用程序从HTTP请求中获取用户输入的一阶SQL注入,并且在处理该请求的过程中,以不安全的方式将输入包含到SQL查询中。

在二级SQL注入(也称为存储SQL注入)中,应用程序从HTTP请求中获取用户输入,并将其存储起来以备将来使用。这通常是通过将输入放置到数据库中来完成的,但是在存储数据的地方没有出现漏洞。稍后,当处理不同的HTTP请求时,应用程序检索存储的数据,并以不安全的方式将其合并到SQL查询中。

二阶SQL注射

二阶SQL注入通常在开发人员意识到SQL注入漏洞的情况下出现,因此安全地处理输入的初始放置到数据库中。当数据稍后处理时,它被认为是安全的,因为它之前被安全地放入了数据库中。此时,数据以不安全的方式处理,因为开发人员错误地认为它被信任。

数据库特定因素

SQL语言的一些核心功能在流行的数据库平台上以相同的方式实现,并且在不同类型的数据库上相同地检测和利用SQL注入漏洞的方式。

然而,公共数据库之间也有许多不同之处。这意味着用于检测和利用SQL注入的一些技术在不同的平台上的工作方式是不同的。例如:

  • 字符串连接的语法。
  • 评论。
  • 批量(或堆叠)查询。
  • 特定于平台的API。
  • 错误消息。

如何防止SQL注入

通过使用参数化查询(也称为准备好语句)而不是查询内的字符串连接,可以防止大多数SQL注入实例。

以下代码容易受到SQL注入的攻击,因为用户输入将直接连接到查询中:

字符串Query =“从产品='+输入+”'中的产品中选择*;

statement语句= connection.createstatement();

ResultSet ResultSet = statement.executeQuery(查询);

可以以防止用户输入干扰查询结构的方式轻松重写此代码:

PreparedStatement语句= Connection.PropleStatement(“从类别=?”中选择*);

陈述。setString(输入);

结果集结果集= statement.executeQuery();

参数化查询可用于任何不受信任的输入显示为查询中的数据的情况,包括在哪里子句和价值或者更新陈述。它们不能用于处理查询的其他部分中的不受信任的输入,例如表或列名,或者命令条款。将不受信任数据放置到查询的那些部分的应用程序功能需要采取不同的方法,例如白列表允许的输入值,或使用不同的逻辑来提供所需的行为。

对于有效防止SQL注入的参数化查询,查询中使用的字符串必须始终是硬编码的常量,并且必须永远不会包含来自任何源的任何可变数据。不要试图决定逐个案例是否是可信的数据项,并在查询中继续使用字符串连接,以便被认为是安全的案例。毫不糟糕地讨论可能的数据起源,或者用于其他代码的变化,以违反关于数据受到污染的假设。

来自Daily Swig关于SQLbeplay2018官网注入的故事

使用Burp套件查找SQL注入漏洞

通过Portswigge的Web安全学院工作的好处beplay官网可以赌beplay体育能用吗

开始使用Web安全学院,您可以在那里练习在beplay体育能用吗现实目标上利用漏洞..它是免费的!

已经有了一个帐户?登录这里