【安全】SQL注入-Timing Attack

真正的稳定,是自己不断成长,不断寻找新的空间。与其要稳定,不如开始拥抱这个变化的时代,让自己准备好。

写在前面

    注入攻击的本质-把用户输入的数据当做代码执行。关键条件是:用户能控制输入;原本程序要执行的代码,拼接了用户输入的数据。

WHAT - 什么是Timing Attack

    从字面单词组合理解来说,就是时间攻击,其实质是通过每次执行SQL的耗时来判断是否存在SQL注入漏洞,听起来不可思议,例如下面的例子:

UNION SELECT IF (SUBSTRING(current,1,1) = CHAR(97),BENCHMARK(5000000, md5( 'test' )),null) FROM (SELECT DATABASE() as current) as tb;

备注:
    该段SQL语句通过对结果时间的比较,来判断数据库名称的首字母是不是a,这样逐步判断就能猜出数据库名称。

HOW- Timing Attack中关键知识点

    1.BENCHMARK(count,expr) 函数执行的结果是将表达式expr执行count次,比如:
select benchmark( 5000000, md5( 'test' ) ); 返回结果是0,耗时1.157秒。

    2.SELECT if(expr1,expr2,expr3) 如果expr1的结果是TRUE,则返回expr2,否则返回expr3。

    3.SELECT database() as db; 获取当前连接的数据库名。其他函数比如system_user()获取当前系统用户,current_user()获取当前登录用户;last_insert_id()获取最后一次插入操作的事物ID。

    4. substring(str, pos, len) 返回字符串str,从pos位置开始,长度为len的字符串,注意这里起始值是1,比如
select substring('example.com', 4, 2); 结果是mp。

    5.UNION 连表查询,得到结果的去重结果,如果不去重,则使用UNION ALL。

推荐阅读更多精彩内容