标签:
本文从使用浏览器与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函数是很好的选择。MySQL的BENCHMARK函数会将一个表达式执行许多次,它通常被用于评价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);--
标签:
原文地址:http://www.cnblogs.com/cyjaysun/p/4463979.html