所谓的盲注即是在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进行访问
1=1 返回正常 1=2返回不正常 证明存在sql注入 但是也没有报错
判断当前数据库的长度为4,返回正常
原理如下图,利用substr函数进行截取,一位一位进行ASCII码值的转换比较
同样的道理,猜解出ASCII码值依次为d,v,w,a 则数据库名为dvwa
需要注意的是一定要字段保持一致
分析一下该语句的意思,利用系统自带的数据库进行查询所有的表,条件是在dvwa这个数据库下
group_concat(table_name) 用来分组连接 影响不大
可以看到,效果是一样的
再进一步查询
现在有了数据库dvwa 表admin ,接下来查询数值
说明admin表中有三列
判断第一列username长度为5,第二列username长度为6,第二列username长度为5
利用limit还可以依次判断出password以及id
开始猜解每一个密码
依次猜解,第一列密码即id=1的密码为123456789
和猜解第一列不同的地方在于使用了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的注入来判断是否存在注入点
语句为: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错误信息回显出来
爆出数据库的用户信息
爆出数据库的版本
报错注入参考链接:
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';
}
*/
}
?>