SQL注入-时间盲注
0x01 前言
不知道写啥,那个...大家吃好喝好啊~
0x02 时间盲注
先上源代码
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
则返回
<ignore_js_op>
如果我们输入跟数据库里不匹配的项,则返回no
<ignore_js_op>
我们包含一下union
<ignore_js_op>
可以看到,是不是也返回no了啊?
这时候,我们就可以使用时间盲注了。
我们先来讲讲mysql有两个函数
sleep()
benchmark()
我们先去phpmyadmin测试一下
<ignore_js_op>
可以看到,我们这里是不是延迟了3秒啊,总共查询时间是3.0004秒,其中,我们让他休眠了3秒,查询用了0.0004秒
我们把延时3秒改为5秒试试
<ignore_js_op>
是不是用了5秒多,这就是sleep起到了作用
然后我们来讲讲benchmark()
在老版本当中benchmark的作用是,将一行命令执行多少次,比如执行一次需要1秒钟(当然用不到一秒钟,这里只是举例子)
刚才打算截图发生了个小插曲,我执行了100次,没啥区别,1000次还是区别不大,一怒之下9999999,然后...我到现在phpmyadmin还连不上,这儿就不截图了,有兴趣的可以自己搭环境试试。
<ignore_js_op>
<ignore_js_op>
那么我们回到实验环境
我们这里要用到火狐里的firebug插件,这里有个网络选项
<ignore_js_op>
我们来看看正常请求一个网站多长时间
<ignore_js_op>
是不是花了1秒钟左右啊?(旁白:要不是刚才给数据库玩卡了,需要1秒???)
我们来构造语句
1
|
111. php? name = admin' and sleep ( 5 ) % 23 |
<ignore_js_op>
是不是用了6秒,其中5秒是我们让他休眠的
有人问,是休眠了啊,那么有什么用呢?
这时我们可以构造语句了
1
|
http : / / 10.2 11.5 5.4 / 111. php? name = admin' and if ( substring ( user ( ) , 1 , 1 ) = 'r' , sleep ( 3 ) , 1 ) % 23 |
这里我们用if判断,如果user()第一个字母为r,则延时3秒
<ignore_js_op>
这里我们是不是延时了啊?
如果跟user()的首字母不同,那么不延时
<ignore_js_op>
下面我们判断第二个字符
<ignore_js_op>
就这样,我们可以成功注入出你想要的东西
【注】本文转自:https://bbs.ichunqiu.com/thread-16075-1-1.html