SQL注入攻击-利用UNION检索其他数据(上)
在学习本章前,建议先对前序章节进行了解,传送门如下:
本章节结合靶场试验来介绍如何利用UNION来对其他表进行检索。
如果在应用程序的响应中会返回SQL查询的结果,那么攻击者就可以利用SQL注入漏洞从数据库中的其他表中检索数据。
这种攻击方式是利用UNION关键字来完成的,UNION允许执行额外的SELECT查询并将结果附加到原始查询中。
例如如果应用程序执行下面包含用户输入"Gifts"的查询:
这会使得应用程序返回所有用户名、密码以及产品的名称和描述。
UNION关键字允许执行一个或多个附加SELECT查询,并将结果附加到原始查询中。
这条SQL查询将返回包含两列的单个结果集,其中包含table1中的a和b列以及table2中的c和d列的值。
但要使UNION查询正常工作,也必须满足两个关键要求:
◆从原始查询返回的哪些列具有合适的数据类型来保存注入查询的结果?
在进行SQL注入UNION攻击时,有两种方法可以确定从原始查询返回的列数。
利用ORDER BY子句递增指定的列索引,直到发生错误。
例如,假设注入点是原始查询的Where子句中的一个带引号的字符串,我们就可以提交:
这个附加的语句会修改原始查询,按查询结果以不同列对结果进行排序。ORDER BY子句中的列可以由索引指定,我们不需要知道任何列的名称。当指定的列索引超过查询结果中的实际列数时,数据库就会返回错误。
例如如果查询结果只有两列的话,当我们用第三列的索引进行排序的话,数据库就会返回下面这句错误:
在实际环境中,应用程序可能会在其HTTP响应中返回数据库错误,或者可能返回一般错误,或者是不返回任何结果。我们可以通过检测应用程序响应中的一些差异,来推断查询返回了多少列。
提交一系列UNION SELECT有效负载,指定不同数量的空值:
如果空值数与列数不匹配,则数据库可能会返回错误,或者只是返回一般错误或没有结果。当空值数与列数匹配时,数据库会在结果集中返回一个附加行,每列包含空值。
对生成的HTTP响应的影响取决于应用程序的代码,幸运的话我们会在响应中看到一些额外的内容,例如HTML表格上的额外行。空值也可能会触发不同的错误,例如NullPointerException。最坏的情况下,响应可能与不正确的空值数量引起的响应无法区分,从而使得这种确定列计数的方法无效。
●使用NULL作为UNION SELECT注入查询返回值的原因是每列中的数据类型必须在原始查询和注入查询之间兼容。由于NULL可以转换为每种常用的数据类型,因此使用NULL可以最大限度地提高在列计数正确时成功的机会。
●在Oracle中,每个SELECT查询都必须使用FROM关键字并指定一个有效的表。Oracle上有一个名为dual的内置表可以进行利用,因此Oracle上的注入查询通常如下:
●用来注释的双破折号--可以注释掉注入点之后的原始查询的其余部分。但在MySQL上,双破折号序列后面必须跟一个空格,或者直接使用井号#来进行注释。
https://portswigger.net/web-security/sql-injection/union-attacks/lab-determine-number-of-columns
这个场景试验包含一个SQL注入漏洞,由于查询的结果在应用程序中有返回,因此可以使用UNION攻击从其他表中检索数据。这种攻击的第一步是确定查询返回的列数,在后续的试验中多会用到这个攻击技术。
要解决这个试验,通过执行SQL注入UNION攻击来确定查询返回的列数,该攻击返回包含空值的附加行。
③
在Burp Suite中构造Payload,增加 '+UNION+SELECT+NULL--
服务器返回错误,说明UNION后面加的列数与查询返回的不一致
④
继续改造Payload,一个个增加NULL,直到服务器不再报错,而是返回所查询的语句
可以发现,增加到三个NULL的时候,服务器不再报错,说明此查询语句所查询的是三列,完成试验
/
/
/ /
/ /
标签: