技术笔记

延时注入测试

字号+ 作者:sn0w 来源:转载 2016-11-27 14:48 我要评论( )

老规矩,先看测试代码 [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:te......

老规矩,先看测试代码
[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对照表:


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

///--------------------------------------------------------------------------------------------------
最最后边的话,许多人问我是怎么学习的,怎么这么厉害,我只想说我也在学习,你我之间不是谁更厉害,而是谁更会学习。

本文来自: 蜗蜗侠's Blog-关注网络安全 http://blog.icxun.cn/Note/319.html

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 转大表哥安全狗SQL注入语句(176处)

    转大表哥安全狗SQL注入语句(176处)

    2017-12-05 13:47

  • Mysql注入点在limit关键字后面的利用方法

    Mysql注入点在limit关键字后面的利用方法

    2016-12-18 15:06

  • 一个罕见的MSSQL注入漏洞案例

    一个罕见的MSSQL注入漏洞案例

    2016-12-18 15:03

  • postgresql注入之文件读写

    postgresql注入之文件读写

    2016-12-13 15:25

网友点评
暂时未开启评论功能~