SQL注入之时间注入攻击实验过程

目录

1 环境介绍

2 实验过程


本文采用的是《Web安全攻防渗透测试实战指南》提供的代码及数据库。

1 环境介绍

time.php

<?php
$con=mysqli_connect("localhost","root","qwer","security");
// 检测连接
if (mysqli_connect_errno())
{
	echo "连接失败: " . mysqli_connect_error();
}

$id = $_GET['id'];

if (preg_match("/union/i", $id)) {
	exit("<htm><body>no</body></html>");
}

$result = mysqli_query($con,"select * from users where `id`='".$id."'");

$row = mysqli_fetch_array($result);

if ($row) {
	exit("<htm><body>yes</body></html>");
}else{
	exit("<htm><body>no</body></html>");
}


?>

在时间注意注入页面中,程序获取GET参数ID,通过preg_ match判断参数ID中是否存在Union危险字符,然后将参数ID拼接到SQL语句中。从数据库中查询SQL语句,如果有结果,则返回yes,否则返回no。当访问该页面时,代码根据数据库查询结果返回yes或no,而不返回数据库中的任何数据,所以页面上只会显示yes或no,和Boolean注入不同的是,此处没有过滤sleep等字符,代码如上所示。

此处仍然可以用Boolean盲注或其他注入方法,下面用时间注入演示。当访问

id=1' and if (ord(substring(user(),1,1))=114,sleep(3),1)%23

时,执行的SQL语句为:

select * from users where `id`='1' and if (ord(substring(user(),1,1))=114,sleep(3),1) %23

由于user () 为root,root第一个字符  'r'  的ASCII值是114,所以SQL语句中if条件成立,执行sleep (3) ,页面会延迟3s,通过这种延迟即可判断SQL语句的执行结果。

数据表

2 实验过程

Burp Suite抓本地包教程:https://www.cnblogs.com/coderge/p/13684438.html

时间注入攻击的测试地址: http://192.168.1.101/four/4.2.2/time.php?id=1

访问该网址时,页面返回yes,在网址的后面加上一个单引号, 再次访问,页面返回no。这个结果与Boolean注入非常相似,本小节将介绍遇到这种情况时的另外一种注入方法——时间盲注。它与Boolean注入的不同之处在于,时间注入是利用sleep ()或benchmark ()等函数让MySQL的执行时间变长。时间盲注多与IF(expr1, expr2, expr3) 结合使用,此if语句含义是:如果expr1是TRUE,则IF ()的返回值为expr2;否则返回值则为expr3。所以判断数据库库名长度的语句应为:

if (length(database())>1,sleep(5),1)--+

上面这行语句的意思是,如果数据库库名的长度大于1,则MySQL查询休眠5秒,否则查询1。
而查询1的结果,大约只有几十毫秒,根据Burp Suite中页面的响应时间,可以判断条件是否正确,结果如图所示。


可以看出,页面的响应时间是5036毫秒,也就是5.036秒, 表明页面成功执行了sleep (5),所以长度是大于1的


我们尝试将判断数据库库名长度语句中的长度改为10,结果如下图所示。

可以看出,执行的时间是0.002秒,表明页面没有执行sleep (5),而是执行了select 1,所以数据库的库名长度大于10是错误的。通过多次测试,就可以得到数据库库名的长度。得出数据库库名长度后,我们开始查询数据库库名的第一位字母。查询语句跟Boolean盲注的类似,使用substr函数, 这时的语句应修改为:

if (substr(database(),1,1) ='s', sleep(5),1)

结果如图所示。

可以看出,程序延迟了5秒才返回,说明数据库库名的第一位字母是s, 依此类推即可得出完整的数据库的库名、表名、字段名和具体数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值