vlambda博客
学习文章列表

SQL注入攻击-利用UNION检索其他数据(上)

在学习本章前,建议先对前序章节进行了解,传送门如下:

 
本章节结合靶场试验来介绍如何利用UNION来对其他表进行检索。
使用的靶机场景是portswigger里面提供的
https://portswigger.net
 

如何从其他数据库中检索数据?
如果在应用程序的响应中会返回SQL查询的结果,那么攻击者就可以利用SQL注入漏洞从数据库中的其他表中检索数据。
这种攻击方式是利用UNION关键字来完成的,UNION允许执行额外的SELECT查询并将结果附加到原始查询中。
例如如果应用程序执行下面包含用户输入"Gifts"的查询:

攻击者可以通过构造Payload提交如下输入:

SQL注入攻击-利用UNION检索其他数据(上)

这会使得应用程序返回所有用户名、密码以及产品的名称和描述。
 

UNION利用原理
UNION关键字允许执行一个或多个附加SELECT查询,并将结果附加到原始查询中。
例如下面这句SQL语句:

SQL注入攻击-利用UNION检索其他数据(上)

这条SQL查询将返回包含两列的单个结果集,其中包含table1中的ab列以及table2中的cd列的值。
但要使UNION查询正常工作,也必须满足两个关键要求:
●各个查询必须返回相同数量的列
●每列中的数据类型必须在各个查询之间兼容
因此如果要满足这两个条件,通常就涉及到要搞清楚:
◆原始查询返回了多少列?
◆从原始查询返回的哪些列具有合适的数据类型来保存注入查询的结果?
 

如何确定UNION攻击所需的列数?
在进行SQL注入UNION攻击时,有两种方法可以确定从原始查询返回的列数。
第一种方法:
利用ORDER BY子句递增指定的列索引,直到发生错误。
例如,假设注入点是原始查询的Where子句中的一个带引号的字符串,我们就可以提交:

SQL注入攻击-利用UNION检索其他数据(上)

这个附加的语句会修改原始查询,按查询结果以不同列对结果进行排序。ORDER BY子句中的列可以由索引指定,我们不需要知道任何列的名称。当指定的列索引超过查询结果中的实际列数时,数据库就会返回错误。
例如如果查询结果只有两列的话,当我们用第三列的索引进行排序的话,数据库就会返回下面这句错误:

SQL注入攻击-利用UNION检索其他数据(上)

在实际环境中,应用程序可能会在其HTTP响应中返回数据库错误,或者可能返回一般错误,或者是不返回任何结果。我们可以通过检测应用程序响应中的一些差异,来推断查询返回了多少列。
第二种方法:
提交一系列UNION SELECT有效负载,指定不同数量的空值:

SQL注入攻击-利用UNION检索其他数据(上)

如果空值数与列数不匹配,则数据库可能会返回错误,或者只是返回一般错误或没有结果。当空值数与列数匹配时,数据库会在结果集中返回一个附加行,每列包含空值。
对生成的HTTP响应的影响取决于应用程序的代码,幸运的话我们会在响应中看到一些额外的内容,例如HTML表格上的额外行。空值也可能会触发不同的错误,例如NullPointerException。最坏的情况下,响应可能与不正确的空值数量引起的响应无法区分,从而使得这种确定列计数的方法无效。
 

几个注意事项
●使用NULL作为UNION SELECT注入查询返回值的原因是每列中的数据类型必须在原始查询和注入查询之间兼容。由于NULL可以转换为每种常用的数据类型,因此使用NULL可以最大限度地提高在列计数正确时成功的机会。
●在Oracle中,每个SELECT查询都必须使用FROM关键字并指定一个有效的表。Oracle上有一个名为dual的内置表可以进行利用,因此Oracle上的注入查询通常如下:

SQL注入攻击-利用UNION检索其他数据(上)

●用来注释的双破折号--可以注释掉注入点之后的原始查询的其余部分。但在MySQL上,双破折号序列后面必须跟一个空格,或者直接使用井号#来进行注释。
 

场景试验:
https://portswigger.net/web-security/sql-injection/union-attacks/lab-determine-number-of-columns
场景说明:
这个场景试验包含一个SQL注入漏洞,由于查询的结果在应用程序中有返回,因此可以使用UNION攻击从其他表中检索数据。这种攻击的第一步是确定查询返回的列数,在后续的试验中多会用到这个攻击技术。
试验目的:
要解决这个试验,通过执行SQL注入UNION攻击来确定查询返回的列数,该攻击返回包含空值的附加行。
攻击过程:
Burp Suite设置成阻断模式

SQL注入攻击-利用UNION检索其他数据(上)

 
在页面中选择一个要搜索的类别

SQL注入攻击-利用UNION检索其他数据(上)

 
Burp Suite中构造Payload,增加 '+UNION+SELECT+NULL--

SQL注入攻击-利用UNION检索其他数据(上)

服务器返回错误,说明UNION后面加的列数与查询返回的不一致

SQL注入攻击-利用UNION检索其他数据(上)

 
继续改造Payload,一个个增加NULL,直到服务器不再报错,而是返回所查询的语句

SQL注入攻击-利用UNION检索其他数据(上)

可以发现,增加到三个NULL的时候,服务器不再报错,说明此查询语句所查询的是三列,完成试验



/




/ /
/ /