SQL注射联盟攻击
当应用程序容易受到SQL注入的影响,并且在应用程序的响应中返回查询结果时联盟
关键字可用于从数据库中的其他表中检索数据。这导致SQL注射联盟攻击。
这联盟
关键字使您可以执行一个或多个附加选择
查询并将结果附加到原始查询中。例如:
从Table1 Union中选择A,B选择C,D
此SQL查询将返回带有两个列的单个结果集,其中包含列中的值一个
和b
在表格1
和列C
和d
在table2
。
为一个联盟
查询工作,必须满足两个关键要求:
- 单个查询必须返回相同数量的列。
- 每列中的数据类型必须在单个查询之间兼容。
要进行SQL注射联盟攻击,您需要确保您的攻击满足这两个要求。这通常涉及弄清楚:
- 从原始查询返回了多少列?
- 从原始查询返回的哪些列具有合适的数据类型,可以保留注入的查询的结果?
确定SQL注射联盟攻击所需的列数
在执行SQL注入联盟攻击时,有两种有效的方法来确定原始查询中返回多少列。
第一种方法涉及注入一系列顺序
子句并增加指定的列索引,直到发生错误。例如,假设注射点是在在哪里
原始查询的条款,您将提交:
“按1--”订购2--订单3--订单3--等。
这一系列有效负载修改了原始查询,以通过结果集中的不同列订购结果。一列顺序
子句可以通过其索引指定,因此您不需要知道任何列的名称。当指定的列索引超过结果集中的实际列数时,数据库返回错误,例如:
按位置3的顺序不超出选择列表中项目数量的范围。
该应用程序实际上可能会在其HTTP响应中返回数据库错误,或者可能返回通用错误,或者简单地返回没有结果。只要您可以检测到应用程序响应的某些差异,您可以从查询中返回多少列。
第二种方法涉及提交一系列联盟选择
有效载荷指定不同数量的空值:
“联合选择null-”联合选择null,null--'联合选择null,null,null--等。
如果nulls的数量与列数不匹配,则数据库将返回错误,例如:
使用联合,相交或操作员除外的所有查询组合必须在其目标列表中具有相等数量的表达式。
同样,该应用程序实际上可能会返回此错误消息,或者可能只是返回通用错误或没有结果。当null数量与列数匹配时,数据库将在结果集中返回另一个行,其中包含每个列中的null值。对生成的HTTP响应的影响取决于应用程序的代码。如果幸运的话,您会在响应中看到一些其他内容,例如HTML表上的额外行。否则,零值可能会触发不同的错误,例如空指针异常
。最坏的情况,该响应可能与由不正确数量的零值引起的响应无法区分,这使得确定列计数无效的方法。
笔记
- 使用的原因
无效的
随着从注入的值返回的值选择
查询是,每列中的数据类型必须在原始查询和注入的查询之间兼容。自从无效的
使用使用的每种常用数据类型,使用无效的
当列计数正确时,有效载荷成功的机会最大化。 在甲骨文上,每个
选择
查询必须使用从
关键字并指定有效的表。Oracle上有一个内置表双重的
可用于此目的。因此,Oracle上的注射查询需要看起来像:'工会从双重选择null-
- 所描述的有效载荷使用双键评论序列
- -
评论注射点之后的原始查询的其余部分。在MySQL上,必须遵循双键序列。或者,哈希字符#
可以用来识别评论。
有关数据库特异性语法的更多详细信息,请参见SQL注入备忘单。
在SQL注射联盟攻击中找到具有有用数据类型的列
执行SQL注入联盟攻击的原因是能够从注射的查询中检索结果。通常,要检索的有趣数据将以字符串形式为字符串,因此您需要在原始查询结果中找到一个或多个列的数据类型或与字符串数据兼容。
已经确定了所需列的数量,您可以探测每列以测试是否可以通过提交一系列的字符串数据来持有字符串数据联盟选择
有效载荷依次将字符串值放入每一列。例如,如果查询返回四列,您将提交:
'联合选择“ a”,null,null,null--'联合选择null,'a',null,null - 'union select null,null,null,'a',null--'union select null,null,null,null,null,'一个' -
如果列的数据类型与字符串数据不兼容,则注入的查询将导致数据库错误,例如:
转换将VARCHAR值“ A”转换为数据类型INT时失败。
如果没有发生错误,并且应用程序的响应包含一些其他内容,包括注入的字符串值,则相关列适合检索字符串数据。
使用SQL注射联盟攻击检索有趣的数据
当您确定原始查询返回的列数并发现哪些列可以容纳字符串数据时,您可以检索有趣的数据。
假设:
- 原始查询返回两列,两列都可以容纳字符串数据。
- 注射点是一个引用的字符串
在哪里
条款。 - 该数据库包含一个称为的表
用户
与列用户名
和密码
。
在这种情况下,您可以检索用户
通过提交输入来表:
'联合选择用户的用户名,密码 -
当然,执行此攻击所需的关键信息是有一张名为用户
带有两列称为用户名
和密码
。没有这些信息,您将尝试猜测表和列的名称。实际上,所有现代数据库都提供了检查数据库结构的方法,以确定其包含哪些表和列。
阅读更多
在SQL注入攻击中检查数据库在单列中检索多个值
在前面的示例中,假设查询仅返回一个列。
您可以通过将值连接在一起,包括合适的分离器,使您可以区分合并值,从而在此单列中轻松地将多个值一起检索。例如,在Oracle上您可以提交输入:
'联合选择用户名||'〜'||用户的密码 -
这使用双管序列||
这是Oracle上的字符串串联操作员。注入的查询串联在一起用户名
和密码
田野,被〜
特点。
查询的结果将使您阅读所有用户名和密码,例如:
...管理员〜S3CURE WIENER〜PETER CARLOS〜MONTOYA ...
请注意,不同的数据库使用不同的语法来执行字符串串联。有关更多详细信息,请参阅SQL注入备忘单。