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

主页 > 技术笔记 >

延时注入测试

老规矩,先看测试代码
[PHP] 纯文本查看 复制代码
?
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
<?php
  header("Content-type:text/html;charset=utf-8");  //声明页面编码
  $id=$_GET['id']; //获取参数
  //---------------------------------------------连接数据库操作
  $dblink=mysql_connect("localhost","root","root") or die("数据库链接失败:").mysql_error();
  mysql_select_db("sqltest",$dblink);
  //-------------------------------------------------查询数据库操作
$sql="select * from news where id =".$id.""//构造查询语句
  echo "执行的SQL语句:<br/>".$sql."<br/>";
  $result=mysql_query($sql);  //执行语句
  //--------------------------------------------------处理数据操作
  // $results=mysql_fetch_row($result);
   $results=mysql_fetch_array($result);
  // mysql_fetch_array 返回关联+索引数组
  $num=mysql_num_rows($result); //返回数据的行数
  for ($i=0; $i < $num; $i++) {
    echo "id:".$results[id];
    echo " title:".$results[title];
    echo "<br />";
  }
  //-------------------------------------------返回受影响函数
  $aff_rows=mysql_affected_rows($dblink);  //返回上一个mysql_query影响的行数
  echo $aff_rows;
 
 ?>


这里我就不在讲解代码是怎么工作的了,我感觉我标注的已经够详细了。。。
OK,通过代码可以看到,我们在在POST前端给我们的数据的时候,并没有进行转义或者过滤,从而造成了注入的产生。
今天呢我们主要研究延时注入,有些人可能会问,延时注入耗时费劲,干嘛一定要用延时呢,事情是这样的,在有些程序中容错做的可能比较好,你用常规的检测方 法可以无法得到有用的数据,比如你输入 and 1=1 ,and 1=2 返回的页面是一样的,所以现在就用到了我们延时注入。
延时注入属于盲注的一种,今天我们是通过mysql做的实验,我们通过提交带有sleep函数的sql语句,通过页面响应时间判断数据是否存在。


如图,我们正常访问页面用时1.03秒 ,我们通过提交 “and sleep(2)” 让页面在延时2秒后 页面响应时间变为3.02秒,这就证明我们的sql语句被执行,此处存在注入。
延时注入大致分为四个步骤:
            1.我们首先需要查询数据的长度。
            2.取数据中的一位进行对比。
            3.通过页面响应时间判断2中的对比是否成立。
            4.重复2 3两步直至我们查到的数据长度。
在第二个步骤中进行对比大致有三种方式:
             1.直接对比。使用条件受限,存在单引号时无法使用。
             2.ascii对比。使用ascii函数对取出的数据与ascii表进行对比,较为常用,相对来说较为简单 ascii只存在十进制数字。
             3.hex对比。使用hex函数对取出的数据进行对比,较为繁琐,因为在hex中存在数字+字母。
三种查询方式如下图

简单说一下延时注入的语句: select if(ascii(mid(user(),1,1))=114,sleep(2),1);  该语句的意思为查询user()用户名截取第一个字符 然后跟114对比(114为r的ascii码),如果条件成立执行sleep(2)延时2秒,否则执行查询输出1,如果看不明白可以先去看看mysql的 基本函数。
//------------------------------------------------------------------------------------------------------------------------------------
言归正传,这里我们演示最为通用的ascii对比的方式。
首先我们确定该页面存在延时注入。延时注入的使用环境多为常规注入无法正常显示数据的情况下,由于时间问题我们就写容错,直接进行延时注入。
假设我们输入常规注入语句页面没有变化,带入“and sleep(2)”后页面响应时间出现明显变化,那么就基本可以确定这是一个延时注入。

首先我们用通过union查询字段长度。得到字段长度为2.

带入查询语句,我们首先需要知道我们想要得到数据的长度,这里我们以查询用户名为例。在我们猜测14时,if条件成立执行sleep函数,证明user的长度为14

知道了长度我们要做的就是猜解每一位是什么。通过mid函数取user的第一位进行对比,条件成立执行sleep函数,如图114为r的ascii码

通过反复操作上一个步骤,我们就可以得到完整的用户名。
附ASCII对照表:


最后说一下,现在有好多工具可以跑延时注入,这篇文章的目的只是为了普及原理 学习过程。
至于防护嘛还是要的输入的数据进行转义过滤,同时注意过滤的方式方法避免出现宽字节注入。

///--------------------------------------------------------------------------------------------------
最最后边的话,许多人问我是怎么学习的,怎么这么厉害,我只想说我也在学习,你我之间不是谁更厉害,而是谁更会学习。
(责任编辑:蜗蜗侠)