各种数据库中的时间延迟技术

本文从使用浏览器与Web应用进行交互这一视角来讨论发现SQL注入问题时所涉及的时间延迟技术。

测试应用程序是否存在SQL注入漏洞时,经常发现某一潜在的漏洞难以确认。这可能源于多种原因,但主要是因为Web应用未显示任何错误,因而无法检索任何数据。

对于这种情况,要想识别漏洞,可以向数据库注入时间延迟,并检查服务器的响应是否也已经产生了延迟。时间延迟是一种很强大的技术,Web服务器虽然可以隐藏错误或数据,但必须等待数据库返回结果,因此可用它来确认是否存在SQL注入。该技术尤其适合盲注。

Microsoft SQL Server服务器包含一条向查询引入延迟的内置命令:WAITFOR DELAY 'hours: minutes:seconds'。例如,向Victim公司的Web服务器发送下列请求,服务器的响应大概要花5秒:
 

http://www.victim.com/basket.aspx?uid=45;waitfor delay '0:0:5';-- 

服务器响应中的延迟使我们确信我们正在向后台数据库注入SQL代码。

MySQL数据库没有与WAITFOR DELAY等价的命令,但它可以使用执行时间很长的函数来引入延迟。BENCHMARK函数是很好的选择。MySQLBENCHMARK函数会将一个表达式执行许多次,它通常被用于评价MySQL执行表达式的速度。根据服务器工作负荷和计算资源的不同,数据库需要的时间也会有所不同。但如果延迟比较明显,也可使用该技术来识别漏洞。请看下面的例子:
 

mysql> SELECT BENCHMARK(10000000,ENCODE('hello','mom'));  
+----------------------------------------------+  
|   BENCHMARK(10000000,ENCODE('hello','mom'))               |  
+----------------------------------------------+  
|   0                                                                                                                                                                                   |  
+----------------------------------------------+  
1   row in set (3.65 sec)  

 

执行该查询花费了3.65秒。如果将这段代码注入SQL注入漏洞中,那么将延迟服务器的响应。如果想进一步延迟响应,只需增加迭代的次数即可,如下所示:
 

http://www.victim.com/display.php?id=32; SELECT  
BENCHMARK(10000000,ENCODE('hello','mom'));--  

Oracle PL/SQL中,可使用下列指令集创建延迟:

BEGIN  
DBMS_LOCK.SLEEP(5);  
END;  

DBMS_LOCK.SLEEP()函数可以让一个过程休眠很多秒,但使用该函数存在许多限制。首先,不能直接将该函数注入子查询中,因为Oracle不支持堆叠查询(stacked query)。其次,只有数据库管理员才能使用DBMS_LOCK包。

在Oracle PL/SQL中有一种更好的办法,可以使用下面的指令以内联方式注入延迟:

http://www.victim.com/display.php?id=32 or 1=dbms_pipe.receive_  
message('RDS', 10)  

DBMS_PIPE.RECEIVE_MESSAGE函数将为从RDS管道返回的数据等待10秒。默认情况下,允许以public权限执行该包。DBMS_LOCK.SLEEP()与之相反,它是一个可以用在SQL语句中的函数。

在最新版本的PostgreSQL数据库(8.2及以上版本)中,可以使用pg_sleep函数来引起延迟:
 

http://www.victim.com/display.php?id=32; SELECT pg_sleep(10);-- 

 

 

posted @ 2015-04-28 20:38  cyjay5un  阅读(7557)  评论(0编辑  收藏  举报