SQL延迟注入攻击之MYSQL函数


     现在您已经掌握了一些关于这两类技术的背景知识,接下来我们要深入探讨真正的漏洞利用技术。在介绍推断数据的各种方法时,我们明确假定存在这样一种推断机制:它允许我们使用二分搜索方法或逐位方法来检索字节的值。本节我们将讨论并详细研究一种基于时间的机 制,可将其用于之前介绍和分析过的两种推断方法中。回想一下,为了让推断方法工作,我们 需要能够根据页面响应中的某一属性来区分两种不同的状态。所有响应都会包含的一种属性 是:发出请求到响应到达这段时间的差异。当某一状态为真时,如果能够让响应暂停几秒钟,而当状态为假时,能够不出现暂停,那么我们将拥有一种适合两种推断方法且非常重要的技巧。 我们将关注两种状态:延迟或无延迟。使用计时方法可以根据是否产生了延迟来推断信息, 每一种响应时间上的延迟都代表了一个可能状态,可以据此对比信息。通过将查询的响应暂停 1个、3个或百万个计时单位(tick),可以清晰地揭示很多状态。例如,Ferruh Mavituna展示了一种将一个字节拆分为两个4bit片段的技术,该技术把查询暂停4bit片段表示的数值所指定的秒数。例如为了提取字节0xA3,可以为每一个4bit片段发起一个请求,第一个4bit片段的延迟时间为10秒,而第二个4bit片段的延迟时间为3秒。但是,对于这种基于时间延迟的解决方案,不可靠的连接造成我们无法在亚秒(sub-second)范围内利用这种基于时间的技术,因为吸声掩盖了信号(指连接的延迟掩盖了查询响应的延迟)。另外,这些基于时间的方法虽然可以减少所需请求的总数量,但并未减少总的平均攻击时间。


延迟数据库查询,在查询中引入延迟并非SQL数据库的标准功能,每种数据库都有自己的引入延迟的技巧。 下面我们将分别介绍MySQL、PostgreSQL、SQL Server和Oracle引入延迟的技巧。


1.MySQL延迟


根据版本的不同,MySQL提供了两种方法来向查询中引入延迟。如果是5.0.12及之后的 版本,可以使用SLEEPO函数将查询暂停固定的秒数(必要时可以是微秒)。执行了SLEEP(4.17)的查询,它刚好运行了4.17秒,正如结果行所示。执行MySQL的SLEEPO函数,对于未包含SLEEPO函数的MySQL版本,可以使用BENCHMARKO函数复制SLEEPO图 数的行为,BENCHMARKO的函数原型为BENCHMARK(N,expression),其中expression为某个 SQL表达式,N是该表达式要重复执行的次数。BENCHMARK()函数与SLEEPO函数的主要差 别在于:BENCHMARKO函数向查询中引入了一个可变但非常显著的延迟,而SLEEPO函数则 强制产生一个固定的延迟。如果数据库运行在高负载下,那么 BENCHMARK()将执行得更加缓慢,但由于这一显著延迟变得更加突出而非减弱,因而在推断攻击中BENCHMARK()任然很有用。

分享: