sql注入之盲注

所谓的盲注即是在sql注入后在前端没有出现报错信息,无法判断是否注入成功。所以需要盲注进行判断

盲注分为基于布尔型的注入,基于时间的注入,基于报错的注入

布尔型的盲注

实验源代码

header("Content-type:text/html;charset=utf-8");

if(isset($_GET['id']) && !empty($_GET['id'])){

$uid=$_GET['id'];

$con = mysql_connect('localhost', 'root', '');

mysql_select_db('dvwa', $con);

$sql = "select * from users where user_id='".$uid."'";//字符型注入

//$sql = "select * from users where user_id=".$uid;//整数型注入

echo $sql."


";

$query = mysql_query($sql, $con);

while($num = @mysql_fetch_array($query)){

echo $num['user']."
";

}

}

?>

注:代码是在dvwa的漏洞环境上进行的修改

保存为test1.php   利用wamp进行访问

sql注入之盲注_第1张图片
1=1  返回正常
sql注入之盲注_第2张图片
1=2  返回不正常

1=1 返回正常   1=2返回不正常  证明存在sql注入   但是也没有报错

sql注入之盲注_第3张图片
database

判断当前数据库的长度为4,返回正常

sql注入之盲注_第4张图片
ASCII 值为100

原理如下图,利用substr函数进行截取,一位一位进行ASCII码值的转换比较

sql注入之盲注_第5张图片
ASCII: d--------100
sql注入之盲注_第6张图片
ASCII:  v------118

同样的道理,猜解出ASCII码值依次为d,v,w,a   则数据库名为dvwa

爆出该数据库下所有表

需要注意的是一定要字段保持一致

报错
字段保持一致

分析一下该语句的意思,利用系统自带的数据库进行查询所有的表,条件是在dvwa这个数据库下

group_concat(table_name) 用来分组连接    影响不大

sql注入之盲注_第7张图片
效果一样

可以看到,效果是一样的

再进一步查询

sql注入之盲注_第8张图片
查询列名
看效果

现在有了数据库dvwa   表admin ,接下来查询数值

sql注入之盲注_第9张图片
3列

说明admin表中有三列

sql注入之盲注_第10张图片
username的长度为6

判断第一列username长度为5,第二列username长度为6,第二列username长度为5

利用limit还可以依次判断出password以及id

sql注入之盲注_第11张图片

开始猜解每一个密码

sql注入之盲注_第12张图片
第一位1
sql注入之盲注_第13张图片
第二位2

依次猜解,第一列密码即id=1的密码为123456789

sql注入之盲注_第14张图片
第二列第一位为a

和猜解第一列不同的地方在于使用了ascii码进行判断

ascii码表进行判断

97----------a、100----------d、109----------m 、105-----------i、110------------n

49-------------1、50--------------2、51---------------3、52---------------4、53---------------5、54---------------6

组合之后,第二列password的数据为admin123456

如此递归,查询出所有数据

时间型的注入

实验源代码

header("Content-type:text/html;charset=utf-8");

if(isset($_GET['id']) && !empty($_GET['id'])){

$uid=$_GET['id'];

$con = mysql_connect('localhost', 'root', '');

mysql_select_db('dvwa', $con);

$sql = "select * from users where user_id='".$uid."'";

echo $sql."";

$query = mysql_query($sql, $con);

while($num = @mysql_fetch_array($query)){

//echo $num['user']."
";

}

echo "sql inject exist";

}

?>

不管输入什么,不报错,一直显示sql inject exist

此时需要使用基于time的注入来判断是否存在注入点

sql注入之盲注_第15张图片
time注入

语句为:if(1=1,sleep(5),1)

1=1是恒成立,所以如果存在注入,语句带入数据库进行执行,则sleep 5秒,如果没有带入数据库执行1秒

基于此,判断是否存在注入

报错注入

实验源代码

header("Content-type:text/html;charset=utf-8");

if(isset($_GET['id']) && !empty($_GET['id'])){

$uid=$_GET['id'];

$con = mysql_connect('localhost', 'root', '');

mysql_select_db('dvwa', $con);

$sql = "select * from users where user_id='".$uid."'";

echo $sql."


";

$query = mysql_query($sql, $con);

while($num = @mysql_fetch_array($query)){

echo $num['user']."
";

}

echo mysql_error();

}

?>

输出mysql_error()函数 将mysql错误信息回显出来

sql注入之盲注_第16张图片
报错注入

爆出数据库的用户信息

报错

爆出数据库的版本

报错注入参考链接:

https://www.waitalone.cn/mysql-error-based-injection.html

以上所有源代码:

header("Content-type:text/html;charset=utf-8");

if(isset($_GET['id']) && !empty($_GET['id'])){

$uid=$_GET['id'];

$con = mysql_connect('localhost', 'root', '');

mysql_select_db('dvwa', $con);

$sql = "select * from users where user_id='".$uid."'";//字符型注入

//$sql = "select * from users where user_id=".$uid;//整数型注入

echo $sql."


";

$query = mysql_query($sql, $con);

while($num = @mysql_fetch_array($query)){

echo $num['user']."
";

}

//echo "sql inject exist";

echo mysql_error();

//以下代码可省略

/*if($num['user_id'] > 0){

echo "id:".$num['user_id'];

}else{

header($_SERVER['SERVER_PROTOCOL'].'404 Not Found');

echo 'id no exist';

}

*/

}

?>

你可能感兴趣的:(sql注入之盲注)