蜗蜗侠's Blog-关注网络安全移动版

主页 > 技术笔记 >

SQL注入详解 第三集(时间盲注)

0x01  前言
    不知道写啥,那个...大家吃好喝好啊~

0x02  时间盲注
先上源代码
[AppleScript] 纯文本查看 复制代码
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
$con = mysqli_connect("localhost","root","root","test");
//检查连接
if(mysqli_connect_error())
{
    echo "数据库连接失败" . mysqli_connect_error();
}
 
$name = $_GET['name'];
if(preg_match("/union/i",$name))
{
    exit("<html><body>no</body></html>");
}
 
$result = mysqli_query($con,"select * from admin where name = '".$name."' ");
$row = mysqli_fetch_array($result);
 
if($row)
{
    exit("<html><body>yes</body></html>");
}
else
{
    exit("<html><body>no</body></html>");
}
?>

不同于之前,这里我们过滤了union,然后把获取到的name的值拼接到sql语句里。
因为union被过滤了,如果包含union,则直接返回no。所以不像前两节那样直接可以union select。而且我们这儿只回显yes和no。
当我们我们访问111.php?name=admin
则返回

如果我们输入跟数据库里不匹配的项,则返回no

我们包含一下union

可以看到,是不是也返回no了啊?

这时候,我们就可以使用时间盲注了。
我们先来讲讲mysql有两个函数
sleep()
benchmark()
我们先去phpmyadmin测试一下

可以看到,我们这里是不是延迟了3秒啊,总共查询时间是3.0004秒,其中,我们让他休眠了3秒,查询用了0.0004秒
我们把延时3秒改为5秒试试

是不是用了5秒多,这就是sleep起到了作用

然后我们来讲讲benchmark()
在老版本当中benchmark的作用是,将一行命令执行多少次,比如执行一次需要1秒钟(当然用不到一秒钟,这里只是举例子)
刚才打算截图发生了个小插曲,我执行了100次,没啥区别,1000次还是区别不大,一怒之下9999999,然后...我到现在phpmyadmin还连不上,这儿就不截图了,有兴趣的可以自己搭环境试试。




那么我们回到实验环境
我们这里要用到火狐里的firebug插件,这里有个网络选项

我们来看看正常请求一个网站多长时间

是不是花了1秒钟左右啊?(旁白:要不是刚才给数据库玩卡了,需要1秒???)
我们来构造语句
[AppleScript] 纯文本查看 复制代码
?
1
111.php?name=admin' and sleep(5) %23


是不是用了6秒,其中5秒是我们让他休眠的
有人问,是休眠了啊,那么有什么用呢?
这时我们可以构造语句了
[AppleScript] 纯文本查看 复制代码
?
1
http://10.211.55.4/111.php?name=admin' and if(substring(user(),1,1)='r',sleep(3),1) %23

这里我们用if判断,如果user()第一个字母为r,则延时3秒

这里我们是不是延时了啊?
如果跟user()的首字母不同,那么不延时

下面我们判断第二个字符

就这样,我们可以成功注入出你想要的东西
(责任编辑:蜗蜗侠)