真正的稳定,是自己不断成长,不断寻找新的空间。与其要稳定,不如开始拥抱这个变化的时代,让自己准备好。
【写在前面】
注入攻击的本质-把用户输入的数据当做代码执行。关键条件是:用户能控制输入;原本程序要执行的代码,拼接了用户输入的数据。
【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。