SQLi第3部分:带内,推断和带外SQL注入


SQL注入可以分为三大类:带内SQLi,推断SQLi和带外SQLi。在本文中,我们将研究这三种方法。

带内SQLi(经典SQLi)

带内SQL注入是SQL注入攻击中最常见和最容易利用的一种。当攻击者能够使用相同的通信通道发起攻击并收集结果时,就会发生带内SQL注入。

带内SQL注入最常见的两种类型是基于错误SQLi基于联合的SQLi

基于错误SQLi

基于错误的SQLi是一种带内SQL注入技术,它依赖于数据库服务器抛出的错误消息来获取有关数据库结构的信息。在某些情况下,仅基于错误的SQL注入就足以让攻击者枚举整个数据库。虽然错误在web应用程序的开发阶段非常有用,但是应该在活动站点上禁用它们,或者将它们记录到访问受限的文件中。

基于联合的SQLi

基于UNION的SQLi是一种带内SQL注入技术,它利用UNION SQL运算符将两个或多个SELECT语句的结果组合成一个结果,然后作为HTTP响应的一部分返回。

推理SQL注入

与带内SQLi不同,推理SQL注入可能需要更长的时间才能被攻击者利用,然而,它与任何其他形式的SQL注入一样危险。在推断SQLi攻击中,实际上没有数据通过web应用程序传输,攻击者将无法在带内看到攻击的结果(这就是为什么这种攻击通常被称为“blind SQL injection attacks相反,攻击者能够通过发送有效载荷,观察web应用程序的响应和数据库服务器的结果行为来重建数据库结构。

推断SQL注入的两种类型是基于盲布尔SQLi基于盲时间SQLi

基于布尔(基于内容)盲SQLi

基于布尔值的SQL注入是一种推理SQL注入技术,它依赖于向数据库发送SQL查询,该查询强制应用程序返回不同的结果,具体取决于查询返回的结果是真还是假。

根据结果的不同,HTTP响应中的内容将会改变,或者保持不变。这使得攻击者能够推断所使用的有效载荷是否返回了true或false,即使没有从数据库返回任何数据。这种攻击通常很慢(特别是在大型数据库上),因为攻击者需要逐个字符地枚举数据库。

基于时间的盲SQLi

基于时间的SQL注入是一种推断SQL注入技术,它依赖于向数据库发送SQL查询,该查询强制数据库在响应之前等待指定的时间量(以秒为单位)。响应时间将向攻击者指示查询的结果是真还是假。

根据结果,HTTP响应将延迟返回或立即返回。这使得攻击者能够推断所使用的有效载荷是否返回了true或false,即使没有从数据库返回任何数据。这种攻击通常很慢(特别是在大型数据库上),因为攻击者需要逐个字符地枚举数据库。

带外SQL注入

Out-of-band SQL injection不是很常见,主要是因为它依赖于web应用程序使用的数据库服务器上启用的功能。当攻击者无法使用相同的通道发起攻击并收集结果时,就会发生带外SQL注入。

带外技术为攻击者提供了基于时间的推断技术的替代方案,特别是如果服务器响应不是非常稳定(使得基于时间的推断攻击不可靠)。

带外SQLi技术依赖于数据库服务器发出DNS或HTTP请求以向攻击者传递数据的能力。Microsoft SQL Server的xp_dirtree命令,该命令可用于向攻击者控制的服务器发出DNS请求;Oracle数据库的UTL_HTTP包,该包可用于从SQL和PL/SQL向攻击者控制的服务器发送HTTP请求。